2025.05.22 - [프로그래밍] - [PCCE] LV3 파이썬 완전정복: Part 1 PCCE 시험 개요와 LV3 등급 분석
2025.05.22 - [프로그래밍] - [PCCE] LV3 파이썬 완전정복: Part 2: 변수, 자료형, 연산자 – Python 기본 문법 ①
2025.05.23 - [프로그래밍] - [PCCE] LV3 파이썬 완전정복: Part 3 조건문 – 흐름 제어 기초
2025.05.24 - [프로그래밍] - [PCCE] LV3 파이썬 완전정복: Part 4 반복문 – while, for, 중첩 반복
2025.05.24 - [프로그래밍] - [PCCE] LV3 파이썬 완전정복: Part 5 리스트와 2차원 리스트 – 자료구조 입문
2025.05.25 - [프로그래밍] - [PCCE] LV3 파이썬 완전정복: Part 6 함수 정의와 활용, 표준 라이브러리 (math, random)
텍스트를 다루는 법 – 문자열의 세계
**문자열(string)**은 문자의 나열이며, 우리가 출력하는 메시지나 파일 처리 등에서 늘 접하는 데이터 타입입니다. 프로그래밍 초급 단계에서 문자열 처리 역시 중요한 부분인데, 특히 **인덱싱(하나의 문자 추출)**과 슬라이싱(부분 문자열 추출), 그리고 **문자열 포매팅(형식 지정 출력)**은 자주 사용됩니다. PCCE 시험에서도 문자열 관련 문제는 빠짐없이 등장합니다. 예를 들어 특정 위치의 문자 바꾸기, 대소문자 변환, 문자열 뒤집기, 원하는 포맷으로 출력하기 등이 출제됩니다. 이번 파트에서는 Python의 문자열 조작 방법을 정리하고, PCCE에 나올만한 문자열 문제 유형과 팁을 살펴보겠습니다.
개념 설명: Python 문자열 조작 기초
1. 문자열 선언과 특성: Python에서 문자열은 ' ' 또는 " "로 감싸서 표현합니다. 예: "Hello", '파이썬'. 문자열은 불변(immutable) 타입이라, 한 번 생성되면 그 내용을 개별 문자 단위로 바꿀 수는 없습니다. (다만 전체를 새로운 문자열로 재할당하는 것은 가능) 예를 들어 s = "abc" 한 뒤 s[0] = "z" 이런 건 불가능합니다.
2. 문자열 인덱싱(Indexing): 문자열도 시퀀스이므로, 각 문자에 인덱스가 매겨집니다. s = "Hello"이면 s[0] = 'H', s[1] = 'e', ... s[4] = 'o'입니다. 음수 인덱스도 사용 가능하여 s[-1] = 'o' (마지막 문자), s[-2] = 'l' (끝에서 두 번째) 등으로 접근 가능합니다. 인덱싱으로 문자를 가져오는 것은 가능하지만, 앞서 말한 대로 s[i]에 값을 할당하는 건 안 됩니다. 대신 문자열을 조합하여 만들어야 합니다. 예컨대 첫 글자를 'Y'로 바꾸고 싶다면 s = 'Y' + s[1:] 같은 식으로 새로운 문자열을 만들어 할당합니다.
3. 문자열 슬라이싱(Slicing): 슬라이싱은 문자열의 부분을 잘라내는 작업입니다. 구문은 s[a:b]로, s 문자열의 인덱스 a부터 b-1까지를 추출합니다. 예: s = "Hello"일 때 s[1:4]는 "ell" (index 1,2,3). 몇 가지 규칙:
- s[:b]는 시작부터 b-1까지 (0 생략). 예: s[:3] = "Hel".
- s[a:]는 a부터 끝까지 (끝 생략). 예: s[2:] = "llo".
- s[-n:]는 끝에서 n글자. 예: s[-2:] = "lo".
- s[a:b:c] 처럼 콜론이 두 개 있으면 c는 **간격(step)**입니다. c가 2이면 한 칸 건너 하나씩. 예: s[::2] = "Hlo" (0,2,4 인덱스).
- 슬라이싱 결과가 빈 문자열일 수도 있음. 인덱스 범위를 벗어나더라도 에러는 안 나고 가능한 부분만 줍니다. 예: s[5:]는 "" (빈 문자열)이고, s[1:1]도 "".
- 문자열을 뒤집으려면 s[::-1] 기법을 알아두세요. step -1을 주면 뒤에서부터 반환됩니다. "Hello"[::-1] = "olleH".
4. 문자열 연결과 반복: 파이썬에서 문자열 + 연산자는 **연결(concatenation)**입니다. "Hello"+"World" = "HelloWorld". * 연산자는 반복으로, "Hi"*3 = "HiHiHi". 이들 연산을 이용해 문자열을 조작할 수 있습니다. 다만 +로 문자열 여러 개를 잇는 것은 내부적으로 새 문자열을 계속 만들기 때문에 매우 많이 할 경우 비효율적일 수 있습니다. (Lv3 수준에서는 문자열 길이가 작아서 상관 없겠지만, 알아두세요.) 여러 조각을 합치는 건 join 메서드가 더 효율적입니다:
# 코드 예시 |
words = ["Hello", "World"] " ".join(words) # "Hello World" (리스트를 공백으로 연결) |
join은 특정 구분자를 넣어 리스트의 문자열을 이어줍니다.
5. 주요 문자열 메서드: Python 문자열은 다양한 내장 함수를 갖습니다. PCCE 범위에서 유용한 몇 가지만:
- s.strip(): 양쪽 끝의 공백 제거 (좌: lstrip, 우: rstrip).
- s.lower(), s.upper(): 소문자/대문자로 변환.
- s.replace(old, new): 문자열 내 모든 old를 new로 치환한 새 문자열 반환.
- s.split(sep): 구분자 sep로 문자열을 나눠 리스트로 반환. sep 생략하면 공백 기준.
- sep.join(list): 앞서 말한 join, 리스트의 문자열을 sep로 이어 하나의 문자열로.
- s.count(sub): 부분문자열 sub가 몇 번 나오는지 개수 반환.
- s.find(sub): 부분문자열 sub의 첫 인덱스 (없으면 -1). s.index(sub)는 없으면 오류.
- s.startswith(x), s.endswith(y): 접두사/접미사 일치 여부 bool.
6. 문자열 포매팅(Formatting): 출력시 원하는 형식으로 숫자 등을 문자열에 넣는 방법입니다. Python에서는 여러 방식이 있는데, 최근에는 **f-string (Formatted String Literal)**이 많이 쓰입니다:
# 코드 예시 |
name = "Alice" score = 95 print(f"{name}님의 점수는 {score}점입니다.") |
출력: Alice님의 점수는 95점입니다.. 중괄호 {} 안에 변수명을 넣으면 그 값이 들어갑니다. 또는 {expr:.2f} 이런 식으로 포맷 지정(소수 둘째자리까지 등)도 가능합니다.
다른 방식: % 연산자 사용 (C의 printf 스타일):
# 코드 예시 |
print("%s님의 점수는 %d점입니다." % (name, score)) |
여기서 %s는 문자열, %d는 정수, %f는 실수 등의 서식 지정자입니다. 이 방법도 가능하지만, 파이썬 3에서는 f-string이 가독성 좋고 추천됩니다. 또 str.format() 메서드도 있습니다:
# 코드 예시 |
print("{}님의 점수는 {}점입니다.".format(name, score)) |
이건 위치 순서대로 넣거나, {0} {1} 번호 붙여 사용할 수 있죠.
7. 인코딩/디코딩 (참고): 문자열은 내부적으로 유니코드로 처리됩니다. PCCE Lv3에서는 별로 안 다루겠지만, 혹시 아스키 코드나 유니코드 코드포인트 관련 문제 있을 수 있습니다. 파이썬에서 ord('A') -> 65, chr(65) -> 'A' 이런 식으로 문자와 정수 코드 변환 가능합니다. 'a'와 'A'의 차이가 32라는 것도 알면 대소문자 변환 수동구현에 도움됩니다 (하지만 .lower(), .upper() 메서드가 있으니 그걸 쓰는 게 낫죠).
8. 다중 줄 문자열: """ ... """로 여러 줄 스트링도 가능합니다. 혹은 문자열 내 개행 newline 문자인 \n을 써서 줄바꿈 표현합니다. e.g., "Hello\nWorld" 출력하면 두 줄에 나옵니다. 개행, 탭 (\t), 따옴표 넣기 (\") 등 이스케이프 시퀀스도 가끔 문제에 등장합니다. 예: "출력 결과가 He said "Hello"." 이런 거 출력하려면 print("He said \"Hello\".").
실습 예제 코드: 문자열 조작 다양하게 해보기
# 코드 예시 |
# 문자열 인덱싱과 슬라이싱 s = "PYTHON" print(s[0], s[5]) # 출력: P N print(s[-1], s[-2]) # 출력: N O # s[0] = 'A' # <-- 이렇게는 불가 (문자열은 불변) print(s[1:4]) # 출력: YTH (인덱스 1,2,3) print(s[:3], s[3:]) # 출력: PYT HON print(s[::2]) # 출력: PTO (0,2,4번째 문자) print(s[::-1]) # 출력: NOHTYP (역순) # 문자열 연산 및 메서드 a = "Hello" b = "World" print(a + " " + b) # 출력: Hello World print(b * 3) # 출력: WorldWorldWorld text = " Hello, Python!! " print(text.strip()) # 좌우 공백 제거 -> "Hello, Python!!" print(text.replace("Python", "Java")) # " Hello, Java!! " csv = "red,green,blue" parts = csv.split(",") print(parts) # ['red', 'green', 'blue'] print("|".join(parts)) # red|green|blue msg = "HelloHello" print(msg.count("Hello")) # 2 (부분 문자열 개수) print(msg.find("lo")) # 3 (첫 "lo" 위치) print(msg.find("Java")) # -1 (없음) # 대소문자 변환 swap_test = "AbcDEF" print(swap_test.lower()) # abcdef print(swap_test.upper()) # ABCDEF # 문자열 포매팅 name = "철수" score = 93.5 print(f"{name}의 점수는 {score}점") # f-string print("{}의 점수는 {}점".format(name, score)) # format print("%s의 점수는 %.1f점" % (name, score)) # % formatting # 특수 문자 출력 print("그는 말했다. \"안녕?\"") # 그는 말했다. "안녕?" print("첫째 줄\n둘째 줄\n\t세번째 줄(들여쓰기)") # 첫째 줄 # 둘째 줄 # 세번째 줄(들여쓰기) |
설명:
- 위 코드 예제에서 다양한 문자열 기능을 시연했습니다. PCCE 준비하면서 꼭 직접 한 번씩 써보길 권장합니다.
- 인덱싱, 슬라이싱, [::-1] 역순, join/split, replace, count/find, lower/upper, strip, 포매팅 3가지, escape sequences 등이 모두 망라되어 있습니다.
- 이런 것들을 자유자재로 쓸 줄 알면 문자열 문제에서 큰 어려움은 없을 겁니다.
PCCE 출제 포인트 분석: 문자열 분야
- 부분 문자열 추출/변경: 문자열 문제의 빈출 유형은 "문자열의 일부를 변경하거나 추출"입니다. 예를 들어 "주어진 문자열에서 첫 글자와 마지막 글자를 제거한 문자열 출력" – 이러면 s[1:-1] 쓰면 끝이죠. 또는 "문자열 거꾸로 출력" – s[::-1] 쓰거나 reversed 함수 써도 되고, for문으로 뒤에서부터 출력해도 됩니다. 또 "문자열에서 홀수 인덱스 문자만 이어서 출력" – s[1::2] 같은걸로 쉽게 가능. 이런 식으로 슬라이싱을 제대로 이해하면 한 줄에 풀릴 문제들이에요. 초보자는 for 문으로 매번 하나씩 꺼내 조건으로 걸러 append하는 식으로 할 수 있지만, 슬라이싱을 쓰면 간결하죠.
- 문자열 검색/판단: 부분 문자열 검색 (find/index)이나 특정 패턴 판단 (startswith/endswith)도 나올 수 있습니다. 예: "문자열이 특정 접미사로 끝나는지 확인" – s.endswith("END") 쓰면 T/F 바로 나옴. 혹은 "문자열에 숫자가 포함되어 있는지?" – 루프 돌며 char.isdigit() 확인하거나, 정규식까지는 안 가고 any로 체크 등. (isdigit, isalpha, islower 등 문자열 메서드도 있네요, 이것들도 유용: 'A'.isupper() -> True 등)
- 대소문자 변환/아스키 코드: 기출에 "영문 대소문자 바꿔서 출력" 문제가 있었던 것 같습니다. Python에서는 swapcase()라는 간편한 메서드도 있습니다 ("AbC".swapcase() -> "aBc"). 이런 문제는 loop로 char 하나씩 검사해서 대문자는 소문자로, 소문자는 대문자로 바꾸는 것도 연습해야 합니다. (ord 사용해서 ±32 해도 되지만, Python은 .upper() .lower() 조합 쓰는 게 안전) 한편, 숫자를 문자로 또는 문자 코드 다루는 것도 간단히 알고 가면 도움.
예시: "알파벳을 입력받아 3칸 뒤 알파벳 출력 (a->d, x->a)" – 이건 ASCII 코드와 모듈로 계산하거나, 알파벳 문자열 "abcdefghijklmnopqrstuvwxyz" 인덱스 이용 등 가능. 이런 식으로 응용 문제도 있을 수 있습니다. - 문자열 포맷 출력: 올바른 출력 형식 맞추기가 중요합니다. 특히 공백, 줄바꿈, 형식이 정확히 맞아야 O가 나옵니다. PCCE에 "형식에 맞게 출력"이 출제 범위에 있는 만큼, 아마 "OOO원" 형태로 통화 표시한다거나, "점수: 90점 (두 자리로 맞춰 출력)" 등 포맷 요구할 수 있어요. Python f-string은 표현식도 넣을 수 있어서, 예를 들어 f"{num:02d}"는 2자리 0패딩 정수 출력 등 가능. 또는 %5.2f 이런 C식도. 초보자한테 너무 복잡한 서식은 안 내겠지만, 기본적인 건 연습해야 합니다. (특히 C, Java에는 C언어 printf 스타일을 알아야하니, Python응시생도 한번 익혀두는 게 이득)
- 여러 줄 문자열 처리: 예를 들면 "3줄에 걸쳐 다음과 같이 출력\nHello\nWorld\n!!!" 이런 문제는 그냥 print 여러 번 하면 되지만, 출력 형식 실수 안 하도록 주의. 혹시 입력도 여러 줄로 오는 경우 input()을 여러 번 쓰거나 sys.stdin등 이용해야 함.
- 문자열과 리스트 변환: 문자열도 iterable이라 list로 캐스팅하면 char 리스트가 됩니다. list("HELLO") -> ['H','E','L','L','O']. 또 "".join(list)로 다시 합칠 수 있죠. 문제에 따라 문자열을 리스트처럼 다뤄야 할 때도 있습니다 (ex: 문자열 정렬하려면 sorted(s) 하면 글자순 정렬된 리스트 나옴, 그걸 join하면 문자열). PCCE Lv3에서 sorting string 문제라면 sorted(s) 쓰면 되지만, 직접 구현도 가능.
- 정규 표현식: Level3 범위엔 없을 것 같습니다. (문제에 특별히 언급되진 않았죠) 그래서 re 모듈 같은 건 안 나올 테니 걱정 안 해도.
요약하면: 문자열 파트는 언어의 문자열 조작 문법을 물어보는 경우와, 단순 구현 문제(ex. 회문 여부 검사, 부분집합 출력 등)로 나뉩니다. 둘 다 중요. 전자는 문법을 외워야 하고, 후자는 알고리즘적으로 풀어야. 그러나 Lv3의 알고리즘은 복잡하지 않고, 문법 숙지를 많이 보는 편일 겁니다.
마무리 요약 및 꿀팁
문자열 처리는 코딩의 기본 중 기본입니다. 특히 인덱싱/슬라이싱은 리스트와 상당히 유사한 개념이라 앞선 파트와 연계되죠. Python에서는 문자열 관련 라이브러리나 메서드가 매우 풍부하므로, 이를 잘 활용하면 쉽고 빠르게 문제를 해결할 수 있습니다.
꿀팁:
- 슬라이싱 연습: 문자열을 뒤집거나 부분 추출하는 다양한 시나리오를 스스로 만들어 풀어보세요. 예를 들어 "abcdefg"에서 짝수번째 문자만 출력, 끝에서 3개 제외 출력, 중간 3글자 출력, 등등. 이런 걸 손으로나 코드로 연습하면 슬라이싱이 자연스레 몸에 밸 겁니다.
- 문자열은 변경 불가: 이 사실 때문에, 문자열 편집 문제에서는 보통 새로운 문자열을 만들어 결과를 내야 합니다. 혹은 리스트로 변환해서 바꾸고 다시 문자열로 만들 수도 있죠. 이걸 기억하면, 어떤 접근법이 쉬울지 판단할 때 도움이 됩니다. (예: 매우 긴 문자열에서 문자 여러 개 바꾸는 문제면, 한 글자씩 더하는 건 비효율적이니 list로 바꿔 고치고 join이 나음)
- 포매팅 사소한 것 주의: f-string 등으로 출력할 때, 혹시 부동소수점에서는 예상치 못한 반올림 문제가 있을 수 있습니다. 예: 2.5를 소수점 한 자리로 format하면 2.5, 근데 2.25를 .1f 하면 2.3으로 반올림. 이런 건 디폴트 동작이지만, 혹시 문제에서 "버림"을 원하면 floor 써야 하고, "반올림"인지 "버림"인지 잘 읽어야 해요.
- 예제 출력과 똑같이: 공백이나 개행 하나 차이로 틀리는 일이 흔합니다. 출력 예시를 보고 정확히 맞춰야 해요. 특히 여러 개 결과 출력 시, 사이에 공백인지 줄바꿈인지, 콤마나 콜론 등 문자가 필요한지 꼼꼼히 확인하세요. 필요하면 포매팅 문자열 안에 '\n' 등을 써서 형식을 맞추면 됩니다.
추천 연습 문제
- 프로그래머스 Lv0: 문자열 뒤집기 – 주어진 문자열을 거꾸로 만드는 문제. 슬라이싱 [::-1]으로 쉽게 풀립니다.
- 프로그래머스 Lv0: 특정 문자 제거하기 – 문자열에서 특정 문자를 전부 제거하는 문제입니다. replace를 활용해보세요.
- 프로그래머스 Lv0: 대문자와 소문자 – 주어진 문자열에서 대문자는 소문자로, 소문자는 대문자로 바꾸는 문제. swapcase()로 한 줄에 해결 가능하지만, 직접 반복문으로 바꿔보는 연습도 하세요.
- 프로그래머스 Lv0: 숨어있는 숫자의 합 – 문자열 안에 숫자 문자들이 섞여 있을 때, 그 숫자들을 모두 합하는 문제입니다. isdigit()으로 필터링하거나, 정규식 re.findall로 숫자 추출할 수도 있죠. 초급 알고리즘 문제지만, 문자열 파싱 연습이 됩니다.
- 백준 5622 다이얼 – 전화기 다이얼 문제로, 각 알파벳에 해당 숫자와 시간을 계산하는 시뮬레이션입니다. 문자열 처리, 조건 분기 연습에 좋습니다.
- 백준 1157 단어공부 – 입력 단어에서 가장 많이 쓰인 알파벳 찾는 문제 (대소문자 구분X). count 쓰거나 Counter 써도 되고, 직접 array[26] 세줘도 됩니다. 문자열 빈도 관련 대표문제니 풀어보세요.
2025.05.22 - [프로그래밍] - [PCCE] LV3 파이썬 완전정복: Part 1 PCCE 시험 개요와 LV3 등급 분석
2025.05.22 - [프로그래밍] - [PCCE] LV3 파이썬 완전정복: Part 2: 변수, 자료형, 연산자 – Python 기본 문법 ①
2025.05.23 - [프로그래밍] - [PCCE] LV3 파이썬 완전정복: Part 3 조건문 – 흐름 제어 기초
2025.05.24 - [프로그래밍] - [PCCE] LV3 파이썬 완전정복: Part 4 반복문 – while, for, 중첩 반복
2025.05.24 - [프로그래밍] - [PCCE] LV3 파이썬 완전정복: Part 5 리스트와 2차원 리스트 – 자료구조 입문
2025.05.25 - [프로그래밍] - [PCCE] LV3 파이썬 완전정복: Part 6 함수 정의와 활용, 표준 라이브러리 (math, random)
'IT공부방' 카테고리의 다른 글
[PCCE] LV3 파이썬 완전정복: Part 9 디버깅 유형 및 오류 찾기 전략 (0) | 2025.05.27 |
---|---|
[PCCE] LV3 파이썬 완전정복: Part 8 구현/시뮬레이션 문제 유형 분석 및 접근법 (0) | 2025.05.26 |
[PCCE] LV3 파이썬 완전정복: Part 6 함수 정의와 활용, 표준 라이브러리 (math, random) (0) | 2025.05.25 |
[PCCE] LV3 파이썬 완전정복: Part 5 리스트와 2차원 리스트 – 자료구조 입문 (0) | 2025.05.24 |
[PCCE] LV3 파이썬 완전정복: Part 4 반복문 – while, for, 중첩 반복 (0) | 2025.05.24 |