algorithm/문제풀이

해시 > 전화번호 목록

yongfront 2024. 4. 10. 15:32
반응형
SMALL

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

includes()

 

includes()

includes() 메서드는 문자열 또는 배열에서 특정 값이 포함되어 있는지를 확인하는 데 사용됩니다. 이 메서드는 부울린(boolean) 값을 반환합니다. 문자열에서 사용 const str = 'Hello, World!'; console.log(str.

yongfront.tistory.com

또는


startsWith()

 

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중 포문을 돌리지 않아도 된다는게 솔직히 잘 이해가 안감

접두사 검사이기 때문에 정렬을 하면 효율적인 건 알겠음

 

 

728x90
반응형
LIST