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

문자열 기초

문자열 읽기, 길이, 인덱싱, 이어붙이기.

문자열 Bronze IV 브론즈 IV
선수 지식: 변수
1강 문자열의 개념: 글자들의 줄 공식

문자열이란?

문자열(string) 은 글자들이 줄지어 늘어선 데이터입니다. 이름, 단어, 문장 등을
다룰 때 씁니다. 사실상 "문자들의 배열"이라고 생각하면 됩니다.


1. 문자열 만들기와 읽기

#include <string>
string s = "hello";
cin >> s;            // 공백 전까지 한 단어 읽기
getline(cin, s);     // 공백 포함 한 줄 전체 읽기
s = input()          # 한 줄 전체를 문자열로

C++의 cin >> s공백에서 끊기므로 한 단어만 읽습니다. 공백이 포함된 문장은
getline을 써야 합니다.


2. 길이 구하기

cout << s.length() << '\n';   // 또는 s.size()
print(len(s))

3. 인덱싱 — 글자 하나 꺼내기

문자열의 각 글자에는 0부터 시작하는 번호(인덱스) 가 붙습니다.

문자열:  h  e  l  l  o
인덱스:  0  1  2  3  4
cout << s[0] << '\n';   // 'h'  (첫 글자)
cout << s[s.size()-1];  // 'o'  (마지막 글자)
print(s[0])    # 'h'
print(s[-1])   # 'o'  (파이썬은 음수 인덱스로 뒤에서부터)

4. 이어붙이기와 순회

string a = "abc", b = "def";
string c = a + b;        // "abcdef"
for (char ch : s)        // 글자를 하나씩
    cout << ch << ' ';
c = "abc" + "def"        # "abcdef"
for ch in s:
    print(ch, end=' ')

+로 문자열을 이어 붙일 수 있고, 반복문으로 글자 하나하나를 훑을 수 있습니다.


복잡도

길이 \(N\) 문자열을 한 번 훑는 것은 \(O(N)\)입니다. 다만 C++에서 루프 안에서 s +=
계속 이어 붙이면 비용이 커질 수 있으니 주의(Bronze에선 대개 괜찮습니다).


정리

  • 문자열은 글자들의 줄, 인덱스는 0부터.
  • 한 단어는 cin >> s, 한 줄 전체는 getline.
  • 길이는 .size()(C++) / len()(파이썬).
  • +로 이어 붙이고, 반복문으로 글자를 훑는다.
2강 문자열 구현과 연습 공식

문자열 구현 레퍼런스

문자열 문제는 "글자를 세고, 바꾸고, 뒤집고, 비교한다"가 대부분입니다. 자주 쓰는
패턴과 함정을 코드로 정리합니다.


1. 특정 글자 세기

string s; cin >> s;
int count = 0;
for (char ch : s)
    if (ch == 'a') count++;
cout << count << '\n';
s = input()
print(s.count('a'))     # 파이썬은 내장 메서드로 한 줄

2. 뒤집기

string s; cin >> s;
reverse(s.begin(), s.end());   // <algorithm> 필요
cout << s << '\n';
s = input()
print(s[::-1])          # 슬라이싱으로 뒤집기

3. 대소문자 변환 (아스키 활용)

각 글자는 숫자 코드로 표현됩니다. 'a''A'의 코드 차이는 32입니다.

for (char &ch : s) {
    if ('a' <= ch && ch <= 'z') ch = ch - 'a' + 'A';  // 소문자 -> 대문자
}
print(s.upper())        # 대문자로
print(s.lower())        # 소문자로

C++에선 toupper(ch), tolower(ch) 함수를 써도 됩니다(<cctype>).


4. 팰린드롬(거꾸로 읽어도 같은지) 판정

string s; cin >> s;
bool ok = true;
for (int i = 0; i < (int)s.size() / 2; i++)
    if (s[i] != s[s.size()-1-i]) ok = false;
cout << (ok ? "yes" : "no") << '\n';
s = input()
print("yes" if s == s[::-1] else "no")

앞 글자와 뒤 글자를 짝지어 비교하는 것이 핵심입니다.


5. 함정과 패턴 인식

  • 인덱스 범위s[s.size()]는 존재하지 않는 칸(마지막은 size()-1).
  • getline 빈 줄cin >> n 다음 getline 전에 cin.ignore().
  • 공백 처리 — 한 단어인지 한 줄 전체인지 입력 형식을 정확히.

문제에 "단어/문장", "뒤집기", "글자 개수", "대소문자", "거꾸로 읽어도" 같은
말이 보이면 문자열 문제입니다.


정리

문자열의 실전 도구는 (1) 인덱싱·길이, (2) 세기, (3) 뒤집기, (4) 대소문자 변환,
(5) 글자 비교입니다. 파이썬은 내장 메서드가 강력하니 적극 활용하세요.