728x90
📌 문제
전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.
- 구조대 : 119
- 박준영 : 97 674 223
- 지영석 : 11 9552 4421
전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.
📌 제한사항
- phone_book의 길이는 1 이상 1,000,000 이하입니다.
- 각 전화번호의 길이는 1 이상 20 이하입니다.
- 같은 전화번호가 중복해서 들어있지 않습니다.
📌 입출력 예
📌 풀이
알아야 하는 것
- slice
구할 것
- 숫자의 정렬 같은 경우, 비교 함수를 넣지 않으면 1, 2, 3, 10 이 있을 때 1, 10, 2, 3 과 같은 순으로 정렬된다.
- 이유는 요소를 문자열로 변환한 후 UTF-16 코드 단위로 바뀌기 때문이다.
- 이번 문제에서는 정말 숫자의 크기대로 정렬하는 게 필요한 게 아니라, 비슷한 수끼리 정렬되어야 한다.
- 예를 들어 12, 123, 1235처럼. 첫 번째 예시를 sort하면 119, 1195524421, 97674223 순이 될 것이다.
- 정렬한 후 for문으로 하나씩 순회한다.
- 현재 순회하는 요소의 길이를 curNumLeng이라고 한다.
- 접두어인지 확인하려면 다음 요소를 볼 때, curNumLeng 만큼 잘랐을 때 현재 순회하는 요소와 자른 값이 같은지 보면 된다.
- 이 때 slice를 사용했다.
- 119, 1195524421가 있을 때 curNumLeng은 3이고, 다음 요소를 3만큼 자르면 119가 된다. 접두사가 맞다.
- 비교했을 때 같다면 false가 나오게 하고, for문을 다 돌아도 false가 없다면 true 를 반환하게 하면 된다.
function solution(phone_book) {
let answer = true;
let arrNum = [...phone_book];
arrNum.sort();
for (let i = 0; i < arrNum.length - 1; i++) {
let curNumLeng = arrNum[i].length;
let nextNum = arrNum[i + 1].slice(0, curNumLeng);
if (arrNum[i] === nextNum) {
return false;
}
}
return answer;
}
이 문제가 해시로 분리되어 있었는데 JS는 지원하지 않아 못 풀고 있었다.
그런데 풀어보니 문자열로 접근하게 되는데 풀이를 찾아 보니 객체로도 충분히 풀 수 있었다.
거의 똑같은데 객체로 어떻게 접근하냐가 중점인 거 같다. 코테 풀 때 왜 이렇게 객체를 잘 안 쓰게 되지?
function solution(phoneBook) {
const obj = {};
for (const num of phoneBook) {
obj[num] = true;
}
for (const num of phoneBook) {
for (let i = 1; i < num.length; i += 1) {
const prefix = num.slice(0, i);
if (obj[prefix]) return false;
}
}
return true;
}
728x90