티스토리 뷰

알고리즘/BOJ

[BOJ-16936] 나3곱2

개발하는 후딘 2020. 3. 26. 02:14
728x90
반응형

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

 

16936번: 나3곱2

나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,

www.acmicpc.net


[풀이]

나는 DFS를 이용하여 풀었다.

DFS+ 재귀함수 를 활용해야한다.

 

그리고 문제입력에서 수열B는 수열A의 순서를 임의로 섞은 것이기때문에

B의 원소를 차례대로 DFS탐색해야한다.

 

B의 원소 x라 할때

먼저, x의 값이 B에 속하는지 확인한다.

그리고 x가 3의배수라면, x의 나3값인 x//3이 B에 속한다면 x//3을 추가한뒤에 DFS탐색한다.

그리고 3의배수 여부 상관없이, x의 곱2값인 x*2가 B에속한다면 x*2를 추가한뒤에 DFS탐색한다.

 

문제를 꼼꼼히 읽어보고

재귀를 활용한 백트래킹과 DFS를 할 줄 안다면 풀 수있다.


import sys
input=sys.stdin.readline
#입력#
N=int(input())
B=[*map(int, input().strip().split())]

def dfs(x, cnt, A):
    #연산횟수가  N-1회라면
    if cnt==N-1:
        return A
    
    #x가 B에 있는가?
    if x in B:
        #x가 3에 나눠떨어지는 수인가?->나3연산
        if x%3==0:
            #x//3값이 B에 있다면
            if (x//3) in B:
                return dfs(x//3, cnt+1, A+[x//3])
        # x*2값이 B에 있다면
        if (x*2) in B:
            return dfs(x*2, cnt+1, A+[x*2]) #곱2연산

for i in range(N):
    x=dfs(B[i], 0, [B[i]])
    if not (x is None):
        print(' '.join(map(str,x)))
        break

728x90
반응형

'알고리즘 > BOJ' 카테고리의 다른 글

[BOJ-1182] 부분수열의 합  (0) 2020.03.28
[BOJ-1261] 알고스팟  (0) 2020.03.27
[BOJ-1946] 신입사원  (0) 2020.03.25
[BOJ-14891] 톱니바퀴  (0) 2020.03.24
[BOJ-14500] 테트로미노  (0) 2020.03.21
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함