포스트

2021-10-16-TIL

프로그래머스 백엔드 데브매칭 후기

데브매칭의 4문제의 유형과 수준은 상반기와 차이가 거의 없다. 문자열 조작하는 구현문제, 날짜를 계산하지만 모든 경우를 구해보는 완전탐색 문제, 이차원 행렬이 주어지고 DFS로 연결된 부분을 확인하는 문제, SQL까지 총 4문제가 나왔다. SQL은 바로 풀고, 문자열을 조작하는 문제에서는 Map을 사용하여 Key로 한번, Value로 한번 정렬하려다가 포기하고 Comparable을 구현하는 내부클래스를 정의하고 compareTo메서드를 오버라이드해서 두 가지의 기준으로 정렬하여 간단히 해결하였다. 문제는 세 번째 문제를 제대로 읽지 못해서 시작하는 날짜를 월요일에서 금요일까지 모두 다 점검해야하는 줄 알았다. 그렇게되면 경우의 수가 너무 많아서 골치아픈 일이었다. 하지만 마지막 쯤에 그럴필요가 없다는 것을 깨달았다. 하지만 이미 2문제만 제출한 상황.. 아쉽지만 다음 기회를 노려야겠다. 10개나 되는 기업에 동시에 지원한 기회였는데 아쉽다.


두 기준으로 정렬하기

문자열 문제에서 쓴 방법을 정리해 둔다. Comparable의 compareTo는 자신이 비교 대상보다 작으면 음수, 같으면 0, 크면 양수를 돌려주는 규칙을 따른다. 이것으로 정한 순서를 그 클래스의 자연 순서(natural ordering)라고 부르고, Collections.sort나 Arrays.sort가 별도 비교자 없이 이 순서로 정렬한다. 두 가지 기준으로 정렬하려면 첫 번째 기준이 같을 때만 두 번째 기준을 비교하면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
class Entry implements Comparable<Entry> {
    String name;
    int count;

    @Override
    public int compareTo(Entry o) {
        if (count != o.count) {
            return Integer.compare(o.count, count); // 개수 내림차순
        }
        return name.compareTo(o.name);              // 같으면 이름 오름차순
    }
}

뺄셈(o.count - count)으로 비교하면 값이 클 때 오버플로가 날 수 있어서 Integer.compare를 쓰는 편이 안전하다. 자바 8 이후라면 Comparator.comparing(...).thenComparing(...)으로 같은 정렬을 클래스 밖에서 정의할 수도 있다.


Java

ConcurrentMap

ConcurrentHashMap은 여러 스레드가 동시에 쓰는 상황을 위한 Map 구현체다. 조회(get)는 대체로 블로킹하지 않아서 수정 작업과 겹쳐서 실행될 수 있다. Hashtable처럼 키와 값에 null을 허용하지 않는다는 점이 HashMap과 다르다.

동시성 환경에서는 “없으면 넣기”를 containsKey와 put 두 번의 호출로 나누면 그 사이에 다른 스레드가 끼어들 수 있다. ConcurrentHashMap은 이런 복합 연산을 원자적으로 처리하는 putIfAbsent, computeIfAbsent, merge 같은 메서드를 제공한다.

1
2
ConcurrentMap<String, Integer> counts = new ConcurrentHashMap<>();
counts.merge(word, 1, Integer::sum); // 단어 수 세기를 원자적으로
  • https://devlog-wjdrbs96.tistory.com/269

Map Sort

Map을 값 기준으로 정렬하려면 entrySet()을 리스트나 스트림으로 꺼낸 뒤 Map.Entry.comparingByValue()로 정렬한다. 키 기준은 comparingByKey()이고, 둘 다 자바 8부터 있다. 내림차순은 comparingByValue(Comparator.reverseOrder())처럼 비교자를 넘긴다.

1
2
List<Map.Entry<String, Integer>> entries = new ArrayList<>(map.entrySet());
entries.sort(Map.Entry.comparingByValue(Comparator.reverseOrder()));
  • https://junghn.tistory.com/entry/JAVA-Map%EC%97%90%EC%84%9C-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC-%EA%B0%92Value%EA%B8%B0%EC%A4%80%EC%9C%BC%EB%A1%9C-%EC%A0%95%EB%A0%AC%EB%B0%A9%EB%B2%95-%EC%98%A4%EB%A6%84%EC%B0%A8%EC%88%9C-%EB%82%B4%EB%A6%BC%EC%B0%A8%EC%88%9C
참고한 자료외부 출처 3

외부 출처

이 글은 저작권자의 CC BY 4.0 라이선스를 따릅니다.

댓글

아직 댓글이 없습니다