문제를 처음 접근할 때 이유없이 너무나 당연하게? 문자열을 배열로 바꿔서 풀어야겠다고 생각했다. 그래서 문자열을 배열로 바꿔주는 메소드를 작성하고 메인 메소드를 작성하다 보니, 쓸데없이 길어지는 느낌을 받았다.
기능별로 쪼개서 메소드를 작성해주는 것도 좋지만, 이번 문제는 간단해서 그냥 메인 메소드에 한번에 쓰기로 했다.
가장 안쪽 for문에서 index만큼 j를 증가시키면서 하나 하나 문자열의 일치를 확인하게 된다. index만큼 반복 확인하면서 만약 문자열의 일치가 발견된다면, 그 횟수만큼 index에서 더 나아가면서 추가로 확인해야한다.
이 부분을 구현할 때, for문에서 이미 j < index 라고 고정된 범위를 지정해놨는데 문자의 일치가 판단돼서 추가로 나아가야하는 상황을 어떻게 구현할까 고민했다.
처음엔 조건문을 j < index + count식으로 count라는 변수를 새롭게 추가해 문자의 일치가 발견되면 count를 증가시켜 조건문이 갱신되도록? 만들어봤는데 원하는대로 동작이 안됐다.
그래서 '아 그럼 문자의 일치가 발견되면 j--를 시켜서 한번 더 돌게 만들면 되겠네' 라고 생각했지만, 처음 구현했던 문자열의 일치부분을 if(s[0] + j == skip.charAt()) 이런식으로 판단을 했어서, j--를 시켜봤자 비교값 자체도 돌아가게 돼버려서 원하는 결과를 얻지 못했다.
그래서s[0] + j 이 부분을 j와 관련이 없도록 수정했다. 솔루션을 보면 비교대상의 문자값을 아스키코드 값으로 변환시켜놓고, 내부 for문이 반복될 때마다 j와 상관없이 1씩 더해주는 모습을 볼 수 있다.
이렇게 되면, 문자의 일치를 발견해서 j-- 행위가 이루어져도 아스키코드 값은 되돌아가지 않고 1씩 더해진다.
추가로, 배열로 문제를 풀지않고 문자열로 접근하니 contains메소드를 활용할 수 있어 더욱 간단하게 풀 수 있었다.
- 솔루션
import java.util.*;
class Solution {
public String solution(String s, String skip, int index) {
String result = "";
for(int i = 0; i < s.length(); i++) {
char charac = s.charAt(i);
for(int j = 0; j < index; j++) {
int num = (int) charac;
num += 1;
if(num > 122) num -= 26;
charac = (char) num;
if(skip.contains(Character.toString(charac))) j--;
}
result += charac;
}
return result;
}
}