[python] 백준 1157 : 단어 공부

728x90

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

 

1157번: 단어 공부

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

www.acmicpc.net


풀이 1 : 아스키코드 변환, count와 index함수를 이용한 풀이

 

S = input()
arr = [0]*26
max_num = 0
index = 0
for i in range(len(S)):
    if ord(S[i]) >= 97:
        arr[ord(S[i])-32-65] += 1
    else :
        arr[ord(S[i])-65] += 1
max_num = max(arr)
index = arr.index(max_num)

if arr.count(max(arr)) >= 2:
    print('?')
else:
    print(chr(index+65))

 

코드 해석

1. 알파벳 개수만큼의 원소를 담은 리스트 arr을 선언

2. 입력받은 문자열의 각 문자들을 0~25까지의 숫자로 변환시키고, 각 숫자들을 arr의 인덱스 값으로 사용

3. arr의 원소중 가장 큰 값과 그것의 인덱스 값을 추출

4. 최댓값이 복수로 존재할 경우와 아닐 경우로 나눔

 

S = input()
arr = [0]*26
max_num = 0
index = 0

arr리스트에다가 알파벳 개수만큼의 원소를 선언한다.

 

S에다 받은 문자열을 반복문으로 각각 확인하여 a는 arr[0], b는 arr[1], z는 arr[25]의 값을 1씩 올리는 방법으로 가장 많이 나온 문자의 수를 비교할 것이다.

 

for i in range(len(S)):
    if ord(S[i]) >= 97:
        arr[ord(S[i])-32-65] += 1
    else :
        arr[ord(S[i])-65] += 1

 

ord()는 문자를 유니코드 정수값으로 반환한다.

S의 각 문자를 유니코드 정수값으로 변환하고 그 값이 97이 넘는 경우는 -97을 하고, (소문자 -> 0~25 값)

나머지 경우는 -65를 하면 입력받은 문자열 S의 모든 문자의 개수를 arr[0~25]에 집어넣을 수 있다.

 

ex) S에 Mississipi 입력

arr = [0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0]

                                 

 

 

max_num = max(arr)
index = arr.index(max_num)

max() 함수로 arr리스트 내의 최댓값을 max_num이 받도록 한다.

arr.index(max_num)은 리스트 arr에 있는 원소들 중에 max_num의 값이 가지는 인덱스 번호를 반환한다.

 

arr = [0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0]

                

여기서 최댓값은 4가 되고, index값은 i의 개수가 위치한 8과 s가 위치한 18이 된다.

 

if arr.count(max(arr)) >= 2:
    print('?')
else:
    print(chr(index+65))

count() 함수는 리스트에서 인자 값의 개수를 반환한다.

arr.count(max(arr))은 arr리스트에서 arr의 최댓값인 4가 몇 개나 존재하는지에 대한 값을 반환한다.

 

arr = [0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0]

4가 2개 있으므로 2를 반환하면 최댓값이 복수로 존재하므로 ?를 출력하도록 한다.

 

chr() 함수는 정수 값을 유니코드 문자 값으로 반환한다.

입력한 문자열 S가 zZa와 같이 최댓값이 하나만 존재하는 경우

arr = [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2]가 되므로

 

index는 25가 된다.

 

아스키코드표에 따라 0~25 사이의 값에다 65를 더한 값을 chr() 함수로 감싸주면 A~Z값을 얻을 수 있다.

따라서 print(chr(index+65))는 chr(90)을 출력한 값이므로 Z가 될 것이다.

 


풀이 2 : 다른 사람 풀이 upper() , count와 index함수를 이용한 풀이

 

s = input().upper()
compress_s = list(set(s))
count_list = [s.count(i) for i in compress_s]
 
if count_list.count(max(count_list)) > 1:
    print('?')
else:
    print(compress_s[count_list.index(max(count_list))])

 

코드 해석

1. 입력받은 문자열을 대문자로 통일

2. 중복된 값을 제거하여 리스트로 담음

3. 해당 리스트에서 각각의 원소들이 입력 받은 문자열에서 몇 번 쓰였는지 계산한 것을 새로운 리스트에 담음

4. 새로운 리스트 중 최댓값이 복수로 존재할 경우와 하나만 존재한 경우로 분리함.

 

upper()는 소문자를 대문자로,

lower()는 대문자를 소문자로 바꿀 수 있는 함수라고 한다.

굳이 아스키코드로 바꿔줄 필요가 없었다.

 

따라서 s는 모든 문자를 대문자로 통일한 값이 담겨 있다.

 

compress_s = list(set(s))
count_list = [s.count(i) for i in compress_s]

 

set() 함수로 입력받은 문자열 s에 중복을 제거하고, list형으로 compress_s에 담는다.

s에 Mississipi를 입력했다면 compress_s = [M, I, S, P]가 될 것이다.(set함수는 순서가 유지되지 않을 수 있다.)

즉, compress_s는 s에서 입력된 문자들의 리스트가 된다.

 

count() 함수로 s의 문자열에서 compress_s의 문자가 각각 몇 번 쓰였는지 확인하여 count_list에 담는다.

M은 1번, I와 S는 4번, P는 1번 들어갔으므로 count_list = [1, 4, 1, 4]가 된다.

즉, count_list는 s에서 문자들이 사용된 횟수의 리스트가 된다.

 

if count_list.count(max(count_list)) > 1:
    print('?')

count_list 내에서 count_list의 최댓값을 가지는 원소인 4가 복수로 존재하는 경우 ?를 출력함.

 

else:
    print(compress_s[count_list.index(max(count_list))])

s에 zZa을 입력했다면 최댓값은 Z 하나만 될 것이다.

중복을 제거한 리스트 compress_s = [Z, A]가 되고,

각 문자가 s에서 몇 번 쓰였는지 확인하는 count_list = [2, 1]가 된다.

 

count_list는 compress_s의 원소와 대응관계에 있으므로 Z는 2번, A는 1번 사용되었다는 식으로 연결할 수 있다.

따라서 count_list의 최댓값이 가지는 인덱스 번호가 compress_s에게 주어지면 가장 많이 사용된 문자를 추출할 수 있게 된다.

(*compress_s는 set() 함수로 만들어졌기 때문에 순서가 [A, Z]로 바뀔 수 있으나 count_list는 compress_s를 가지고 새로 만들어낸 리스트이므로 똑같이 순서가 뒤바뀌어져 [1, 2]가 된다. 따라서 최댓값의 인덱스를 이용하는 방법을 사용하면 문제를 풀 수 있다.)

 

index() 함수는 리스트에서 인자 값이 위치하는 번호 값인 인덱스 값을 반환한다.

 

 

 

728x90

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

[python] 백준 2292 : 벌집  (0) 2022.02.02
[python] 백준 2231 : 분해합  (0) 2022.02.02
[python] 백준 10809 : 알파벳 찾기  (0) 2022.01.28
[python] 백준 3052 : 나머지  (0) 2022.01.28
[python] 백준 2920 : 음계  (0) 2022.01.28