자료구조 및 알고리즘/JavaScript Practice

[프로그래머스] 숫자 짝꿍

Ryomi 2025. 1. 1. 21:32
728x90
반응형

문제 설명

 

문제 분석

  • 두 정수 X, Y가 주어집니다.
  • X, Y에서 공통으로 나타나는 숫자를 사용하여 만들 수 있는 가장 큰 정수를 찾아야 합니다.
  • 공통된 숫자가 없다면 "-1", 공통된 숫자로 0밖에 만들 수 없다면 "0"을 반환합니다.

 

첫 번째 접근:  O(n * m)

function solution(X, Y) {
    let answer = ''
    let [xLength, yLength] = [X.length, Y.length]
    
    new Array(10).fill(0).forEach((_, i) => {
        X = X.replaceAll(9 - i, '')
        Y = Y.replaceAll(9 - i, '')
        
        const count1 = xLength - X.length
        const count2 = yLength - Y.length
        if(count1 > 0 && count2 > 0) 
            answer += String(9 - i).repeat(Math.min(count1, count2))
            
        xLength = X.length 
        yLength = Y.length
    })
    
    if(answer.length === 0) return '-1'
    return answer * 1 === 0 ? '0' : answer
}

 

  1. 문자열을 직접 수정하면서 진행합니다.
  2. 길이 차이를 이용한 카운팅합니다.

 

 

두 번째 접근: O(n * m)

function solution(X, Y) {
    let answer = ''
    
    new Array(10).fill(0).forEach((_, i) => {
        const count1 = X.length - X.replaceAll(9 - i, '').length
        const count2 = Y.length - Y.replaceAll(9 - i, '').length
        
        if(count1 > 0 && count2 > 0) 
            answer += (9 - i).toString().repeat(Math.min(count1, count2))
    })
    
    if(answer.length === 0) return '-1'
    return [...new Set(answer)].join('') === '0' ? '0' : answer
}

개선 사항

 

  1. 불변성 유지
    • 원본 문자열을 수정하지 않음
    • 각 반복마다 새로운 길이 계산
  2. 가독성 향상
    • 로직이 더 명확하고 이해하기 쉬움
    • 중간 변수 사용 최소화
  3. 메모리 효율성
    • 불필요한 중간 상태 저장 제거
    • 한 번의 순회로 결과 도출

 

728x90
반응형