알고리즘/백준

[BOJ#15663] N과 M (9)

Jinoo.keem 2024. 5. 28. 22:56
728x90

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

1 초 512 MB 42476 21160 16101 49.263%

문제

N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.

  • N개의 자연수 중에서 M개를 고른 수열

입력

첫째 줄에 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)

둘째 줄에 N개의 수가 주어진다. 입력으로 주어지는 수는 10,000보다 작거나 같은 자연수이다.

출력

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

수열은 사전 순으로 증가하는 순서로 출력해야 한다.


제출 코드

import sys
input = sys.stdin.readline

def recur():
    global result
    check = 0
    if len(num) == M:
        print(*num)
        return
    
    for i in range(N):
        if not vis[i] and check != lst[i]:
            vis[i] = True
            num.append(lst[i])
            check = lst[i]
            recur()
            num.pop()
            vis[i] = False
            
N, M = map(int, input().split())
lst = list(map(int, input().split()))
vis = [False] * N
num = []
lst.sort()            

recur()

기본 구조는 잘 설계하고 check 를 쓰는 과정이 오래걸렸다.

체크포인트를 설계하는게 늘 어렵다.. 

9, 9 를 내보내는게 어려웠는데 1, 7, 9, 9 일 때, 세번째 9를 들고있을 때 check는 7이다.

원래 들고있는 9는 if문에서 걸러지게 되고 9, 1 / 9, 7, / 9, 9 를 내보낼 수 있다.

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

[BOJ#15686] 치킨 배달  (1) 2024.06.07
[BOJ#1149] RGB거리  (1) 2024.06.04
[BOJ#19637] IF문 좀 대신 써줘  (0) 2024.05.28
[BOJ#1926] 그림  (0) 2024.05.28
[BOJ#14889] 스타트와 링크  (0) 2024.05.28