/ #프로그래머스

[1단계][131128] 숫자짝꿍 풀이

문제

131128

for문을 돌려 풀면 풀릴듯하게 보이는 문제이지만 길이가 300만자리까지 될 수 있으므로 for문으로 매칭시면 최대 O(300만*300만) 이라는 시간복잡도를 가질 수 있어서 시간초과가 될 수 있습니다.

풀이

관점을 다르게 보면 됩니다. X와 Y를 기준으로 매칭을 할 것이 아니라 숫자 0 ~ 9를 매칭시키는 것입니다.

X와 Y는 0 ~ 9까지의 숫자로 이루어져 있습니다. 그러므로 문자열을 split하여 각각의 원소를 해쉬코드로 사용하여 count값을 구함으로써 X, Y 각각 10개의 해쉬테이블을 생성할 수 있습니다.

예를 들어 X = “3403”, Y = “13203” 이면

X_table = [1, 0, 0, 2, 1, 0, 0, 0, 0, 0]

Y_table = [1, 1, 1, 2, 0, 0, 0, 0, 0, 0]

가 됩니다.

여기에서 하나의 index를 기준으로 두 원소 중 count값이 적은 수만큼 index를 반복한 문자열의 배열인 matchTable을 생성할 수 있습니다.

matchTable = [“0”, “”, “”, “33”, “”, “”, “”, “”, “”, “”]

matchTable을 역순으로 합치게 되면 정답에 해당하는 “330”이 됩니다. 시간복잡도를 O(300만*3)으로 줄일 수 있습니다.

이것을 자바스크립트 코드로 나타내면 다음과 같습니다.

function solution(X, Y) {
    
    const yArr = Y.split('').reduce((arr, cur) => ++arr[+cur] && arr, Array(10).fill(0));
    const xArr = X.split('').reduce((arr, cur) => ++arr[+cur] && arr, Array(10).fill(0));
    
    return ( result = Array.from({length:10}, (_,i) => (9-i).toString().repeat(Math.min(yArr[9-i], xArr[9-i]))).join('') ) 
            ? result*1 ? result : "0" : "-1";
}

131128