반응형
https://www.acmicpc.net/problem/15663
15663번: N과 M (9)
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해
www.acmicpc.net
내 코드
import sys
input = sys.stdin.readline
n, m = map(int, input().split())
num = sorted(list(map(int, input().split())))
tmp = []
visited =[False for _ in range(1000001)]
def dfs():
start =0
if len(tmp) == m:
print(*tmp)
return
for i in range(n):
if not visited[i] and start != num[i]:
tmp.append(num[i])
visited[i]=True
start = num[i]
dfs()
visited[i]=False
tmp.pop()
dfs()
다른 풀이(SET 이용)
import sys
input = sys.stdin.readline
n, m = map(int, input().split())
num = sorted(list(map(int, input().split())))
tmp = []
visited =[False for _ in range(1000001)]
ans =[]
def dfs(start):
if len(tmp) == m:
ans.append(tmp[:])
return
for i in range(n):
if not visited[i]:
tmp.append(num[i])
visited[i]=True
dfs(num[i])
visited[i]=False
tmp.pop()
dfs(0)
ans = sorted(list(set(map(tuple, ans))))
for i in ans:
print(*i, sep=' ')
dfs, 같은 수라면 한 번만! 순열
푸는데 많은 시간 동안 붙잡고 고민했다..
이번 문제는 9 7 9 1이라는 수를 입력받으면 9 9는 한 번만 출력되어야 한다. 그런데 내 코드는 계속 9 9가 두 번 출력되었다.
그래서 이걸 해결하기 위해 두 조건을 만들었다.
1. prev 라는 변수에 바로 직전의 수를 저장하고, 그 수와 현재의 수가 같은지 검사
2. visited를 통해 이미 방문을 했는지 안했는지 검사
이 두 조건을 동시에 만족하는 수열만이 통과할 수 있도록 했다.
그리고 이를 저장한 후 SET로 중복 제거를 해주었다.
반응형
'코딩테스트 대비 > 백준(BOJ)' 카테고리의 다른 글
| [Python][백준/BOJ] 15665번 : N과 M (11) (0) | 2023.06.28 |
|---|---|
| [Python][백준/BOJ] 15664번 : N과 M (10) (0) | 2023.06.27 |
| [Python][백준/BOJ] 15657번 : N과 M (8) (0) | 2023.06.26 |
| [Python][백준/BOJ] 15656번 : N과 M (7) (0) | 2023.06.26 |
| [Python][백준/BOJ] 15655번 : N과 M (6) (0) | 2023.06.26 |