https://www.acmicpc.net/problem/1475
(실버 5 문제, 30분 걸림)
1475번: 방 번호
첫째 줄에 다솜이의 방 번호 N이 주어진다. N은 1,000,000보다 작거나 같은 자연수이다.
www.acmicpc.net
생각
처음 15분 정도 동안은 9의 갯수와 6의 갯수를 전부 세고 비교하여 계산하는 방식으로 구현하려고 했다.
하지만 조금 더 생각해본 결과, 9가 나온 경우, 9를 6으로 바꿔도 된다는 사실을 알게 되었다.
9를 6으로 바꾸고 난 후 어떤 문제가 생길지 생각을 해보니 홀수 번 등장했냐, 짝수 번 등장했냐에 따라 계산식을 달리 결정해야한다는 것을 알았다.
내 코드
# s를 문자의 형태로 입력받는다. 리스트에 추가하기 위한 A 반복문 적용을 위해 문자로 받는다.
s = input()
# 받은 s에서 9를 6으로 변환하고 각각의 자리수들을 숫자로 저장하기 위한 리스트
number = []
# 반복문 A
for i in s:
# 9일시 6으로 변환한다.
if i == '9':
i = '6'
# 그 후 정수 형태로 저장해서 number에 추가한다. B 반복문 작업을 위한 정수 형태의 저장이다.
number.append(int(i))
# 각각의 정수들이 몇번 등장했는지 저장하기 위한 리스트다.
result = [0] * 9
# 반복문 B
for i in range(9):
# 각각의 숫자에 대해 몇번 나왔는지 센다
temp = number.count(i)
# 6 숫자의 경우 찍수번 등장시 (횟수//2)개의 세트가 필요하고, 홀수번 등장시 (횟수//2)+1개의 세트가 필요하다.
if i == 6:
if temp % 2 == 0:
temp //= 2
else:
temp = temp // 2 + 1
# i번째 자리에 i가 나온 횟수를 저장한다.
result[i] = temp
# 최댓값 출력시 필요한 세트의 개수가 나온다.
print(max(result))
다른 풀이
N = input()
room = {'0':0, '1':0, '2':0, '3':0, '4':0, '5':0, '6':0, '7':0, '8':0} # 딕셔너리 설정, 9는 6으로 취급하고 딕셔너리에서 뺌
for i in range(len(N)):
if N[i] in ['6','9']: # N[i]가 '6', '9' 중 하나라면
room['6'] += 1 # 딕셔너리 '6'에 값을 1씩 추가
else:
room[N[i]] += 1 # 아니면 room에서 N[i] 인덱스값에 해당하는 value값에 1을 추가
if room['6']%2==0:
room['6'] = room['6'] // 2 # room['6']에 값은 '9'일 때 추가한 값도 함께 있기 때문에 짝수면 2로 나누고
else:
room['6']= room['6']//2+1 # 2로 나누고 1을 더함
print(max(room.values())) # 딕셔너리 값 중 가장 큰 값 출력
다른 풀이의 경우 딕셔너리를 활용하였다.
느낀 점
- 아무래도 구현 문제에 대해서 사고하는 방향성이 처음에 잘못되는 경우가 있다. 가령 이번 문제의 경우 Counter를 이용해서 풀어보려고 했으나, Counter 함수의 사용 방법을 잘 모르는 상태로 적용하려고 해서 시간 낭비를 하였다.
- 리스트 위주로 풀려고 하는 경향이 크다. 아무래도 리스트를 제일 잘 이해하고 있고, 대부분의 문제에서 리스트를 사용하는 만큼 의존도가 높아진거 같다.
- 딕셔너리의 활용도가 떨어진다. 딕셔너리의 경우 개념을 알고는 있으나, 막상 문제에 적용하려고 하면 적용하기 힘들다. 해시맵 문제들을 연습해서 숙련도를 올릴 필요가 있다.
'알고리즘 공부 > 연습 문제' 카테고리의 다른 글
이코테) 게임 개발-실전 문제 (0) | 2023.11.23 |
---|---|
백준) 1463 - 1로 만들기 (Python) (1) | 2023.10.21 |
백준) 1244 - 파이썬 (0) | 2023.09.18 |
백준) 10431 - 파이썬 (0) | 2023.09.07 |
백준) 11723 - 파이썬 (0) | 2023.09.06 |