공부할 개념
- 입력 처리 - sys.stdin.readline()
- 문자열 메소드
문제 분석
이 문제는 간단한 대소문자 문자열 변환 문제입니다. 대소문자를 변환하는 방법은 아스키 코드를 이용하여 해결하는 방법이 대표적이지만, Python에서는 대부분의 문자열 문제를 String의 메소드로 해결 가능합니다.
우선은 Python으로 코딩테스트를 응시하기 위해서 필요한 입력 처리에 대해서 공부한 후, 2가지 방법으로 문제를 해결할 것입니다.
- 메소드를 활용해서 반복문을 활용한 해결 방법
- swapcase() 메소드를 활용한 방법
아래는 다양한 String 함수와 메소드에 대한 문서입니다.
input() 입력 처리가 무슨 문제라도?
Python으로 코딩 테스트를 응시하기 위해서는 Python의 기본 입출력 함수가 느리다는 사실을 알고 있어야 합니다. Python에서 기본으로 제공되는 input() 함수의 특징을 살펴보면 이유를 알 수 있습니다.
input()
1. 입력 받은 문자열을 문자 단위로 읽습니다.
2. 개행 문자를 삭제합니다.
3. 문자를 문자열로 변환하여 반환합니다.
input() 함수는 이처럼 입력 받은 문자열을 문자 단위로 하나씩 읽어들이기 때문에 느립니다. 그렇기 때문에 코딩 테스트에서 수십만 건의 입력을 받아야 하는 상황이 온다면 Timeout이 뜨는 경우가 생기는 경우를 종종 마주할 수 있는 것입니다.
그래서 Python으로 입력이 많은 문제를 풀어야 할 때는, 사용자의 입력을 받는 버퍼를 만든 뒤, 그 버퍼에서 입력을 다시 읽어들이는 sys.stdin.readline() 함수를 이용합니다.
위 코드에서는 input() 함수를 sys.stdin.readline() 이라는 함수로 대체했습니다. 때문에 세 번째 줄에서 실행되는 input()
은 기본 내장으로 들어있는 input() 함수인 것으로 보이지만, 실제로는 sys.stdin.readline() 함수가 실행되고 있습니다.
다만, 이 입력 방법은 개행 문자를 포함하여 문자열 자료형으로 변수에 포함하여 저장되기 때문에 이를 고려하면서 코드를 작성해야 합니다. 보통은 input().rstrip() 과 같이 작성해서 개행 문자를 바로 제거하는 방식을 사용합니다.
문자열은 일반적으로 수정이 불가능하다
Python에서 아래처럼 슬라이싱을 통해 문자열을 일부만 수정하는 것은 불가능합니다. 때문에 주어지는 문자열 를 수정하는 것이 아니라, 새로운 결과 변수를 선언하여 정답을 작성해야 합니다.
이 문제에서는 문자열에 포함되는 모든 문자를 변환해야 하기 때문에 반복문을 이용해야 합니다. 문자열의 길이가 10,000
으로 길지만, 한 번의 반복문으로 처리할 수 있습니다.
-
문자열 의 맨 앞 문자부터 순서대로 대/소문자 여부를 판단합니다.
-
대문자라면 소문자로 치환하고 소문자라면 대문자로 치환합니다.
이 과정에서 아래와 같이 Python의 내장 문자열 메소드를 이용하면 훨씬 간결한 코드를 작성할 수 있습니다.
str.islower() 과 str.isupper() 는 각각 해당 문자열을 구성하는 문자가 모두 소문자인지, 혹은 대문자인지를 판별하는 메소드입니다.
그리고 str.lower() 과 str.upper() 는 해당 문자열을 구성하는 문자를 모두 소문자, 혹은 대문자로 치환하는 메소드입니다
Python에서 문자열은 수정이..?
사실 기존의 Python에 대한 개념을 공부했을 때는 문자열은 한번 선언되면 수정 불가능한 데이터 타입으로 배우지만, 내장 메소드를 사용한다면 수정이 가능한 것처럼 보일 수 있습니다.
Python에서는 위에서 잠시 다뤄보았듯 대소문자를 처리하는 다양한 메소드를 제공하고 있으며, 더 나아가 기존의 문자열을 변경하는 str.replace() 같은 메소드도 제공하고 있습니다.
이 문제 역시 str.swapcase() 라는 메소드를 사용하면 한 줄로 문제를 해결할 수 있습니다. 문자열의 현재 문자가 소문자면 대문자로, 대문자면 소문자로 변환하는 메소드입니다.
Coding Test - Tip
저는 이와 같은 대소문자를 판단하고 구별이 필요한 경우에는 내장 함수를 바탕으로 해결하는 것을 추천드립니다. 아스키 코드의 이용이 필요한 문제는 최근 코딩테스트 트랜드에서 멀어졌으며, 개념적으로 활용될 뿐입니다. API, 다양한 프레임워크 역시 함수나 메소드 기반이기 때문에 Python으로 코딩테스트를 준비한다면, 오히려 내장 함수를 적극 활용하고 공부하는 것을 추천드립니다.
이 문제 역시 문자열 메소드를 얼마나 많이, 잘, 능숙하게 다루느냐에 따라서 문제의 난이도가 많이 달라집니다. 때문에 본인이 선택한 언어의 기본 자료형을 처리하는 메소드, 함수등을 꼼꼼하게 사용해보는 것이 중요합니다.