참가 신청을 할까말까 하다 결국 안 했던 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 |