1. 학습목표
백준에서 알고리즘 문제들을 풀어보자. 브론즈 문제부터 풀어보며 수준을 확인하면서 조금씩 늘려보자
2. 학습내용
항상 겪는 상황이 코드를 어떻게 구성해야 한다라는 것은 알지만 이를 직접 짤 때 항상 어려움을 느낌. 그래서 이번에는 생각한 것을 나타내는 함수들이 있는지 찾아보면서 구현을 해봄
# 10250번
test_case = int(input())
for i in range(test_case):
h, w, n = map(int, input().split( ))
floor = n % h
room = (n // h) + 1
if floor == 0:
floor = h
room -= 1
print(floor*100 + room)
*나머지와 몫을 이용해야 한다는 규칙을 찾는데 시간이 좀 많이 걸렸다. 추가적으로 조건에 floor 가 0일 경우에는 해당 가장 높은 층 수에 위치할 수 밖에 없어서 조건을 줘야 한다. 층 수와 마지막 사람 수가 같은 경우에는 엘레베이터에서 가장 가까운 끝이 1로 끝나는 호실에 위치할 수 밖에 없어서 이를 나타내 주었다.
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
* 아래 문제는 두 가지의 풀이 방법이 생각났다. 내가 문제를 풀 때 가장 먼저 생각난 것은 딕셔너리를 이용하는 것이라서 이 를 구현해보았다.
# 1157번
input_str = input().upper()
char_dict = {}
for char in input_str:
if char in char_dict:
char_dict[char] += 1
else:
char_dict[char] = 1
m = max(char_dict.values())
answer = []
for key, value in char_dict.items():
if value == m:
answer.append(key.upper())
if len(answer) == 1:
print(answer[0])
else:
print("?")
먼저 입력을 받을 때 대문자로만 받거나 소문자로만 받아줘야 한다. 이 이유는 뒤에 코드 설명하고서 이야기하겠다.
- 딕셔너리는 입력 받은 문자열을 하나하나 쪼갠 단어들을 키로 갖는다. for문을 이용해서 각 키에 value 값을 주는데 이 때 같은 단어가 존재하면 키 값을 더해주고 처음 나오는 단어일 경우 1로 초기화 해준다.
- 값 중 가장 큰 value 값을 변수에 저장해준다.
- for 문은 딕셔너리의 각 키-value 값 쌍을 반복한다. 딕셔너리를 순환하면서 value 값이 m과 같은 것이 있는지 찾는다. 리스트 answer를 이용하여 m의 값을 가지는 key값을 대문자로 리스트에 추가한다.
- 이때 리스트의 길이가 1보다 길다면 개수가 m개인 단어가 2개 이상이라는 것이므로 문제의 조건에 따라 ?를 출력해주고 1개일 경우 그 리스트의 0번째 요소, 즉 개수가 m개인 key값을 출력해준다.
처음에 입력을 대문자나 소문자로 받아야 하는 이유는 사진의 테스트 케이스처럼 대소문자가 모두 입력이 되었을 때 하나로 받아야 처리가 된다. 만약 그냥 input()을 하면 z:1, Z:1 이 딕셔너리에 추가되므로 결과가 ?가 출력 되는 상황이 생긴다.
word = input().upper()
word_list = list(set(word))
cnt = []
for i in word_list:
count = word.count
cnt.append(count(i))
if cnt.count(max(cnt)) > 1:
print("?")
else:
print(word_list[(cnt.index(max(cnt)))])
해결하고 보니 이 방식이 더 코드가 간단했다^^.
- 대문자로 문자열을 입력을 받아주고 set을 이용해 중복을 제거하여 리스트에 저장하여 준다.
- cnt 리스트는 단어의 개수들을 저장할 리스트이고 count() 를 이용해 중복을 제거한 단어들의 개수를 구하고 생성한 리스트에 추가한다.
- cnt 리스트에 존재하는 단어의 갯 수 중 최대로 큰 수가 같은 것이 존재한다면 ? 를 출력하고 그 외의 경우 그 값을 출력해준다.
이 코드에서의 핵심은 set을 이용해 중복을 제거하고 count(), index() 를 이용하여 나타냈다는 것이다.
느낀 점: 단순구현 문제도 이렇게 어려움을 느낄 줄은 몰랐다. 그만큼 내가 코딩에 얼마나 약한지 알 수 있어서 다행이라고 생각했다. 남은 2회차 동안은 이런 단순 구현을 비롯해서 알고리즘들을 구현해 보는 연습을 하려고 한다.