프로그래머스 둘만의 암호 문제 바로가기

문제에 대한 첫 인상

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”