문제
https://school.programmers.co.kr/learn/courses/30/lessons/131128
- 3자리 이상의 두 정수 X,Y 에서 공통적으로 등장하면서 짝지어지는 수들을 가지고 만들 수 있는 가장 큰 정수를 리턴
풀이(정답)
function solution(X, Y) {
// 정답 문자열
let answer = '';
// 길이 10, 0으로 초기화된 두 배열
const hashX = new Array(10).fill(0);
const hashY = new Array(10).fill(0);
// 원본 문자열로 인덱스에 접근하여 갯수 카운팅
X.split('').forEach(item => hashX[item]++);
Y.split('').forEach(item => hashY[item]++);
// 배열 반복하며 겹치는 갯수만큼 answer 에 추가
hashX.forEach((x, i) => {
if (x && hashY[i]) {
answer += String(i).repeat(Math.min(hashX[i], hashY[i]));
}
});
// 공백이 아니면서 0으로만 이루어진 경우 0 리턴
if (answer !== '' && +answer === 0) return '0';
// 그 외에 정답 혹은 -1 리턴
return answer.length ? [...answer].reverse().join('') : '-1';
}
- 처음에는 조건을 숫자로 변환한 answer 문자열이 0인 경우에 (+answer === 0) '0'을 리턴하도록 했는데, 짝지어지는 숫자를 찾지 못해 answer가 공백인 경우 '-1' 을 리턴해야 하므로, 공백이 아니면서 0 인 경우 리턴하도록 조건을 수정해주었다.
풀이(오답)
function fail(X, Y) {
// 정답이 들어갈 배열
let answer = [];
// X 와 Y 를 배열화한 뒤 내림차순 정렬
const Xc = X.split('').sort((a, b) => b - a);
const Yc = Y.split('').sort((a, b) => b - a);
// 반복문을 돌면서 비교해주기 위해 길이가 더 긴 배열, 작은 배열로 나눔
const larger = Xc.length > Yc.length ? Xc : Yc;
const smaller = Xc.length <= Yc.length ? Xc : Yc;
// 포인터 변수 선언
let p1 = 0;
let p2 = 0;
// p1, p2 모두 배열을 끝까지 탐색하도록 반복문의 조건 설정
while (p1 < smaller.length && p2 < larger.length) {
// 같은 숫자가 나온 경우 포인터를 모두 이동한다.
if (smaller[p1] === larger[p2]) {
answer.push(smaller[p1]);
p1++;
p2++;
continue;
}
// 서로 다른 숫자인 경우
else {
// p2를 우선해서 돌리고, 마지막에 다다른 경우 p1을 움직인다.
if (p2 === larger.length - 1) p1++;
else p2++;
}
}
return answer;
}
- 투포인터를 사용하여 배열을 탐색하고 같은 값을 찾으려고 했다.
- 포인터로 두 배열을 비교하며 끝까지 이동시키는 것은 성공했는데, 마지막까지 값을 찾지 못했을 경우 이전으로 돌아가서 값을 찾지 않기 때문에 비교에 실패함.
- 두 배열 혹은 문자열에서 순서 상관 없이 겹치는 값이 있는지 판단하려면 해시맵을 사용하는 것이 훨씬 더 간편하다. 연속된 경우를 찾는게 아니라면 반복을 위해 정렬도 해야되고, 값을 찾지 못하면 다시 돌아가야 하기 때문에...
참고 풀이
https://chamdom.blog/pg1-131128/
- 해시맵 풀이에 대한 힌트를 얻었음.
'Algorithm & 자료구조 > 알고리즘 w.JavaScript' 카테고리의 다른 글
[알고리즘 JS] 햄버거 만들기 (프로그래머스 Lv.1) (3) | 2023.01.16 |
---|---|
[알고리즘 JS] 성격 유형 검사하기 (프로그래머스 Lv.1) (0) | 2023.01.15 |
[알고리즘 JS] 로또의 최고 순위와 최저 순위 (프로그래머스 Lv.1) (0) | 2022.11.16 |
[알고리즘 JS] 다트 게임 (프로그래머스 Lv.1) (0) | 2022.11.15 |
[알고리즘 JS] 쇠막대기 (Stack) (0) | 2022.09.24 |