[백준] 1157번 : 단어 공부
문제
느낀점
이틀에 걸쳐 풀어보려고 했으나 시간초과가 떠서 결국 다른 블로그를 참고해보았다.
혼자 풀어보면서 소문자를 대문자로 만드는 upper() 함수와 대문자를 소문자로 만드는 lower() 함수를 알게 되었고, 어떤 원소가 리스트안에 몇 개 존재하는지 파악하는 seq.count(d)라는 함수도 사용해보았다.
문자열 문제가 정말 어려운 것 같다. 여러 문자열 문제를 풀면서 문자열 문제를 정복하고 싶다!! :)
알아야 하는 개념
set(집합)을 이용하여 중복 제거
해당 문제는 중복된 값을 제거해서 검색 키들을 따로 리스트로 만들어 놓으면 풀기 편하다. 검색 키 값이 중복되면 안되기에 중복을 제거하는 set()을 활용한다. set() 생성자로 중복을 제거해준다음, 순서가 없으므로 다시 list() 생성자를 통해 list로 변환하는 방법을 많이 쓰는 것 같다.
파이썬 리스트에서 중복된 값을 제거하고 싶으면 set(집합)자료형을 이용하는 방법이 있다.
집합 자료형이 갖는 두 가지 특징은,
- 중복을 허용하지 않는다.
- 순서가 없다는 것이다.
중복을 제거할 때 set 집합 자료형은 순서가 없기 때문에 순서가 바뀐다.
str = "Mississipi"
setStr = set(str) #{M,i,s,p}
listStr = list(str) #[M,i,s,p]
my_list = ['A', 'B', 'C', 'D', 'B', 'D', 'E']
my_set = set(my_list) #집합set으로 변환
new_list = list(my_set) #list로 변환
print(new_list)
출력된 값은 ['D', 'B', 'A', 'E', 'C']
따라서 순서를 지켜서 중복을 제거하고 싶은 경우,
For문을 이용하여 중복 제거
모든 요소를 순회하며 해당 요소가 새로운 리스트에 있는지 확인한 다음, 해당 요소가 없다면 새로운 리스트에 추가한다.
oldList = ["A","A","B","D","D"]
newList = []
for i in oldList :
if i not in newList :
newList.append(i)
list.count(d)
리스트 내에 해당 값이 몇 개인지 검색하는 메서드 활용
list.index(d)
리스트 내에 해당 값이 몇 번째 index인지 확인하는 메서드 활용
str.upper()
문자열을 모두 대문자로 변환
str.lower()
문자열을 모두 소문자로 변환
내 풀이(시간초과)
word = input()
list = list(word)
result = ""
num = 0
while True :
sum = 0
alpha = list[0]
sum += list.count(list[0])
sum += list.count(list[0].upper())
a = list.count(list[0])
b = list.count(list[0].upper())
if alpha.lower() in list :
for _ in range(a) :
list.remove(list[0])
if alpha.upper() in list :
for _ in range(b) :
list.remove(list[0].upper())
# print(sum)
# print(list)
if sum > num :
result = alpha
num = sum
if sum == num :
result = '?'
if len(list) == 0 :
break
print(result.upper())
수정한 풀이
# 1157번 : 단어 공부
word = input().lower() # word = mississipi / baaa
word_list = list(set(word)) # word_list = ['p', 'm', 'i', 's'] / ['b', 'a']
print(word_list)
cnt = []
for i in word_list: # i = p, m, i, s / b, a
count = word.count(i)
cnt.append(count) # cnt = [1, 1, 4, 4] / [1, 3]
if cnt.count(max(cnt)) >= 2: # max인 것의 갯수가 2개 이상이면 ? 출력
print("?")
else:
print(word_list[(cnt.index(max(cnt)))].upper())
참고한 블로그
https://wook-2124.tistory.com/257
https://www.byfuls.com/programming/read?id=49
Author And Source
이 문제에 관하여([백준] 1157번 : 단어 공부), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@letsbebrave/백준-1157번-단어-공부저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)