Algorithm/문제풀이

[Python][백준] 16936_나3곱2

Deveun 2021. 7. 4. 01:14

https://www.acmicpc.net/problem/16936

 

16936번: 나3곱2

나3곱2 게임은 정수 하나를 이용한다. 가장 먼저, 정수 x로 시작하고, 연산을 N-1번 적용한다. 적용할 수 있는 연산은 두 가지 있고, 아래와 같다. 나3: x를 3으로 나눈다. x는 3으로 나누어 떨어져야

www.acmicpc.net

더보기

문제

나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()