주어진 문자열 s의 각 알파벳을 index 만큼 뒤로 바꾼 s 를 출력하면 되는 문제이다. 단, skip 에 포함되어 있는 알파벳은 건너뛰어야 하며 z 를 넘어갈 경우에는 다시 a 로 돌아와서 순회하면 되는 문제이다.
일단 이해하는데는 크게 어려운 점은 없었다. z 를 넘어갈 경우 다시 a 로 돌아온다는 문자을 보고 Queue 를 활용하면 쉽게 풀 수 있을것 같다고 생각해 문제에 적용하였다.
또 skip 에 포함되어 있는지 확인하기 위해서 String 에 contains() 메서드를 사용하면 된다.
이를 코드에 적용하면 다음과 같다.
import java.util.*;
import java.io.*;
class Solution {
public String solution(String s, String skip, int index) {
StringBuilder sb = new StringBuilder();
Queue<Character> queue = new LinkedList();
for (int i = 0; i < 26; i++) {
queue.add((char) (i + 97));
}
for (int i = 0; i < s.length(); i++) {
char alphabat = s.charAt(i);
int count = index;
while (true) {
if (queue.peek() == alphabat) {
char c = ' ';
queue.add(queue.poll());
while (count != 0) {
c = queue.poll();
if (!skip.contains(String.valueOf(c))) {
count--;
}
queue.add(c);
}
sb.append(c);
break;
} else {
char poll = queue.poll();
queue.add(poll);
}
}
}
return sb.toString();
}
}
물론 통과 되기는 하지만 시간에서 약간 불만족스럽다. 그래서 다른 분들의 풀이를 보니 이렇게 푸는 것이 더 좋은것 같다고 생각해서 참고해보았다. 오히려 Queue를 사용하는 것이 독이된 것 같았다.
import java.util.*;
import java.io.*;
class Solution {
public String solution(String s, String skip, int index) {
StringBuilder answer = new StringBuilder();
for (char letter : s.toCharArray()) {
char temp = letter;
int idx = 0;
while (idx < index) {
temp = temp == 'z' ? 'a' : (char) (temp + 1); // 이렇게 할 수도 있구나 ...
if (!skip.contains(String.valueOf(temp))) {
idx += 1;
}
}
answer.append(temp);
}
return answer.toString();
}
}
이번 문제는 나름 생각하면서 풀어서 확실한 정답이라고 생각하였지만 역시나 다른 분들의 코드를 보니 더욱 깔끔한 코드들이 넘쳐나 있었다.
이번 문제는 너무 어렵게 꼬아서 푼것도 있는것 같다.
한 문제를 풀더라도 풀이 방법은 다양하기 때문에 꼭 내 코드만 정답이라는 생각은 버리자는 생각을 가지게 되는 문제였던 것 같다.