https://www.acmicpc.net/problem/16936
더보기
문제
나3곱2 게임은 정수 하나를 이용한다. 가장 먼저, 정수 x로 시작하고, 연산을 N-1번 적용한다. 적용할 수 있는 연산은 두 가지 있고, 아래와 같다.
- 나3: x를 3으로 나눈다. x는 3으로 나누어 떨어져야 한다.
- 곱2: x에 2를 곱한다.
나3곱2 게임을 진행하면서, 만든 수를 모두 기록하면 수열 A를 만들 수 있다. 예를 들어, x = 9, N = 6이고, 적용한 연산이 곱2, 곱2, 나3, 곱2, 나3인 경우에 A = [9, 18, 36, 12, 24, 8] 이다.
수열 A의 순서를 섞은 수열 B가 주어졌을 때, 수열 A를 구해보자.
입력
첫째 줄에 수열의 크기 N(2 ≤ N ≤ 100)이 주어진다. 둘째 줄에는 수열 B가 주어진다. B에 포함된 원소는 1018 보다 작거나 같은 자연수이다.
출력
나3곱2 게임의 결과 수열 A를 출력한다. 항상 정답이 존재하는 경우에만 입력으로 주어지며, 가능한 정답이 여러가지인 경우에는 아무거나 출력한다.
문제 풀이 순서는 다음과 같다.
(1) N개의 정수를 count 배열에 넣는다. (collections.Counter 사용)
(2) N개 중 1개를 시작 x값으로 선택, 나3 or 곱2 값이 count 배열에 있을 경우 이 값을 다음 x로 dfs를 수행
(3) x값을 넣은 res배열의 크기가 N과 같아지면 이 배열의 원소를 출력.
import sys
from collections import Counter
def dfs(num):
global res
if(len(res) == N):
print(*res)
return
#나3
if num%3 == 0 and (num//3 in cnt and cnt[num//3] > 0):
cnt[num//3] -= 1
res.append(num//3)
dfs(num//3)
cnt[num//3] += 1
res.pop()
#곱2
if num*2 in cnt and cnt[num*2] > 0:
cnt[num*2] -= 1
res.append(num*2)
dfs(num*2)
cnt[num*2] += 1
res.pop()
### MAIN
N = int(sys.stdin.readline())
li = list(map(int, sys.stdin.readline().split()))
cnt = Counter(li)
res = []
for key in cnt.keys():
cnt[key] -= 1
res.append(key)
dfs(key)
cnt[key] += 1
res.pop()
'Algorithm > 문제풀이' 카테고리의 다른 글
[Python][백준] 2667_단지번호붙이기 (0) | 2021.07.05 |
---|---|
[Python][백준] 1110_더하기 사이클 (0) | 2021.07.05 |
[Python][백준] 16924_십자가 찾기 (0) | 2021.07.03 |
[Python][백준] 16968_차량 번호판 1 (0) | 2021.06.06 |
[Python][백준] 1107_리모컨 (0) | 2021.06.06 |