본문 바로가기
Algorithm/문제 풀이

프로그래머스 - 봉인된 주문

by DooDuZ 2025. 2. 19.

참가 신청을 할까말까 하다 결국 안 했던 2025 프로그래머스 코드챌린지...의 2차 예선 문제입니다.

문제를 보고 26진수를 떠올릴 수 있고 진수 변환 방법만 알고있다면 쉽게 해결할 수 있습니다.

lv3 난이도에 비해 비교적 쉽게 나온 편에 속하는 것 같습니다.

 

크게 복잡하지 않아서 풀이를 간단하게 적어보면

금지된 주문을 이용해 적절한 n의 위치를 설정할 때 26진수 -> 10진수 변환이

재설정된 n을 다시 주문으로 변환할 때 10진수 -> 26진수 변환이 한 번씩 사용됩니다.

 

아래는 제출 코드입니다.

import java.util.*;

class Solution {
    
    char[] alp = new char[26];
    Map<Character, Integer> indexes = new HashMap<>();
    PriorityQueue<Long> pq = new PriorityQueue<>();
    
    public String solution(long n, String[] bans) {
        //26진수
        String answer = "";
        
        char start = 'a'; // 97
        
        for(int i = start; i < start + 26; i++){
            alp[i - start] = (char) i;
            indexes.put( (char) i, i - start);
        }
        
        for(String spell : bans){
            pq.add(getIndex(spell));
        }
        
        while(!pq.isEmpty() && pq.peek() <= n){
            n++;
            pq.poll();
        }
        
        return getSpell(n);
    }
    
    long getIndex(String spell){
        long index = 0L;
        int length = spell.length();
        
        for(int i = 0; i < length; i++){
            index += (long) Math.pow(26, length - (i + 1)) * (indexes.get(spell.charAt(i)) + 1);
            
        }
        
        return index;
    }
    
    String getSpell(long index){
        StringBuilder sb = new StringBuilder();
        index--;
        
        while(index >= 0){            
            int mod = (int) (index % 26);
            
            index /= 26;
            // 알파벳은 0-index를 사용하고 있으므로 -1
            index--;
            sb.append(alp[mod]);
        }
        
        sb.reverse();
        
        return sb.toString();
    }
}

 

여태 문자열/순서 문제를 다룰 때처럼 습관적으로 char 배열과 map을 사용했는데

지금보니 'a'=97로 고정값이므로 +- 연산만 사용해서 더 가볍게 구현할 수 있었겠다는 생각이 드네요.

'Algorithm > 문제 풀이' 카테고리의 다른 글

BOJ 3653 - 영화 수집  (0) 2024.07.30
BOJ 11726 - 2 x n 타일링  (0) 2024.06.17
BOJ 11834 - 홀짝  (0) 2024.06.09
BOJ 10868 - 최솟값  (0) 2024.06.04
BOJ 3080 - 아름다운 이름 [Java / Python]  (0) 2024.06.02