본문 바로가기

백준_알고리즘

[백준] 1475. 구현_방번호 - Python

문제

다솜이는 은진이의 옆집에 새로 이사왔다. 다솜이는 자기 방 번호를 예쁜 플라스틱 숫자로 문에 붙이려고 한다.

다솜이의 옆집에서는 플라스틱 숫자를 한 세트로 판다. 한 세트에는 0번부터 9번까지 숫자가 하나씩 들어있다. 다솜이의 방 번호가 주어졌을 때, 필요한 세트의 개수의 최솟값을 출력하시오. (6은 9를 뒤집어서 이용할 수 있고, 9는 6을 뒤집어서 이용할 수 있다.)

 

★ 잠깐! 풀기 전에 생각하기

계속 반복해야 하니까 재귀함수를 써야 하나...? 그런데 익숙하지가 않다.. 그림도 안그려진다..6, 9일 경우가 문제고 나머지는 구현하기 쉬우니 6, 9일경우만 따로 나누어서 생각하면 될 것 같다. 일단 해봤다.

 

import sys

input = sys.stdin.readline

n = list(map(int,input().strip()))

# 옆집에서 숫자 사다가 보관하는 박스를 만들었다.
# 세트를 산 횟수를 나타내는 cnt를 만들었다.
box = []
cnt = 0
# 천천히 한단계씩 생각해보자.
for num in n:
    # 6, 9인지 아닌지가 중요해서 나누었다.
    # 이후 그 숫자가 있는지, 그리고 뒤집혀 진게 있는지로 나누어야 한다.
    if num == 6 or num == 9:
        if 6 in box or 9 in box:
            if num in box:
                box.remove(num)
            else: # 리스트 빼기 부분인데.. 도저히 방법이 없어서 원소를 뺏다.
                change = [6, 9]
                change.remove(num)
                box.remove(change[0])
        # 박스에 6, 9가 없으면 세트 하나 넣어주고 하나 사용하자.
        else:
            box += [1,2,3,4,5,6,7,8,9,0]
            cnt += 1
            box.remove(num)
    # 6,9가 아니면 쉽다.
    else:
        if num in box:
            box.remove(num)
        else:
            box += [1,2,3,4,5,6,7,8,9,0]
            cnt += 1
            box.remove(num)

print(cnt)

생각보다 생각하는데 시간이 오래 걸렸다. 이런 문제는  처음이라서 그런가... 나중에 비슷한 문제가 나오면 또 이런 식으로 풀 것 같다. 생각을 유연하게 하는 게 중요하긴 한데... 현재는 비슷해 보이는 유형을 비슷하게 푸는 연습을 하고 있다. 수학같이....

구현 다른 문제도 풀었지만.. 답이 안나와서 해결하고 업로드해야겠다.

★ 해결 못한 문제.. '1996번. 프린터 큐'