본문 바로가기

카테고리 없음

[알쓰] 백준 1157 : 단어 공부하기

안녕하세요 오늘부터 학교에서 알고리즘 스터디를 시작하게 되었습니다.
그런의미에서 어차피 매주 풀 문제, 블로그와 겸겸하면 좋겠다싶어서 기억에 남는 한가지 문제에 대해
저의 코드주머니를 좀 만들어보려고 합니다. 응원좀 해주세요

 

 

*코드에 대한 피드백은 언제나 환영입니다.😀

 

알고리즘 쓰다...


 

 

백준 1157 : 단어공부

문제

접근법

 

처음 든 생각은 16진수를 이용한 접근이였다 대문자와 소문자의 차이는 일정하니까 파이썬은 처음이라 내장함수에 대해서는 잘 모르고 반복문 어떻게 쓰는지 변수는 어떻게 쓰는지 밖에 모르는 상태였다.

일단 문자를 입력받아야 하니 https://wikidocs.net/25 에서 사용자 입출력 함수를 검색 중 Dictionary 라는 자료형을 보게 되었음 

key 값에 알파벳을, value에 빈도수를 넣어서 계산하면 되겠다 생각 -> 사용법은 copliot을 이용함

 

첫 코드

#딕셔너리 이용해보기

word = input().strip().upper()

#print(word)

dic = {}

for Alp in word: #파이썬에서는 문자열은 Iterable object이기 때문에 한문자씩 읽을수 있음 우와~
    if Alp in dic:
        dic[Alp] +=1
    else:
        dic[Alp] = 1
        
#딕셔너리에서 가장 높은 숫자 찾기 , 같으면 -> ?

max = 0
ans = [] * 1

#print(dic.keys())
#print(dic.item()) 우리는 빈도수는 필요 없으니까 dic의 value값이랑 비교해서 key만 뽑아내면 되지 않을까?

for count in dic.values():
    if count > max:
        max = count
        ans = dic.keys
    elif count == max:
        ans[0] = "?"
        
print(ans)

 

  • 문제점
    1. max는 파이썬 내장함수이기 때문에 변수이름으로 적절하지 않음
    2. 문자열 하나만 저장할려고 ans = [ ] *1로 크기지정 해준거였는데 그냥 ans = [ ]로 만 하면 되잖아;
    3. ans = dic.keys
      • 반환값을 dic.keys 객체로 직접 출력하면 문제가 발생함
      • 리스트로 변환해서 출력해야됌 -> ans = list(dic.keys())

1차 수정

#딕셔너리 이용해보기

word = input().strip().upper()

#print(word)

dic = {}

for Alp in word: #파이썬에서는 문자열은 Iterable object이기 때문에 한문자씩 읽을수 있음 우와~
    if Alp in dic:
        dic[Alp] +=1
    else:
        dic[Alp] = 1
        
#딕셔너리에서 가장 높은 숫자 찾기 , 같으면 -> ?

max_count = 0
ans = []

#print(dic.keys())
#print(dic.item()) 우리는 빈도수는 필요 없으니까 dic의 value값이랑 비교해서 key만 뽑아내면 되지 않을까?

for count in dic.values():
    if count > max_count:
        max_count = count
        ans = list(dic.keys())
    elif count == max_count:
        ans = "?"
        
print(ans) 
#print(dic)
#print(max_count)

 

  • 문제점
    • zZa 입력시 ans의 배열이 제대로 수정이 안되서 ['Z', 'A'] 이렇게 나옴
    • ans = list(dic.keys(count)) 같은 느낌으로 작성되면 좋을거 같은데 이런 의미로 할려면 list안에 for문으로 하는 방법 알려줘서 그냥 items( ) - dictionary함수 이용하기로함

⭐정답 코드⭐

 

#딕셔너리 이용해보기

word = input().strip().upper()

#print(word)

dic = {}

for Alp in word: #파이썬에서는 문자열은 Iterable object이기 때문에 한문자씩 읽을수 있음 우와~
    if Alp in dic:
        dic[Alp] +=1
    else:
        dic[Alp] = 1
        
#딕셔너리에서 가장 높은 숫자 찾기 , 같으면 -> ?

max_count = 0
ans = "?"

#print(dic.keys())
#print(dic.item()) 우리는 빈도수는 필요 없으니까 dic의 value값이랑 비교해서 key만 뽑아내면 되지 않을까?

for key, count in dic.items():
    if count > max_count:
        max_count = count
        ans = key
    elif count == max_count:
        ans = "?"
        
print(ans) 
#print(dic)
#print(max_count)
  • ans의 초기화 값을 ?로 설정해주고 items으로 순회하면서 key값은 ans에 때려박음

 

 


오늘의 한줄 후기

 

공부하자 파이썬, 공부하자 알고리즘