728x90
반응형

백준 10820번 문자열 분석 문제를 풀어보겠습니다.

문제자체는 난이도가 브론즈 2 인데요.

문제를 풀면서 꼭 알아야 할 기본적인 파이썬 명령어가 있어서 포스팅을 하게되었습니다. 

정답코드는 아래에 있으니 정답코드를 보러오셨다면 맨 아래 쪽으로 바로 가시면 되겠습니다. 

https://www.acmicpc.net/problem/10820

 

10820번: 문자열 분석

문자열 N개가 주어진다. 이때, 문자열에 포함되어 있는 소문자, 대문자, 숫자, 공백의 개수를 구하는 프로그램을 작성하시오. 각 문자열은 알파벳 소문자, 대문자, 숫자, 공백으로만 이루어져 있

www.acmicpc.net

문제 요약)

n번째 줄까지 각각의 문자열에 대해서 소문자, 대문자, 숫자, 공백의 개수를 공백으로 구분해 출력하는 문제입니다.!

 

제가 이 문제를 풀면서 꼭 알아두면 좋겠다고 생각한 개념은 3가지 인데요.

  1. 종료조건이 주어지지 않을 때 쓰는 while
  2. try~catch
  3. 파이썬에서 쓸 수 있는 소문자, 대문자, 숫자, 공백 구분 명령어
  4. 문자열 포메팅 

이 문제에서 주어지는 입력값인데요.

입력이 몇 개 주어지는지 보통 첫번째 줄에 주어지는데 이 문제에는 없습니다. 

처음 접하실 때 당황하실 수 있는데요.

while문을 쓰시면 됩니다. 

while 조건: 은 쉽게 말해 조건이 아닐  까지 수행되는 반복문인데요.

while 1 이나 while True 를 하게되면 무한반복이 된다고 생각하시면 됩니다.

 

그렇게 while문을 통과하고 나면 try~catch문을 만나게 되는데요.

try문으로 일단 코드가 진행되다가 예외가 발생하면

바로 except문으로 넘어갑니다.

이 문제같은 경우는 try문 다음으로 input()을 해서 

input값이 없으면 catch문으로 넘어가는데요.

EOF(end of file)검사를 통해 입력값이 없으면 종료됩니다.

 

그리고 파이썬에서 쓸 수 있는 소문자, 대문자, 숫자, 공백 구분 명령어인

islower(), isupper(), isdigit(),isspace()가 있습니다. 

만약 파이썬이 아니라면 아스키코드를 이용해 문제를 풀면 되겠습니다.

 

마지막으로 문자열 포메팅입니다.

문자열 중간 중간에 특정 값을 넣어주기 위해서 사용하는 것인데요!

예를 들어 구구단을 출력하기 위해 '5 x 3 = 15' 이런 형태로 출력하고 싶은데

'x'나 '='는 고정하고 변수인 숫자만 바꾸고 싶을 때 사용할 수 있습니다. 

print('{} x {} = {}'.format(a,b,a*b) 이런식으로 말이죠!

 

마지막으로 정답코드는 다음과 같습니다.

정답코드)

while 1:
    try:
        word = input()
        up,lo,sp,nu = 0,0,0,0

        for i in word:
            if i.isupper():
                up+=1
            elif i.islower():
                lo+=1
            elif i.isdigit():
                nu+=1
            elif i.isspace():
                sp+=1
        print("{} {} {} {}".format(lo,up,nu,sp))
    except:
        break

 

문제는 간단했지만, 문제를 통해 배울 수 있는 것이 많았던 문제였던 것 같습니다.

 

+ input()말고 sys라이브러리를 사용하여 푸는 코드도 같이 올리겠습니다.

try~catch대신 if~else문을 써야하고, EOF검사를 어떤식으로 하는지를 중점적으로 봐주시면 될거 같습니다.

그리고 sys.stdin.readline()같은 경우는 줄바꿈문자인 '\n'도 공백으로 포함시키기 때문에

.rstrip('\n')을 해줘서 '\n'을 없애줍니다.

import sys
while True:
    line = sys.stdin.readline().rstrip('\n')
    up, lo, sp, nu = 0, 0, 0, 0
    if not line:
        break
    for l in line:
        if l.isupper():
            up += 1
        elif l.islower():
            lo += 1
        elif l.isdigit():
            nu += 1
        elif l.isspace():
            sp += 1
    sys.stdout.write("{} {} {} {}\n".format(lo, up, nu, sp))
728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기