Algorithm & 자료구조/알고리즘 w.JavaScript

[알고리즘 JS] 숫자 짝꿍 (프로그래머스 Lv.1)

프라이D 2023. 1. 2. 15:12

문제

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

 

프로그래머스

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

programmers.co.kr

  • 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/

  • 해시맵 풀이에 대한 힌트를 얻었음.