문제에 대한 첫 인상
char을 다루는 문제였기에 ASCII
아스키 코드가 바로 떠올랐다. s의 각 알파벳별로 index만큼 이동하면서 skip할 문자를 고려해주면 된다.
처음엔 되게 간단한 문제라고 생각했지만, ‘z’을 넘어가 다시 ‘a’부터 시작할 때에 (1) 또 다시 skip문자를 고려해줘야하고 (2) 다시 ‘z’을 넘어가버리는 케이스도 고려해줘야한다는 점이 까다로웠다. while문을 통해서 이를 확인하고 ‘z’ 넘어가는 경우 알파벳 숫자만큼(26) 빼주는 방식으로 구현했다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
string solution(string s, string skip, int index) {
string answer = s;
for (char& c: answer){
for (int i=0; i<index; i++){
c++;
if (c > 122){
c -= 26;
}
while (skip.find(c) != string::npos){
c++;
if (c > 122){
c -= 26;
}
}
}
}
return answer;
}
디버깅하는 과정에서 반례가 도움이 많이 되었는데, 유용한 반례를 몇 가지 적어본다.
s(string) | skip(string) | index(int) | return |
---|---|---|---|
“zzzzzz” | “abcdefghijklmnopqrstuvwxy” | 6 | “zzzzzz” |
“bcdefghijklmnopqrstuvwxyz” | “a” | 1 | “cdefghijklmnopqrstuvwxyzb” |
“klmnopqrstuvwxyz” | “abcdefghij” | 20 | “opqrstuvwxyzklmn” |