[TIL] 프로그래머스 코테 : 숫자 짝꿍

gyulhana·2024년 5월 7일

도대체 1단계 문제인데 왜 정답률이 24퍼밖에 안 되지? 네 그럴 만한 이유가 있었습니다.
자칫 잘못 짜면 시간 초과하기 쉬운 로직과 엣지케이스들 때문에 그랬던 거 같음.

처음에는 말도 안 되는 방식으로 풀려고 했음

function solution(X, Y) {
    const XArr = X.split('');
    const YArr = Y.split('');
    
    const sameIndex = XArr.map((x) => {
        if (YArr.includes(x)) { // => Includes 모든 요소 탐색하기 때문에 시간 오래 걸림
            const index = YArr.indexOf(x); // => 모든 요소 탐색으로 시간 오래 소요
            YArr.splice(index, 1)
            return x
        }
    }).filter((e) => e).sort((a, b) => b - a);
    
    return sameIndex.length === 0 ? "-1" : Number(sameIndex.join('')).toString(); 
// => '000'같은 경우의 수를 처리하고자 했으나 
// string으로 답변을 반환하라고 한 이유는 숫자가 너무 커지는 경우를 방지하기 위해서로 다른 코드로 대체해야 함
}

아래는 새로운 코드

function solution(X, Y) {
  // [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]로 구성된 X와 Y를 위한 배열 생성
    const XCnt = Array(10).fill(0);
    const YCnt = Array(10).fill(0);
    
  // X와 Y를 반복문으로 순회하면서 i번째 인덱스에 해당하는 값의 카운트를 올려줌
    for (let i = 0; i < X.length; i++) {
        XCnt[X[i]]++;    
    }   
    
    for (let i = 0; i < Y.length; i++) {
        YCnt[Y[i]]++;
    }
    
  // XCnt와 YCnt를 순회하면서 공통으로 등장하는 값의 최소값을 찾음
  // 해당 조건을 통해서 한 쪽에 더 높은 빈도로 등장하는 수를 필터링할 수 있음
    const result = [];
    for (let i = 0; i < 10; i++) {
        const commonCnt = Math.min(XCnt[i], YCnt[i]);
      // repeat을 이용해서 여러번 등장하는 수를 여러 개 집어넣기
      // '22' '444' 이런 식으로
        result.push(i.toString().repeat(commonCnt));
    }
    
  // ['', '1', '', '33', '' ...] 이런 식으로 생긴 배열을 모두 join으로 합친 뒤
  // split으로 분리한 후 내림차순 정렬 후 다시 join
    const answer = result.join('').split('').sort((a, b) => b - a).join('');
    
  // 빈 스트링인 경우 -1 반환, '0'만 있는 경우 0 반환, 그 외 문자열 반환
    if (answer === '') return '-1';
    if (answer.match(/^0+$/)) return '0'
    return answer;
}
profile
친절한 하루를 선물하고 싶은 사람

0개의 댓글