코딩 테스트/test_javaScript

[코딩테스트/javaScript] 숫자 짝꿍

ijooha 2025. 1. 25. 16:51

function solution(X, Y) {
    let result = [];
    let x = X.split('').sort((a,b) => b-a)
    let y = Y.split('').sort((a,b) => b-a)
    
    for (let i=0; i<x.length; i++) { //y가 x에 있으면
        let idx = y.indexOf(x[i])
        
        if (idx !== -1) {
            result.push(x[i])
            y.splice(idx, 1)
        }
    }
    
    if (result.length === 0) { //짝꿍이 없을 때
        return '-1'
    }
    
    return result.every((n) => n == 0) ? '0' : result.join('') //짝궁이 0만 있을 때
}

예시 다섯개는 다 통과했는데, 실행 시간이 너무 길어져서 통과를 못했다.

반복문을 비효율적으로 쓴 것 같다.

 

function solution(X, Y) {
    let result = [];
    let xCount = [];
    let yCount = [];
    
    for (let i=0; i<=9; i++) { // 9개의 배열 만들어줌
        xCount.push(0)
        yCount.push(0)
    }
    
    let xArr = X.split('')
    let yArr = Y.split('')

	//인덱스에 해당하는 수 count
	for (let k=0; k<xArr.length; k++) {
    	xCount[xArr[k]]++;
    }
    
    for (let l=0; l<yArr.length; l++) {
    	yCount[yArr[l]]++;
    }
    
    //둘 중 작은 수만 남기기
    let count = xCount.map((n, idx) => Math.min(n, yCount[idx]))
    
    //숫자 반환
    for (let j=9; j>=0; j--) {
        if (count[j] > 0) {
            result.push(j.toString().repeat(count[j]))
        }
    }
    
    if (result.length === 0) {
        return '-1'
    }
    
    if (result.every((n) => n == 0)) {
        return '0'
    }
    
    return result.join('')
}

애초에 9개의 0을 가진 배열을 만들어준 후, 숫자가 그 배열을 돌 때마다 그 인덱스를 counting 하도록 바꿔줬다.

그렇게 주어진 X, Y 문자열을 전부 순회하는 과정을 하나로 줄여줬다.

 

** 중간에 한번 오류가 나서 왜그런지 살펴봤는데, X를 배열로 변경하지 않고 forEach를 사용했다.

항상 어떤 타입인지 기억하고 확인하기로..