< 프로그래머스 C++ > 시저 암호

2026. 4. 20. 09:45Programmers


문제 해석

1. 공백은 암호화의 대상이 아니므로 건드리지 말고 그대로 둔다.

 

2. 대문자는 A ~ Z, 소문자는 a ~ z 범위 안에서만 밀어야 한다.

코드에서는 islower()를 사용해서 소문자 여부를 판단했다.

 

3. z를 넘으면 다시 a로 돌아와야 한다.


문제 풀이

 

핵심 포인트

1. 공백처리

반복문의 초반 부분에서 공백일 때 바로 다음 반복으로 돌아가도록 continue를 사용해서 처리했다.

 

2. 대소문자 구분

islower() -> 소문자면 true, 대문자면 false

 

대문자와 소문자는 ASCII 값이 달라서 범위 기준이 달라야 한다. 그래서 각각 다르게 처리해주었다.

 

3. Z의 예외처리

% 26을 이용해서 Z가 넘어가면 다시 A부터 증가하도록 변환.


핵심 문자 변환 로직

이 코드의 동작을 'C'를 n=3이라고 가정하고 정리해보려고 한다.

대문자 처리 로직을 가져와보겠다.

(char)(((s[m] - 'A') + n) % 26 + 'A')

 

1. s[m] - 'A' 

문자를 0 ~ 25의 숫자로 변환하는 과정이다.

더보기

'C' - 'A' = 67 - 65 = 2

이런식으로 A = 0부터 Z = 25까지, 알파벳을 숫자로 변환했다.

 

 

2. + n

n을 변환한 숫자에 더해 변환할 알파벳의 숫자로 바꿔주는 것이다.

 

3. % 26 

Z를 넘으면 다시 A로 돌아오는 과정이다.

5 % 26 = 5

이 과정에선 26을 넘지 않아 그대로이지만 Z를 넘는 경우를 가정하면

 

'Z' + 3
→ 25 + 3 = 28 
→ 28 % 26 = 2 → 'C'

26이 되는 순간 0으로 돌아와 Z이후의 처리로 자동처리 된다.

 

4. + 'A'

다시 원래의 문자로 변환해주는 과정이다.

5 + 65 = 70 → 'F'

코드 개선 과정

z 부분만 따로 예외처리를 했음.

z를 따로 if로 처리해 계산식을 작성하니 코드가 길어지고 복잡해져 보기 어려워졌다.

% 26을 사용해서 모든 알파벳을 통합해서 관리해 코드가 간결해졌다.