RiseOJ는 solved.ac와 제휴 관계가 없습니다. 티어 아이콘 © solved.ac. solved.ac
← 브론즈 III

아스키 코드

문자를 숫자로 다루는 법 — 대소문자 변환, 문자 계산.

문자열 Bronze III 브론즈 III
선수 지식: 문자열 기초
1강 아스키 코드의 개념: 문자는 숫자다 공식

아스키 코드란?

컴퓨터는 글자도 결국 숫자로 저장합니다. 각 문자에 정해진 번호를 붙인 약속이
아스키 코드(ASCII) 입니다. 이걸 이용하면 문자를 숫자처럼 계산할 수 있습니다.


1. 알아 둘 핵심 코드

문자 아스키 값
'0' ~ '9' 48 ~ 57
'A' ~ 'Z' 65 ~ 90
'a' ~ 'z' 97 ~ 122

외울 건 많지 않습니다. 연속한다는 것('A'+1 == 'B')과, 대문자·소문자가
정확히 32 차이라는 것만 알면 됩니다.


2. 문자 ↔ 숫자 변환

C++에서 char는 사실상 작은 정수라, 그냥 연산이 됩니다.

char c = 'A';
cout << (int)c << '\n';     // 65  (코드값)
char d = 'A' + 3;
cout << d << '\n';          // 'D'
print(ord('A'))   # 65   문자 -> 코드
print(chr(68))    # 'D'  코드 -> 문자

파이썬은 ord(문자→숫자)와 chr(숫자→문자)를 씁니다.


3. 가장 유용한 두 공식

(1) 숫자 문자 → 실제 숫자

char c = '7';
int n = c - '0';   // 7   ('7'코드 - '0'코드 = 7)

(2) 알파벳의 순서 (0부터)

char c = 'c';
int idx = c - 'a';   // 2   (a=0, b=1, c=2)

이 "문자 - 기준문자" 패턴이 아스키 활용의 핵심입니다. 빈도 배열의 인덱스를 만들
때 특히 많이 씁니다.


4. 대소문자 변환

대문자와 소문자는 32 차이이므로:

char upper = 'a' - 32;        // 'A' (소문자 -> 대문자)
char lower = 'A' + 32;        // 'a'
// 더 안전하게: ch - 'a' + 'A'
print('a'.upper())   # 'A'  (보통은 내장 메서드가 편함)

복잡도

문자 ↔ 숫자 변환은 \(O(1)\)입니다. 문자열 전체를 처리하면 길이에 비례(\(O(N)\)).


정리

  • 문자는 내부적으로 숫자(아스키 코드).
  • '0''9'=4857, 'A''Z'=6590, 'a''z'=97122.
  • 숫자 문자→수: c - '0'. 알파벳 순서: c - 'a'.
  • 대소문자 차이는 32.
2강 아스키 코드 구현과 연습 공식

아스키 코드 구현 레퍼런스

문자를 숫자로 다루는 실전 기법 — 알파벳 빈도 세기, 카이사르 암호, 변환 — 을
코드로 정리합니다.


1. 알파벳 빈도 세기 (문자를 인덱스로)

string s; cin >> s;
int cnt[26] = {0};            // a~z 26칸
for (char ch : s)
    cnt[ch - 'a']++;          // 'a'->0, 'b'->1, ...
for (int i = 0; i < 26; i++)
    cout << (char)('a' + i) << ": " << cnt[i] << '\n';
s = input()
cnt = [0] * 26
for ch in s:
    cnt[ord(ch) - ord('a')] += 1
for i in range(26):
    print(chr(ord('a') + i), ":", cnt[i])

ch - 'a'로 0~25 인덱스를 만드는 것이 핵심 트릭입니다.


2. 카이사르 암호 (글자를 K칸 밀기)

string s; cin >> s;
int k; cin >> k;
for (char ch : s) {
    char shifted = (ch - 'a' + k) % 26 + 'a';   // 26 주기로 회전
    cout << shifted;
}
cout << '\n';
s = input()
k = int(input())
out = ""
for ch in s:
    out += chr((ord(ch) - ord('a') + k) % 26 + ord('a'))
print(out)

% 26으로 'z'를 넘으면 다시 'a'로 돌아오게 만드는 게 포인트입니다(나머지 연산 활용).


3. 대소문자 토글

for (char ch : s) {
    if ('a' <= ch && ch <= 'z') cout << (char)(ch - 32);  // 소->대
    else if ('A' <= ch && ch <= 'Z') cout << (char)(ch + 32);  // 대->소
    else cout << ch;   // 그 외(공백/숫자 등)는 그대로
}
print(s.swapcase())   # 파이썬은 한 줄

4. 함정과 패턴 인식

  • 대문자/소문자 혼동 — 기준을 'a'로 할지 'A'로 할지 입력에 맞추기.
  • 공백/숫자 섞임 — 알파벳만 처리할 땐 범위 검사 후 변환.
  • 출력 시 형변환 — C++에서 char로 출력하려면 (char) 캐스팅(안 하면 숫자가 찍힘).
  • 음수 인덱스 — 대문자를 - 'a'로 빼면 음수가 됨. 기준문자를 맞추기.

문제에 "알파벳 개수", "암호", "글자를 밀어", "대소문자 변환", "ABC 순서" 같은
말이 보이면 아스키 코드를 떠올리세요.


정리

아스키 활용의 두 기둥은 (1) 문자 - 기준문자로 0부터의 인덱스 만들기, (2) % 26
으로 알파벳을 순환시키기입니다. 출력 시 char 형변환을 잊지 마세요.