http://acmicpc.net/problem/19940
{코드}
for _ in range(int(input())):
n = int(input())
buttons = [0]*5
sixties, tens, ones = n//60, (n % 60)//10, n % 10
if ones > 5:
tens += 1
ones -= 10
if tens > 3:
sixties += 1
tens -= 6
if tens < 0 and ones == 5:
tens += 1
ones -= 10
buttons[0] = sixties
buttons[2-(tens >= 0)] = abs(tens)
buttons[4-(ones >= 0)] = abs(ones)
print(*buttons)
{설명}
먼저 각 버튼을 누를 횟수를 저장할 buttons 리스트를 만든다. [60, 10, -10, 1, -1] 순서
그리고 주어진 수를 60, 10, 1이 각각 몇 개 필요한지 구한다. (최적화를 떠나서 기초값을 구하는 것) * 10의 자리 수는 6보다 작음
만약 일의 자리가 5보다 크다면 10을 더한 후 필요한 만큼 1의 자리를 빼는 것이 더 효율적이고 사전 순으로 앞선다.
만약 10의 자리가 3보다 크다면 60을 더한 후 10의 자리를 빼는 것이 더 효율적이고 사전순으로 앞선다.
일의 자리가 5인 경우 35와 55의 경우만 주의하면 된다.
35의 경우 3*10 + 5*1이며 55의 경우 1*60 - 5*1이다.
만약 첫번째 조건문에서 ones >= 5로 확인한다면 35의 경우에서 1*60 - 2*10 - 5*1이 되어 정답이 아니게 된다.
그렇기에 따로 조건문을 만들고 0~30대의 수는 일의 자리가 5인 경우 더하는 것이 더 효율적이기 때문에 이전 조건문에서 10의 자리가 6이 빠진, 즉 10의 자리가 3을 초과하는 수들만 해당 조건문에 들어오게 한다.
이제 답을 다 구했으므로 buttons 리스트에 넣기만 하면 된다.
이때, 더하는 버튼과 빼는 버튼은 인덱스가 1 차이므로 조건문을 사용해 맞는 인덱스에 들어가게 한다. (True는 1, False는 0의 값을 가짐)
'알고리즘 공부 > BOJ백준 풀이' 카테고리의 다른 글
[백준 9093번-C++/파이썬] 단어 뒤집기 (0) | 2021.04.07 |
---|---|
[백준 10828번 - C++] 스택 (0) | 2021.03.20 |
[백준 19939번-파이썬/Python] 박 터뜨리기 (0) | 2021.02.13 |
[백준 11653번-파이썬/Python] 소인수분해 (0) | 2021.01.07 |
[백준 10814번-파이썬/Python] 나이순 정렬 (0) | 2020.12.30 |