티스토리 뷰

알고리즘/백준

15663번 N과M(9) 백준

글을 쓰는 개발자 2020. 12. 6. 19:36
반응형

문제: www.acmicpc.net/problem/15663

 

15663번: N과 M (9)

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

www.acmicpc.net

 

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
32
33
34
35
import sys
N,M = map(int,sys.stdin.readline().split())
li=[int(i) for i in sys.stdin.readline().split()]
check=[0]*10001
passing=[0]*10001
init=[False]*10001
for i in li:
    check[i]+=1
dic = set(li)
li=list(dic)
li.sort()
ans=[]
 
def func(celi):
    if celi==M:
        print(' '.join(ans))
        return
    for i in range(len(li)):
        if not ans:
            if init[li[i]]!=True:
                init[li[i]]=True
                passing[li[i]]=1
                ans.append(str(li[i]))
                func(celi+1)
                passing[li[i]]=0
                ans.pop()
        else:
            if passing[li[i]]<check[li[i]]:
                passing[li[i]]+=1
                ans.append(str(li[i]))
                func(celi+1)
                passing[li[i]]-=1
                ans.pop()
 
func(0)
cs

check는 해당하는 숫자가 총 몇 개인지 카운팅하는 배열이다. 

passing 리스트는 현재 몇 개의 갯수가 있는지 확인하는 배열이다.

init은 처음에 중복되는 숫자가 나오지 않게 하기 위한 배열이다.

그리고 처음에 받은 li의 리스트 값을 집합에 넣은 다음 다시 리스트를 넣음으로써 중복제거를 하였다.

 

시간은 꽤 빠른 편에 속했지만 코드의 길이가 너무 길어서 다른 분들은 어떻게 했나 봤다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from itertools import permutations
 
N, M = map(int, input().split())
N_list = list(map(int, input().split()))
N_list = sorted(N_list) #순서대로 나오게 정렬 먼저
 
output = []
for numbers in list(permutations(N_list, M)):
    output.append(numbers)
output = sorted(list(set(output))) #중복 제거 후 정렬 까지 한번에!
 
for numbers in output:
    for num in numbers:
        print(num, end=' ')
    print()
cs

참고:https://claude-u.tistory.com/311

 

#260 백준 파이썬 [15663] N과 M (9) - 순열

https://www.acmicpc.net/problem/15663 Solution 리스트에 먼저 permutation 함수를 이용해 전부를 추가해주고 중복된 항목만 걸러주면 된다. 비효율적이지만 쉬운 set() 집합 함수를 이용해서 중복을 걸러주었..

claude-u.tistory.com

이 분은 permutations라는 파이썬에서 제공하는 라이브러리로 해결하였다. 

 

반응형

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

10972번 다음 순열 백준  (0) 2020.12.06
15664번 N과M(10) 백준  (0) 2020.12.06
1107번 리모컨 백준  (0) 2020.12.05
RGB거리2 17404번 백준  (0) 2020.12.04
카잉 달력 6064번 백준  (0) 2020.12.04
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함