본문 바로가기

ALGORITHM

알고리즘 스터디, 03: 백준 1475번, 방 번호 [PYTHON][파이썬]

문제

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

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

 

입력

첫째 줄에 다솜이의 방 번호 N이 주어진다. N은 1,000,000보다 작거나 같은 자연수이다.

 

출력

첫째 줄에 필요한 세트의 개수를 출력한다.

 

시사점

1. 숫자세트는 한 세트에 0부터 9까지로 이루어져 있다는 것.

2. 6은 9를 뒤집어, 9는 6을 뒤집어 사용할 수 있다는 것.

 

num = input()
nums = [0 for i in range(9)]

for i in num:
    if int(i) == 9:
        nums[6] += 1
    else:
        nums[int(i)] += 1
nums[6]/=2; nums[6]+=0.5

print(int(max(nums)))
num = input() 
으로 방의 호수를 입력받는다.
 
nums = [0 for i in range(9)]
리스트의 길이를 지정하고, 초기화 해준다.
이때, 파이썬에서의 리스트 생성 방법은 list = [] 이며, 
리스트 길이를 지정하고 0으로 초기화 할 때는, list = [0 for i in range(n)]임을 알고 있자.
 
for i in num:
    if int(i) == 9:
        nums[6] += 1
    else:
        nums[int(i)] += 1
만약 입력받은 방의 호수에 9가 들어간다면, 리스트 nums[6]의 값에 1을 더해준다
그러나 9가 들어가지 않았다면 리스트 nums[i] 값에 1을 더해준다.
 
nums[6]/=2; nums[6]+=0.5
이후 for문이 전부 돈 후에 nums[6]의 값을 반을 나눠준 후 그 값에 0.5를 더해준다.
왜냐? 기존 9을 6의 값으로 보았기에 9가 나왔을 때는 6에 값을 ++ 해주었다.
그렇기에 6의 중복값을 제거하기위해 세트로 합산할 때는 반으로 나누는게 맞다. 
다만, 0.5개를 추가하는 이유는 짝수일 경우 0.5를 추가한다 한들 정수 부분은 안바뀌지만,
홀수일 경우 0.5를 추가한다면 정수 부분이 +1이 된다.
그래도 되는 이유가 홀수개의 경우 플라스틱 숫자판을 한세트를 더 필요로 하기 때문이다.
 
이후 정리된 nums를 출력하면 끝이 난다

 

더보기

오답

 

푸는 방법은, 

방의 번호 num 을 받고 for문을 num의 길이, 즉 방 홋수의 길이만큼 돌린다.

이때, 0~9까지 6이나 9가 나온다면 six라는 변수에 1을 더해준다.

반면에, 6이나 9가 나오지 않는 다면 room이라는 변수에 1을 더해준다.

 

결과를 구하자.

six의 값이 짝수라면 six%2 값을 room에 더해주고,

six의 값이 홀수라면 six%2 +1의 값을 room에 더해준 뒤,

room의 값을 print해주면 끝난다. 

 

왜 짝수 홀수를 구분해야하냐면,

예를 들었을 떄, 6이 2개가 필요할 땐, 6과 9로 1세트가 필요하겠지만,

666 처럼 3개가 필요할 땐 6이 2개, 9가 1개로 2세트가 필요하기 때문이다.

 

number =  map(int, input().split())

six=0
room=0

for number in number:
    if number==6 or number==9 :
        six += 1
    else : 
        room = room + 1
if six % 2 == 0 :
    room += (six//2)
else :
    room = room + (six//2) + 1
    
print(room)