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

Janet·2023년 3월 5일
0

Algorithm

목록 보기
53/314

문제 설명

두 정수 XY의 임의의 자리에서 공통으로 나타나는 정수 k(0 ≤ k ≤ 9)들을 이용하여 만들 수 있는 가장 큰 정수를 두 수의 짝꿍이라 합니다(단, 공통으로 나타나는 정수 중 서로 짝지을 수 있는 숫자만 사용합니다). XY의 짝꿍이 존재하지 않으면, 짝꿍은 -1입니다. XY의 짝꿍이 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 한 개는 짝 지을 수 없습니다.)두 정수 XY가 주어졌을 때, XY의 짝꿍을 return하는 solution 함수를 완성해주세요.

제한사항

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

입출력 예

XYresult
"100""2345""-1"
"100""203045""0"
"100""123450""10"
"12321""42531""321"
"5525""1255""552"

입출력 예 설명

입출력 예 #1

  • XY의 짝꿍은 존재하지 않습니다. 따라서 "-1"을 return합니다.

입출력 예 #2

  • XY의 공통된 숫자는 0으로만 구성되어 있기 때문에, 두 수의 짝꿍은 정수 0입니다. 따라서 "0"을 return합니다.

입출력 예 #3

  • XY의 짝꿍은 10이므로, "10"을 return합니다.

입출력 예 #4

  • XY의 짝꿍은 321입니다. 따라서 "321"을 return합니다.

입출력 예 #5

  • 지문에 설명된 예시와 같습니다.

문제풀이

💡 문제풀이 과정

  • 두 정수 X와 Y를 배열 형태로 바꾸고 for() 반복문과 filter() 함수를 이용하였다.
    • 참고로 filter()는 주어진 함수의 테스트를 통과하는 모든 요소를 모아 새로운 배열로 반환한다.
  • 처음에는 for()를 통해 X와 Y의 문자열을 서로 비교하여 공통된 요소를 새로운 배열에 담아 sort()로 내림차순하면 간단하겠지 생각한 문제였으나, 생각보다 복잡하다. 아래 풀이는 X,Y자체를 서로 비교하지 않았고 for() 반복문의 i라는 정수와 배열화된 X, Y를 각각 비교하고 그 둘의 배열의 길이의 최소값을 irepeat()하고… 🤯
  • answer가 비어있으면 (answer가 === “”)이면 ‘-1’을 리턴하고, answer가 숫자 0이면 ‘-1’을 리턴한다. 마지막으로 문자열 answer를 split(””) 혹은 spread operator를 사용하여 배열형태로 바꾸어 sort()를 통해 내림차순하여 가장 큰 수로 정렬하고 다시 join(””)로 문자열로 되돌린 다음 리턴한다.
function solution(X, Y) {
  let answer = "";
  for (let i = 0; i < 10; i++) {
    const xx = [...X].filter((n) => Number(n) === i).length;
    const yy = [...Y].filter((n) => Number(n) === i).length;
    answer += String(i).repeat(Math.min(xx, yy));
  }
  if (answer === "") return "-1";
  if (Number(answer) === 0) return "0";
  return [...answer].sort((a, b) => b - a).join("");
}
profile
😸

0개의 댓글