티스토리 뷰

반응형

문제

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

입력

첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.

출력

첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.

예제 입력 1 복사

Mississipi

예제 출력 1 복사

?

 

풀이

단어에서 알파벳을 특정하는 것에는 대략 두 가지 방법이 있다.

하나는 아스키 코드를 사용하는 것. 두 번째는 그냥 단어에 있는 알파벳들을 전부 리스트로 만드는 것.

 

아스키 코드를 사용하면, 전부 대문자나 소문자로 만든 후에 개수를 세면 된다.

필자는 아스키 코드를 사용하고 싶지 않아서 조금 다른 방식으로 풀어보았다.

 

import sys
input =sys.stdin.readline
t = input().strip().upper()
k =list(set(t))
v =[]
for i in k:
    v.append(t.count(i))
q=max(v)
if v.count(q)>1:
    print('?')
else:
    print(k[v.index(q)])

 

.upper() 메소드는 문자열의 뒤에 붙어 대문자로 만드는 함수이다.

마찬가지로 .lower() 메소드는 문자열의 뒤에 붙어 소문자로 만드는 함수이다.

 

함수가 대문자인지 소문자인지 확인하려면 .isupper,islower를 쓰면 된다. Bool 형태의 True, False로 반환해준다.

 

어찌되었건 이렇게 전부 대문자로 만들고, set을 하면 해당 글자의 중복은 전부 사라지고 입력된 문자열에서 어떤 알파벳이 있는지만 표시되게 된다. 이렇게 해서 앞에서 list를 붙여주면 k라는 리스트는 해당 알파벳들만 들어있는 리스트가 되는 것이다.

 

 

여기서 count 함수를 써서, t라는 문자열에서 각 글자가 몇 개인지를 알아내고, 그 중에서 max가 뭔지를 q에 저장한다.

참고로 count 함수는 문자열도 가능하다. (알파벳을 넣으면, 그 알파벳이 몇 개인지를 세서 반환)

 

그 후에  v.count(q) 조건을 실행한다. 만약 v.count(q)를 넣었는데 그 카운트 개수가 무조건 2개 이상이라면 같은 개수의 알파벳이 2개 이상이다.

즉, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우인 ?의 출력 조건이 된다. 따라서 이 경우에는 ?을 출력.

 

아니라면 q라는 숫자의 인덱스 번호를 v에서 구해서, k의 인덱스 번호로 지정해 출력해주면 된다.

q라는 숫자(최대 알파벳이 몇개인지)를 v의 인덱스 번호(그 알파벳이 몇번째에 있는지)를 구해서 K의 인덱스 번호(대문자로 변환된 알파벳 리스트) 중 어떤 알파벳인지를 출력한다고 보면 된다.

 

말이 정말 어려운데, 단순하게 풀어 쓴 코드는 다음과 같다.

 

k =list(set(t))
#MISP
#원래는 t=MISSISSIPI였음

v =[]
for i in k:
    v.append(t.count(i))
#M=1, I=4,S=4,P=1 이런식으로 들어감

q=max(v)

#최대값은 S=4, I=4이므로 일단 q=4

v.index(q)

#v에서 4인 인덱스는 2

print(k[2]) 

#물론 이 경우에는 ? 출력(I와 S가 같은 값이므로)
#다른 단어는 이런 식으로 코드가 풀어진다.

 

이렇게 된다.

 

물론, 아스키 코드를 사용한다면 이렇게 머리 아프게 하지 않아도 되지만, 간결한 코드를 지향한다면 이런 방식도 좋은 것 같다.

반응형