leebaek

[프로그래머스 Lv3] 봉인된 주문 - Javascript 풀이 본문

PS/프로그래머스_PS

[프로그래머스 Lv3] 봉인된 주문 - Javascript 풀이

leebaek 2025. 11. 13. 20:03

https://school.programmers.co.kr/learn/courses/30/lessons/389481

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


문제

소문자 알파벳으로 이루어진 n번째 문자열을 구하는 문제

 

생각

단순히 문자열을 늘려가며 세는 방식으로 풀려고 하면

26^11로 엄청 긴 문자열이기 때문에 절대 구할 수 없다.

 

그래서 문자열을 숫자로 바꾸는 방식,

26진수처럼 처리하는 방식을 떠올렸다.

 

문제풀이

bans의 문자열을 숫자로 변환시킨다.

- charCodeAt()를 사용해 해당 문자의 숫자값(유니코드)을 알아낸다.

 

n보다 작은 숫자들을 구하고,

건너뛴 숫자만큼 n값에 더해준다.

 

숫자를 문자열로 변환시킨다.

- fromCharCode()를 사용해 해당 숫자의 문자를 알아낸다.

 

코드

function solution(n, bans) {
    // 문자열을 숫자 인덱스로 변환 (a=1, b=2, …)
    const strToNum = (str) => {
        let num = 0;
        for (let ch of str) {
            num = num * 26 + (ch.charCodeAt(0) - 'a'.charCodeAt(0) + 1);
        }
        return num;
    };

    // 숫자 인덱스를 문자열로 변환
    const numToStr = (idx) => {
        let s = "";
        
        while (idx > 0) {
            let rem = (idx - 1) % 26;
            s = String.fromCharCode('a'.charCodeAt(0) + rem) + s;
            idx = Math.floor((idx - 1) / 26);
        }
        return s;
    };

    // bans를 숫자 인덱스로 변환하고 정렬
    const banNums = bans.map(strToNum).sort((a, b) => a - b);

    let target = n;
    for (let bn of banNums) {
        if (bn <= target) {
            target++;
        } else {
            break;
        }
    }

    return numToStr(target);
}