2026. 4. 20. 09:45ㆍProgrammers

문제 해석
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을 사용해서 모든 알파벳을 통합해서 관리해 코드가 간결해졌다.
'Programmers' 카테고리의 다른 글
| < 프로그래머스 C++ > 문자열 내 마음대로 정렬하기 (0) | 2026.04.22 |
|---|---|
| <프로그래머스 C++> 숫자 문자열과 영단어 (1) | 2026.04.21 |
| < 프로그래머스 > 최소직사각형 (0) | 2026.04.17 |
| 백준 <주사위 세 개> (C++ 랜덤함수) (0) | 2026.04.03 |
| 프로그래머스 연습하기<제일 작은 수 제거하기> (0) | 2026.03.23 |