프로그래머스 155652 - 알파벳 index 이동 암호 (skip 제외) Lv.1
출처: https://school.programmers.co.kr/learn/courses/30/lessons/155652
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// 프로그래머스 155652 - 알파벳 index 이동 암호 (skip 제외) Lv.1
// https://school.programmers.co.kr/learn/courses/30/lessons/155652
// 문제 설명
// 문자열 s의 각 알파벳을 index만큼 뒤의 알파벳으로 바꾼다.
// - z를 넘어가면 다시 a로 순환한다.
// - skip에 있는 알파벳은 세지 않고 건너뛴다.
// 예) s="aukks", skip="wbqd", index=5 → "happy"
// a에서 5칸: b(skip) c d(skip) e f g h → [c,e,f,g,h] 5번째 = 'h'
// 제약 조건
// 5 <= s 길이 <= 50, 1 <= skip 길이 <= 10, 1 <= index <= 20
// s, skip 모두 소문자. skip의 알파벳은 s에 포함되지 않는다.
// 접근
// skip 알파벳을 bool[26] 룩업 테이블에 표시(O(1) 조회).
// 각 글자마다 한 칸씩 뒤로(% 26 순환) 이동하되,
// skip이 아닌 글자에서만 카운트를 올려 index번 셀 때까지 반복.
// 인덱스 변환 관용구 c - 'a' (0~25)로 알파벳을 배열 인덱스화.
// 시간 O(|s| * index) — 입력이 작아 충분히 빠르다.
#include <string>
using namespace std;
string solution(string s, string skip, int index)
{
bool sk[26] = { false };
for (char c : skip)
sk[c - 'a'] = true; // 건너뛸 알파벳 표시
string answer = "";
for (char c : s)
{
int cur = c - 'a'; // 0~25
int cnt = 0;
while (cnt < index)
{
cur = (cur + 1) % 26; // 한 칸 뒤로, z(25) -> a(0) 순환
if (sk[cur] == false) // skip이 아니면 한 칸 센 것으로 인정
cnt++;
}
answer += (char)('a' + cur); // 다시 문자로 환원
}
return answer;
}
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.