[프로그래머스 JavaScript] 숫자 짝꿍

DO YEON KIM·2023년 6월 23일
0

프로그래머스 Lv1

목록 보기
65/75


문제 링크


문제 설명

  • 두 정수 X, Y의 임의의 자리에서 공통으로 나타나는 정수 k(0 ≤ k ≤ 9)들을 이용하여 만들 수 있는 가장 큰 정수를 두 수의 짝꿍이라 합니다(단, 공통으로 나타나는 정수 중 서로 짝지을 수 있는 숫자만 사용합니다). X, Y의 짝꿍이 존재하지 않으면, 짝꿍은 -1입니다. X, Y의 짝꿍이 0으로만 구성되어 있다면, 짝꿍은 0입니다.

  • 예를 들어, X = 3403이고 Y = 13203이라면, X와 Y의 짝꿍은 X와 Y에서 공통으로 나타나는 3, 0, 3으로 만들 수 있는 가장 큰 정수인 330입니다. 다른 예시로 X = 5525이고 Y = 1255이면 X와 Y의 짝꿍은 X와 Y에서 공통으로 나타나는 2, 5, 5로 만들 수 있는 가장 큰 정수인 552입니다(X에는 5가 3개, Y에는 5가 2개 나타나므로 남는 5 한 개는 짝 지을 수 없습니다.)
    두 정수 X, Y가 주어졌을 때, X, Y의 짝꿍을 return하는 solution 함수를 완성해주세요.

제한사항

  • 3 ≤ X, Y의 길이(자릿수) ≤ 3,000,000입니다.
  • X, Y는 0으로 시작하지 않습니다.
  • X, Y의 짝꿍은 상당히 큰 정수일 수 있으므로, 문자열로 반환합니다.

처음 작성한 코드

function solution(X, Y) {
  let answer = "";
  let arr = [];

  X = X.split("").sort((a, b) => b - a); // X를 내림차순으로 정렬
  Y = Y.split("").sort((a, b) => b - a); // Y를 내림차순으로 정렬

  for (let i = 0; i < X.length; i++) {
    let num = X[i];

    if (Y.includes(num)) {
      // num이 Y에 존재한다면
      arr.push(num); // arr에 추가
      Y.splice(Y.indexOf(num), 1); // Y에서 해당 num 삭제

      if (num === "0") {
        // num이 0인 경우
        X.splice(X.lastIndexOf(num), 1); // X에서 해당 num 삭제
      }
    }
  }

  if (arr.length === 0) {
    // arr에 아무 값도 없다면
    return "-1"; // -1 반환
  }

  // arr의 원소들을 문자열로 결합하여 반환
  return arr.sort((a, b) => b - a).join("");
}

..완벽하다고 생각했는데 코드는 맞게 실행됐지만 채점할 때엔 런타임 에러가 났다. 시간 복잡도를 단축할 필요가 있었다.

채점 결과
정확성: 57.9
합계: 57.9 / 100.0
반올림해서 100점으로 만들어주면 좋겠다. 하지만 그런 일은 일어나지 않으니 다시 풀어야한다.


두 번째 풀이

function solution(X, Y) {
  const arrX = new Array(10).fill(0); 
  const arrY = new Array(10).fill(0); 

  for (let i = 0; i < X.length; i++) {
    arrX[parseInt(X[i])]++;
  }

  for (let i = 0; i < Y.length; i++) {
    arrY[parseInt(Y[i])]++;
  }

  let answer = "";
  let NoZero = false;

  for (let i = 9; i >= 0; i--) {
    const count = Math.min(arrX[i], arrY[i]);

    if (count > 0) {
      answer += i.toString().repeat(count);
      if (i > 0) NoZero = true;
    }
  }

  if (answer.length === 0) return "-1";
  if (!NoZero) return "0";

  return answer;
}
  1. arrX와 arrY 배열을 생성한다. 0부터 9까지의 인덱스를 갖는 배열을 생성하고, 각 숫자의 빈도수를 저장하기 위한 배열 arrX와 arrY를 생성. 초기값은 모두 0으로 설정

  2. X와 Y의 빈도수를 계산한다. 반복문을 통해 X와 Y의 각 자리 숫자를 파싱하여 해당 숫자의 빈도수를 증가시킵니다. 이를 통해 arrX와 arrY에 숫자의 등장 횟수가 저장됩니다.

  3. answer와 NoZero 변수를 초기화한다. 숫자 0을 제외한 다른 숫자가 있는지 여부를 판단하기 위한 변수인 NoZero를 false로 초기화합니다.

  4. 역순으로 공통 숫자 확인: 9부터 0까지의 역순으로 반복하면서, arrX와 arrY에서 해당 숫자의 등장 횟수를 비교하여 공통으로 나타나는 숫자의 최대 개수를 계산한다. (사실 이부분은 챗지피티의 도움을 받았다)

  5. 공통 숫자를 추가한다. 최대 공통 개수(count)가 0보다 크면, i를 문자열로 변환한 후 최대 공통 개수만큼 반복하여 answer에 추가한다. 이때, 숫자 0은 0이 여러 개 나타날 수 있으므로, 0을 제외한 다른 숫자가 등장했는지 여부를 NoZero 변수로 확인.

  6. answer의 길이가 0인 경우에는 공통 숫자가 없으므로 "-1"을 반환. 또한, NoZero가 false인 경우에는 0만 등장한 경우이므로 "0"을 반환.

profile
프론트엔드 개발자를 향해서

0개의 댓글