1. 문제 풀이 아이디어
- 스킵 문자를 정렬한 후, 해석할 문자를
index
만큼 증가시키고, 스킵 문자에 따라 반복문을 통해 계산하여 문제를 해결한다.
2. 나의 정답 코드
class Solution {
public String solution(String s, String skip, int index) {
StringBuilder answer = new StringBuilder();
skip = Arrays.stream(skip.split("")).sorted().collect(Collectors.joining());
for (char c : s.toCharArray()) {
int cs = c + index;
for (char cc : skip.toCharArray()) {
if (cs < cc)
break;
if (c < cc) {
cs++;
}
}
while (cs > 'z') {
cs = cs - 'z' - 1 + 'a';
for (char cc : skip.toCharArray()) {
if (cs < cc)
break;
cs++;
}
}
answer.append((char) cs);
}
return answer.toString();
}
}
3. 정리
stream
을 사용해skip
문자를 정렬한다.
s
의 각 문자를index
만큼 증가시킨다.
- 스킵 문자들을 순회하며,
cs
보다 작은 경우 루프를 빠져나오고,c
보다 큰 경우cs
값을 증가시킨다.
cs
값이'z'
보다 클 경우cs
를 다시a
로 돌아가서 다시 위 과정을 반복한다.
- 최종적으로 계산된
cs
값을StringBuilder
에 추가하여 최종 문자열을 생성하여 문제를 해결한다.
4. 더 좋은 코드 리뷰
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();
}
}
- 문자를
1
씩 증가시키고skip
에서contains
메서드를 사용하여 문제를 해결했을 때 성능이 더 효율적이다.
- 성능 비교
inbex
가 크지 않고 정렬하는데 큰 비용이 발생하므로 나의 정답은 비효율적이었다.


- 정렬 : O(n log n)
- 문자 변환 : O(n * m)
- 최종 복잡도 : O(n * m + n log n)
- 문자 변환 : O(n * index * m)
- 최종 복잡도: O(n * index * m)
Share article