본문 바로가기

PS

[BOJ] 15664번 N과 M (10) 문제

www.acmicpc.net/problem/15664

 

15664번: N과 M (10)

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해

www.acmicpc.net

 

꽤나 곤란했던 문제다.

 

2번 예시 처럼

 

9 7 9 1이 주어졌을 때, 9가 두개라서 9 9가 나타나지만 1 9 는 한번만 나타나야 한다.

 

따라서 overlap 이라는 변수를 통해서 해당 depth 에서 그 수를 사용했는지 안했는지를 구분했다.

 

어차피 정렬이 되어있기 때문에, 같은 수가 중복 사용되는 경우는 다 걸러 낼 수 있다.

 

 


N, M = map(int, input().split())

numbers = list(map(int, input().split()))
numbers.sort()

visited = [0] * N
element = []
def dfs(depth):

    if depth == M:
        print(*element)
        return

    overlap = 0
    for i in range(depth, N):
        if not element:
            if numbers[i] != overlap:
                element.append(numbers[i])
                visited[i] = 1
                overlap = numbers[i]
                dfs(depth+1)
                element.pop()
                visited[i] = 0
        else:
            if numbers[i] >= element[-1] and visited[i] == 0 and numbers[i] != overlap:
                element.append(numbers[i])
                visited[i] = 1
                overlap = numbers[i]
                dfs(depth+1)
                element.pop()
                visited[i] = 0

dfs(0)

'PS' 카테고리의 다른 글

[BOJ] 1309번 동물원 문제 - Python  (0) 2021.03.08
[BOJ] 15666번 N과 M (12) 문제 - Python  (0) 2021.03.04
[BOJ] 15665번 N과 M (11) 문제  (0) 2021.03.03
[BOJ] 2153번 소수 단어 문제  (0) 2021.01.19
BOJ - 2133번 타일 채우기  (0) 2020.09.08