알고리즘 이론 & 풀이/프로그래머스

프로그래머스 Lv.1 | 전화번호 목록 js

페블_ 2023. 8. 8. 15:11

문제

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

 

풀이

통과한 풀이

  1. sort()로 정렬을 하면 앞글자가 비슷한 것끼리 이웃에 위치하게 된다.
  2. ["119", "11923", "119763"] 처럼 아무리 접두어가 같은 게 여러 개 있어도 바로 인접한 요소가 자신을 접두어로 가진다면 return false를 하고 끝내면 되므로 i, i+1 만 비교하면 된다.
  3. for문을 돌려 i+1 범위가 넘치지 않게 phone_book.length -1 까지 검사하면서 [i + 1]이 [i]를 접두어로 가지는지 startsWith로 검사한다. 완전히 일치한다면 접두어가 아니게 되므로 일치하지 않는 것만 통과시킨다. 그리고 return false
  4. for문 돌아도 접두어가 없다면 마지막에 true 반환
function solution(phone_book) {
    phone_book.sort();
    for(let i = 0; i < phone_book.length - 1; i++) {
        if(phone_book[i + 1].startsWith(phone_book[i]) && phone_book[i + 1] !== phone_book[i]) {
            return false;
        }
    }
    return true;
}

(오 근데 지금 보니 중복된 전화번호가 없다고 하니까 startsWith 검사할 때 완전히 같은지까지는 검사 안해도 되네

이거 참고하시는 분 있다면 저 부분 빼도 통과하는 거 확인했으니까 빼도 됩니다)

 

시간 효율성에서 통과 못한 풀이

  1. 이중 for문을 돌며 본인을 제외한 요소를 검사해서, startsWith()로 접두어 여부를 검사한다. 자신과 완전히 같은 경우는 접두어가 될 수 없으므로 제외한다. 접두어가 맞다면 false를 반환한다.
  2. 모든 요소를 검사했다면 접두어가 되는 것이 없으므로 true를 반환한다.
for(let i = 0; i < phone_book.length; i++) {
	for(let k = 0; k < phone_book.length; k++) {
		if(i === k) continue;
		if (
        	phone_book[k].startsWith(phone_book[i]) &&
        	phone_book[i] !== phone_book[k]
      	)
        	return false;
}

return true;