프로그래머스 숫자 짝꿍 자바스크립트

버건디·2023년 6월 23일
0

프로그래머스

목록 보기
49/66
post-thumbnail

문제 링크


- 내 풀이

function solution(X, Y) {
  let splitX = X.split("");
  let splitY = Y.split("");
  let answer = [];

  let xMap = new Map();
  let yMap = new Map();

  for (let i = 0; i < splitX.length; i++) {
    xMap.set(splitX[i], xMap.get(splitX[i]) + 1 || 1);
  }

  for (let i = 0; i < splitY.length; i++) {
    yMap.set(splitY[i], yMap.get(splitY[i]) + 1 || 1);
  }

  xMap.forEach((value, key) => {
    if (value > 0 && yMap.get(key) > 0) {
      while (value !== 0 && yMap.get(key) !== 0) {
        answer.push(Number(key));
        value--;
        yMap.set(key, yMap.get(key) - 1);
      }
    }
  });

  if (answer.length === 0) {
    return "-1";
  } else {
    answer = answer.sort((a, b) => b - a).join("");
    answer = Number(answer);
    answer = answer.toString();

    return answer;
  }
}

시간초과를 우려해서 Map 객체를 통해서 풀었는데, 테케 6부터 15까지 실패가 떴다.

질문을 남겼는데, 범위를 벗어나는 숫자가 있어서 아마 오류가 나는 것 같다고 감사하게도 답변을 주셨다.

sort 함수 자체에서 각각 문자를 숫자형변환을 시켜서 비교주었고,

X가 "10002" 이고 Y가 "500060" 일때 답은 "0"이 나와야하는데, 위의 코드는 "000"이 나온다.

그렇기때문에 "0" 갯수를 세주어서 2개 이상일때 아예 "0"으로 처리해주었다.

- 수정 코드

function solution(X, Y) {
  let splitX = X.split("");
  let splitY = Y.split("");
  let answer = [];

  let xMap = new Map();
  let yMap = new Map();

  // X 문자 갯수 세주기
  for (let i = 0; i < splitX.length; i++) {
    xMap.set(splitX[i], xMap.get(splitX[i]) + 1 || 1);
  }

  // Y 문자 갯수 세주기
  for (let i = 0; i < splitY.length; i++) {
    yMap.set(splitY[i], yMap.get(splitY[i]) + 1 || 1);
  }

  // xMap 반복문을 돌면서, 둘다 key 에 해당하는 value 가 0 이상이면, 
  // 둘중에 하나라도 value 값이 0이 될때까지 값을 빼주면서 answer 배열에 넣어준다. 
  xMap.forEach((value, key) => {
    if (value > 0 && yMap.get(key) > 0) {
      while (value !== 0 && yMap.get(key) !== 0) {
        answer.push(key);
        value--;
        yMap.set(key, yMap.get(key) - 1);
      }
    }
  });

  if (answer.length === 0) {
    return "-1";
  } else {
    answer = answer.sort((a, b) => Number(b) - Number(a));
    // 0 갯수 세주기
    let filterZeroNum = answer.filter((str) => str === "0").length;
    answer = answer.join("");

    if (answer[0] === "0" && filterZeroNum > 1) {
      return "0";
    } else {
      return answer;
    }
  }
}
profile
https://brgndy.me/ 로 옮기는 중입니다 :)

0개의 댓글

관련 채용 정보