티스토리 뷰

알고리즘/백준

백준 16936 나3곱2 python3

4567은 소수 2021. 9. 21. 02:19

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

 

16936번: 나3곱2

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

www.acmicpc.net

주어진 입력이 처음에 어떤 수열인지 판단하는 문제입니다.

규칙은 간단합니다.

x 부터 시작해 x가 3의 배수이면 3으로 나눌 수 있고, x가 어떤 수든 2를 곱할 수 있습니다.

 

3을 나누고 2를 곱하는 규칙 밖에 없으므로 배열에서 중복된 값이 나올 수는 없습니다. 

왜냐하면 x 를 기준으로 y가 되었는데 x = y 라고 한다면 (x / 3^n) * 2^m = y 인 것이고, 이는 2^m / 3^n = 1을 만족하는 m, n 이 존재하는 것입니다. 하지만 2와 3은 서로소이므로 m, n은 0 밖에 없습니다.

즉 중복이 되는 경우는 없습니다.

 

그러므로 주어진 배열의 수를 순서대로 2를 곱하고 3으로 나눌 수 있으면 나누고를 dfs와 유사하게 진행하여 최종적으로 전체 배열의 원소를 다 탐색하게 된다면 정답이 됩니다.

 

이 때 index 별로 탐색 여부를 확인하거나 해도 되지만, 중복이 없으므로 단순히 카운트로 탐색 여부를 확인하여도 됩니다.

 

코드는 다음과 같습니다.

n = int(input())
arr = list(map(int,input().split()))

# 3으로 나누거나 2를 곱하므로 중복 불가
def calc(num, cnt, arr, result):
    num2 = num * 2
    num3 = num // 3
    r = num % 3
    
    if cnt == len(arr):
        return result
    
    if num2 in arr:
        result.append(num2)
        return calc(num2, cnt + 1, arr, result)
    
    elif r == 0 and num3 in arr:
        result.append(num3)
        return calc(num3, cnt + 1, arr, result)
    
    else:
        result = []
        cnt = 0
        return result
        
def print_list(List):
    for i in range(len(List)):
        print(List[i], end = ' ')

for num in arr:
    result = [num]
    result = calc(num, 1, arr, result)
    
    if len(result) == len(arr):
        print_list(result)
        break

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

백준 4811 알약 C++  (0) 2021.11.06
백준 14226 이모티콘 C++  (0) 2021.11.04
백준 C++ 1525 퍼즐  (0) 2021.09.20
백준 1647 도시 분할 계획 C++  (0) 2021.09.11
백준 20057 마법사 상어와 토네이도 C++  (0) 2021.09.05
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2025/01   »
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
글 보관함