[백준] 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

좋은 웹페이지 즐겨찾기