TIL 30 | 단어 공부 (백준 1157 python)

Gom·2021년 3월 6일
0

Algorithm

목록 보기
9/48
post-thumbnail
post-custom-banner

문제 바로가기

두 가지 방식으로 풀어보았다.
1번 방식으로 푸니 시간이 절반 이상 절약되었다.

1번 풀이

접근방식

  • 주어진 문장 내에 사용된 알파벳들만 for문을 돌려 사용 횟수를 계산한다.
  • 사용 횟수를 기준으로 내림차순 정렬한 뒤 0번째 인덱스와 1번째 인덱스를 비교하여 가장 많이 사용한 횟수가 2개 이상으로 확인되는 경우는 물음표를 출력하도록 한다.
word = str(input()).upper()

frequency_of_use = []

for char in set(word): #단어 내 중복을 없애고 사용된 알파벳만 추립니다.
    frequency = word.count(char) #해당 알파벳이 단어 안에서 몇 번 쓰였는 지 계산합니다.
    frequency_of_use.append([frequency,char])
frequency_of_use.sort(reverse=True)
if len(frequency_of_use) > 1 and frequency_of_use[0][0] == frequency_of_use[1][0]:
    print('?')
else:
    print(frequency_of_use[0][1])

코드풀이 및 사용개념

  • 반복문의 반복 횟수를 줄이기 위해 단어 내 사용된 알파벳만을 이용하여 for문을 돌린다. set()함수를 이용하여 집합 자료형으로 만들어 주었다. 집합 자료형은 중복을 허용하지 않아 자료형 전환 과정에서 중복이 모두 제거된다.

  • 문제 요건으로 최빈값이 여러 개인 경우 물음표를 출력하라고 주어졌다.
  • 정렬된 리스트의 0번째 인덱스와 1번째 인덱스의 횟수를 비교해주는 if문을 작성했다.
  • 하나의 알파벳만 사용한 단어는 1번째 인덱스가 존재하지 않아 Index error가 발생할 수 있다. 이를 방지하기 위해 리스트의 길이가 1을 초과한다는 조건을 추가했다.
  • 위의 경우를 제외하고 나머지의 경우는 가장 많이 사용한 알파벳을 출력하도록 한다.

2번 풀이

접근 방식

  • 알파벳과 발생횟수를 key:value형태로 저장한 뒤 value값을 기준으로 내림차순 정렬한다.
  • 정렬된 배열에서 발생횟수가 동일한 알파벳이 있는 지 확인하여 있다면 물음표를, 없다면 알파벳 대문자를 출력한다.
  • 반복횟수와 해당 알파벳을 frequency_of_use 리스트에 쌍으로 저장해준다. 반복횟수가 앞에 앞에 위치하는 이유는 정렬 시 key값을 지정해주는 과정을 생략하기 위해서이다.

정답코드


word = str(input()).upper()

count = {}

for char in word:
    if char in count:
        count[char] += 1
    else :
        count[char] = 1

sorted_count = sorted(count.items(), key = lambda x:x[1], reverse =True)

if len(sorted_count) > 1 :
    if sorted_count[0][1] == sorted_count[1][1]:
        print('?')
    else :
        print(sorted_count[0][0])
else :
        print(sorted_count[0][0])

# else문을 한 번만 적었더니 sorted_count 리스트에 값이 3개 이상일 때 값이 나오지 않는 에러가 발생했다.


코드풀이 및 사용개념

1. 입력 및 딕셔너리 생성

  • 문제 조건에 따라 입력받은 값을 대문자로 변환한다. upper()함수를 이용하였다.

2. 알파벳 반복횟수 체크

  • 단어를 알파벳별로 나누어 for문을 돌린다.
  • count라는 딕셔너리안에 해당 알파벳이 존재하면 value값을 1씩 증가시킨다.
  • sorted(count.items(), key = lambda x:x[1], reverse = True)를 이용하여 value값이 큰 순서대로 정렬하였다. 정렬을 한 이유는 최빈값 중복여부를 체크하기 위해서이다.

3. 최빈값 중복여부 체크 및 출력

  • 최빈값을 가진 알파벳이 중복될 경우 물음표를 표시하라는 것이 문제의 조건이다. 딕셔너리 값 내에서 중복여부를 찾아내는 방식을 고민하다가 value를 기준으로 내림차순으로 정렬 후 인덱스 0과 1에 해당하는 value값이 중복되는 지를 비교하는 방식으로 코드를 작성했다.
profile
안 되는 이유보다 가능한 방법을 찾을래요
post-custom-banner

0개의 댓글