본문 바로가기

알고리즘 공부/연습 문제

백준) 1475-방 번호 (파이썬)

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()))       # 딕셔너리 값 중 가장 큰 값 출력

다른 풀이의 경우 딕셔너리를 활용하였다.

 

느낀 점

  1. 아무래도 구현 문제에 대해서 사고하는 방향성이 처음에 잘못되는 경우가 있다. 가령 이번 문제의 경우 Counter를 이용해서 풀어보려고 했으나, Counter 함수의 사용 방법을 잘 모르는 상태로 적용하려고 해서 시간 낭비를 하였다.
  2. 리스트 위주로 풀려고 하는 경향이 크다. 아무래도 리스트를 제일 잘 이해하고 있고, 대부분의 문제에서 리스트를 사용하는 만큼 의존도가 높아진거 같다.
  3. 딕셔너리의 활용도가 떨어진다. 딕셔너리의 경우 개념을 알고는 있으나, 막상 문제에 적용하려고 하면 적용하기 힘들다. 해시맵 문제들을 연습해서 숙련도를 올릴 필요가 있다.

'알고리즘 공부 > 연습 문제' 카테고리의 다른 글

이코테) 게임 개발-실전 문제  (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