[코테] 전화번호 목록 (해시)

ekil·2026년 3월 27일

코딩테스트

목록 보기
3/15

전화번호 목록 (해시)

2026.3.27.

https://school.programmers.co.kr/learn/courses/30/lessons/42577

핵심 개념

내 풀이

function solution(phone_book) {
    const sorted = phone_book.sort();
    
    for (let i = 0; i < sorted.length; i++) {
        if (i === sorted.length -1 ) return true;
        
        if (sorted[i].length < sorted[i + 1].length) {
            if (sorted[i + 1].startsWith(sorted[i])) {
                return false;
            } else continue;
        } else {
            if (sorted[i].startsWith(sorted[i + 1])) {
                return false;
            } else continue;
        }
    }
}

개선된 풀이

function solution(phoneBook) {
    const sorted = phoneBook.sort();
    
    for (let i = 0; i < sorted.length - 1; i++) {
        if (sorted[i + 1].startsWith(sorted[i])) {
            return false;
        }
    }
    return true;
}
  • for문 내부 if문 다음에 continue를 넣었었는데, 지금 코드에선 어차피 루프 내 코드의 마지막 줄이라 건너뛰고 다음 루프로 넘어가라고 따로 지시할 필요 없음! 어차피 그렇게 동작할 것이기 때문.

핵심 차이

  1. sort로 정렬하면 길이도 작은순으로 정렬돼서 sorted[i]sorted[i+1]의 길이를 비교할 필요가 없음. 먼저 놓인 요소가 항상 뒤에 놓인 요소보다 길이가 짧을 것으로 가정해도 무방함.
    (문자열 비교로 인해 길이가 앞이 더 긴 경우에는 논리적으로 접두어가 될 수 없으므로 고려하지 않아도 된다)
  2. sorted.length -1 까지 반복문을 돌리면 얼리 리턴 코드가 없어도 동일하게 동작함

막혔던 포인트

  1. 해시가 뭐지? 어떻게 활용하라는 의도일까?
    이 문제에서 해시를 적용하는 방향을 찾지 못함
    배열, 문자열 메서드는 좀 아니까 고민하다보니 풀렸음

  2. 정렬할 때 길이를 먼저 비교해야 할까, 알파벳을 먼저 비교해야 할까 고민했는데, 그럴 필요 없었던 게 sort는 내부적으로 둘 다 비교해서 정렬함.
    sort() 기본 정렬: 사전순 정렬 - 문자 하나씩 앞에서부터 비교 & 길이가 짧은 게 앞에 놓임

풀면서 찾은 개념

  • 배열 sort() 메서드, 문자열 includes(), startsWith() 메서드
  • 정렬할 때 문자열이라 숫자로 변환해야 하나 고민했는데, 동일한 문자열로 시작하는지만 체크하면 되는거라 그부분은 고려할 필요가 없으니 단순하게 sort만 사용함
  • 처음엔 includes를 쓰려 했는데 (지난번 for ... in, for ... of처럼 계속 Dart랑 JavaScript 중에 다트 문법이 먼저 생각나는 이슈로 contains부터 떠올리긴 함) 좀더 생각해보니 어디에든 포함하는 걸 체크하는 게 아니라 '접두'어인지 체크하는 거라서, startsWith && 정렬을 떠올림

다음에 비슷한 문제 만나면

  1. '접두어/포함 관계 체크' 문제가 나오면 정렬 먼저 떠올리기: 정렬하면 관계 있는 것들이 인접하게 붙음
  2. 정렬 후 인접한 두 요소만 비교하면 되므로, for i < length - 1 + startsWith 패턴 사용
  3. sort() 기본 정렬은 사전순이어서 접두어 관계 체크엔 충분. 길이를 따로 비교할 필요 없음

특이점. 힌트없이 풀었다!

profile
좋아하는 일을 잘함으로써 먹고살고 싶은 프론트엔드 개발자입니다.

0개의 댓글