본문 바로가기

문제풀이

[백준] 1159번 파이썬 풀이

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

 

1159번: 농구 경기

상근이는 농구의 세계에서 점차 영향력을 넓혀가고 있다. 처음에 그는 농구 경기를 좋아하는 사람이었다. 농구에 대한 열정은 그를 막을 수 없었고, 결국 상근이는 농구장을 청소하는 일을 시작

www.acmicpc.net

[문제]

상근이는 농구의 세계에서 점차 영향력을 넓혀가고 있다. 
처음에 그는 농구 경기를 좋아하는 사람이었다. 
농구에 대한 열정은 그를 막을 수 없었고, 결국 상근이는 농구장을 청소하는 일을 시작했다. 
상근이도 농구장을 청소하면서 감독이 되기 위해 가져야할 능력을 공부해나갔다. 
서당개 3년이면 풍월을 읊듯이 상근이는 점점 감독으로 한 걸음 다가가고 있었다. 
어느 날 그에게 지방의 한 프로농구팀을 감독할 기회가 생기게 되었다. 
그는 엄청난 지도력을 보여주며 프로 리그에서 우승을 했고, 이제 국가대표팀의 감독이 되었다.

내일은 일본과 국가대표 친선 경기가 있는 날이다. 
상근이는 내일 경기에 나설 선발 명단을 작성해야 한다.

국가대표팀의 감독이 된 이후에 상근이는 매우 게을러졌다. 
그는 선수의 이름을 기억하지 못하고, 각 선수의 능력도 알지 못한다. 
따라서, 누가 선발인지 기억하기 쉽게 하기 위해 성의 첫 글자가 같은 선수 5명을 선발하려고 한다. 
만약, 성의 첫 글자가 같은 선수가 5명보다 적다면, 상근이는 내일 있을 친선 경기를 기권하려고 한다.

상근이는 내일 경기를 위해 뽑을 수 있는 성의 첫 글자를 모두 구해보려고 한다.

[입력]

첫째 줄에 선수의 수 N (1 ≤ N ≤ 150)이 주어진다. 다음 N개 줄에는 각 선수의 성이 주어진다. 
(성은 알파벳 소문자로만 이루어져 있고, 최대 30글자이다)

[출력]

상근이가 선수 다섯 명을 선발할 수 없는 경우에는 "PREDAJA" (따옴표 없이)를 출력한다. 
PREDAJA는 크로아티아어로 항복을 의미한다. 
선발할 수 있는 경우에는 가능한 성의 첫 글자를 사전순으로 공백없이 모두 출력한다.

[예제 입력1]

18
babic
keksic
boric
bukic
sarmic
balic
kruzic
hrenovkic
beslic
boksic
krafnic
pecivic
klavirkovic
kukumaric
sunkic
kolacic
kovacic
prijestolonasljednikovi

[예제 출력1]

bk

[예제 입력2]

6
michael
jordan
lebron
james
kobe
bryant

[예제 출력2]

PREDAJA

나의 풀이

num = int(input())

count_list = [0]*26 #알파벳 a~z까지의 카운트를 해줄 배열 생성 및 초기화
result = ""         #첫 알파벳이 5개 이상이 나오면 추가해 줄 문자변수
for i in range(num):
    count_list[ord(input()[0])-97] += 1 
    #입력한 문자의 첫번째 문자를 유니코드로 변환 후 count_list 인자를 +1 해줌.
    #ex) 'a' 라면, 'a'=97 이므로, count_list[0] += 1 과 같음

for i in range(26):
    if count_list[i] >= 5:  #만약 count_list의 인자 중 5이상인 인자가 있을경우
        result += chr(i+97) #문자로 출력해주기 위해서 chr(정수)를 이용.
                            #i+97 => 'a'+ i = 'a'

print(result if result else "PREDAJA")

 

 

해당 문제는 입력하는 문자열이 모두 소문자로 이루어져 있기 때문에 수월하게 해결했던 것 같다.

 

알파벳은 a~z까지 총 26개가 존재하기 때문에 카운트를 해줄 리스트를 0으로 초기화 및 선언해준다.

count_list = [0]*26

 

그리고, 성의 첫 글자가 5개 이상이 나온 선수들이 선발되는 과정이기 때문에 5 이상의 알파벳을 담아낼 변수를 선언해준다.

result = ""

 

이제 반복문을 입력한 이름의 개수에 맞춰서 실행하고, 첫 번째 문자는 유니코드로 변환하여 리스트에 저장해준다.

이때, a의 유니코드 값은 97을 기준으로 진행한다.

 

for i in range(num):
    count_list[ord(input()[0])-97] += 1

 

만약 a가 입력되었다면 ord(a)-97 = 0이기 때문에 count_list[0] += 1과 같은 결과를 얻을 수 있다.

이런 식으로 입력받은 이름들의 성을 구분하여 리스트에 추가해준다.

 

이제 5 이상의 알파벳을 반환해주어야 하기 때문에 chr 함수를 이용하여 유니코드 값을 문자로 변환한다.

 

for i in range(26):
    if count_list[i] >= 5:
        result += chr(i+97)

 

만약 count_list[0]이 5보다 크다면 chr(0+97) 이 되고, 97은 알파벳 a의 유니코드이므로 a값이 result에 추가가 된다.

 

마지막으로 result 값에 1개라도 들어있다면 해당 값을 반환해주고, 없다면 PREDAJA를 반환해준다.

 

print(result if result else "PREDAJA")

 

TIP)

파이썬에서는 ord 함수와 chr 함수를 이용하면 매우 쉽게 풀이가 가능했다.

 

 ㅇ ord(문자)

   - 하나의 문자를 인자로 받고, 해당 문자에 해당하는 유니코드 정수를 반환한다.

 

 ㅇ chr(정수)

   - 하나의 정수를 인자로 받고, 해당 정수에 해당하는 유니코드 문자를 반환한다.

   - 인자(정수)의 유효 범위는 0 ~ 1,114,111 (16진수 0x10 FFFF)까지이다.

 

 

아스키코드표 (출처 : 나무위키)

아스키코드 값은 모두 외울 필요는 없지만, 시작점(ex, a:97)과 끝점(ex, z:122) 정도는 인지하고 있으면 좋을 것 같다.

'문제풀이' 카테고리의 다른 글

[백준] 1371번 파이썬 풀이  (0) 2022.03.28
[백준] 1252번 파이썬 풀이  (0) 2022.03.27
[백준] 1267번 파이썬 풀이  (0) 2022.03.23
[백준] 10870번 파이썬 풀이  (0) 2022.03.21
[백준] 1100번 파이썬 풀이  (0) 2022.03.20