해시 > 전화번호 목록
https://school.programmers.co.kr/learn/courses/30/lessons/42577
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
includes()
includes() 메서드는 문자열 또는 배열에서 특정 값이 포함되어 있는지를 확인하는 데 사용됩니다. 이 메서드는 부울린(boolean) 값을 반환합니다. 문자열에서 사용 const str = 'Hello, World!'; console.log(str.
yongfront.tistory.com
또는
startsWith()
startsWith() 메서드는 JavaScript에 내장된 문자열 메서드입니다. 문자열이 특정 문자열로 시작하는지 여부를 판별하여 true 또는 false를 반환합니다. 구문: str.startsWith(searchString, position) searchString: str
yongfront.tistory.com
를 활용해 풀어내면 될 것 같았다
indexOf는 위치를 리턴하고 includes 는 포함 됐는지 체크이므로 더 적합하지 않음
startsWith()가 제일 적합하다고 볼 수 있는데
완전탐색 후 본인을 검사할 땐 그냥 지나치도록 continue 하고 같은 게 있으면 바로 false 리턴하게 하고
모든 검사가 다 이뤄져도 false 를 리턴 못하면 true 를 리턴하도록 했는데
역시 효율성 검사에서 실패
이건 몰르겠어서 GPT 씀
시간 복잡도가 O(n^2) 인데
멋지게 풀어내며 시간 복잡도를 O(n log n) 으로 만들어내는 것을 볼 수 있다
동시에 큰 현타가 찾아온다
일단 정렬을 통해 인접한 숫자들을 모아두고
거기서 조금이라도 수틀리면 false 를 리턴해서 함수를 종료하면서 시간효율도를 높이고
for 문도 2중이 아니라 1중으로 줄여서 복잡도를 최소화 함
완전탐색을 2중 for문을 쓰지 않고
for (let i = 0; i < book.length - 1; i++) 로 하면서
자기자신의 검사는 if (book[i + 1].startsWith(book[i])) 로 제외 함
시간 복잡도가 제곱 차이나 나니까
이건 꼭 기억해 둬야 함
근데 결국 해시로는 접근 안했음
해시로 접근하면 왠지 더 복잡했을 것 같은데
정렬을 해야만 2중 포문을 돌리지 않아도 된다는게 솔직히 잘 이해가 안감
접두사 검사이기 때문에 정렬을 하면 효율적인 건 알겠음