Skip to content

Commit 60fdf44

Browse files
authored
Merge branch 'AlgorithmStudy-Allumbus:main' into main
2 parents 202bdec + 83724d0 commit 60fdf44

File tree

2 files changed

+126
-0
lines changed

2 files changed

+126
-0
lines changed
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
"""
2+
λ°±μ€€ # 15652.Nκ³Ό M(4)
3+
https://www.acmicpc.net/problem/15652
4+
5+
[문제]
6+
- μžμ—°μˆ˜ 1~ N 쀑 M 개 κ³ λ₯Έ μˆ˜μ—΄ => μž¬κ·€ν•¨μˆ˜
7+
- 같은 수 쀑볡 μ‚¬μš© , μ€‘λ³΅λ˜λŠ” μˆ˜μ—΄μ€ 닀쀑 좜λ ₯ λΆˆκ°€λŠ₯
8+
- κ³ λ₯Έ μˆ˜μ—΄μ€ μ˜€λ¦„μ°¨μˆœ
9+
- 좜λ ₯은 μ˜€λ¦„μ°¨μˆœ => - μ›μ†Œκ°€ 1~ Nμž„μœΌλ‘œ 이미 μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬λ˜μ–΄ 있음(κ³ λ €x)
10+
[flow]
11+
1. check λ₯Ό mxn 의 ν–‰λ ¬λ‘œ μ‚¬μš© μ—¬λΆ€ 확인(쀑볡 μ‚¬μš©κ³Ό 쀑볡 μˆ˜μ—΄ λ°©μ§€λ₯Ό μœ„ν•΄)
12+
2. μž¬κ·€ν•¨μˆ˜λ‘œ 쑰건에 ν•΄λ‹Ήν•˜λŠ” ν•¨μˆ˜ 좜λ ₯
13+
- λ§€κ°œλ³€μˆ˜ m = result 에 λ“€μ–΄κ°„ μ›μ†Œλ“€ 개수 = ν˜„μž¬ λ“€μ–΄κ°ˆ 자리수
14+
(1) m == M ,즉 resultμ•ˆμ— M 개 λ“€μ–΄κ°€ 있으면, 좜λ ₯
15+
(2) m번째 μžλ¦¬μ— n이 λ“€μ–΄κ°„ κ²½ν—˜μ΄ μžˆλŠ”μ§€ 확인 - check[m][n-1] == 0
16+
-> μ‚¬μš© κ°€λŠ₯
17+
쑰건 2 : 첫 result μ›μ†Œλ©΄ λ°”λ‘œ 등둝
18+
쑰건 3 : μ•„λ‹ˆλ©΄ , 이전 μžλ¦¬μˆ˜μ— λ“±λ‘λœ result μ›μ†Œ 값보닀 컀야지 등둝
19+
- λ“±λ‘μ‹œ(result[m] = n) , check에도 μ‚¬μš© 쀑 λ“±λ‘ν•˜κΈ°( check[m][n-1] = 1)
20+
(3)m+1 인 μž¬κ·€ ν•¨μˆ˜ μˆ˜ν–‰
21+
(4) m 번째 μžλ¦¬μˆ˜μ—μ„œ λ“€μ–΄κ°ˆ 1~N수 탐색 μ™„λ£Œν•˜λ©΄
22+
-> check[m] 은 λͺ¨λ‘ 0으둜 λ¦¬μ…‹ν•˜κ³ , m-1 자리수둜 backtracking
23+
24+
"""
25+
26+
import sys
27+
N, M = map(int, sys.stdin.readline().split())
28+
# 1. λ³€μˆ˜ μ •μ˜
29+
result = [0 for _ in range(M)]
30+
check= [[0 for _ in range(N)] for i in range(M) ] # row : m번째 μœ„μΉ˜ , column : N개 후보ꡰ μ›μ†Œλ“€μ˜ m번째 μžλ¦¬μˆ˜μ— μ‚¬μš© μ—¬λΆ€
31+
32+
33+
def perm(m) :
34+
if m == M :
35+
print(*result)
36+
else : # m : 0,1,2 ...M-1
37+
for n in range(1, N+1) :
38+
# print(f"before m : {m} /n {n} -> check {check[m]}")
39+
if check[m][n-1] == 0 : # 빈 자리
40+
if (m == 0) or (m < M and n >= result[m-1]) : # 첫번쨰 자리 등둝 심사 -> pass
41+
result[m] = n # μ‚¬μš© 쀑 # κ·Έμ™Έμ˜ 자리 등둝 심사 -> 이전 자리수 <= ν˜„μž¬ 자리수 쑰건 만쑱(쀑볡 좜λ ₯ λ°©μ§€)
42+
check[m][n-1] = 1
43+
# print(f"m : {m} /n {n} -> check {check[m]}")
44+
# print(f"result { result}")
45+
perm(m+1)
46+
47+
# m 번째 μžλ¦¬μ—μ„œ λ“€μ–΄κ°ˆ 1~N수 탐색 μ™„λ£Œ
48+
# 그러면 check[m] 은 0으둜 리셋
49+
check[m] = [0 for j in range(N)]
50+
51+
perm(0)
52+
53+
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
"""
2+
#15654. Nκ³Ό M (5)
3+
https://www.acmicpc.net/problem/15654
4+
5+
- N개의 μ›μ†Œλ“€λ‘œ κ΅¬μ„±λœ μˆ˜μ—΄ 쀑, κ°œμˆ˜κ°€ m개인 μˆ˜μ—΄λ“€ μ°ΎκΈ°
6+
- μ‚¬μ „μˆœ = μ˜€λ¦„μ°¨μˆœμœΌλ‘œ 좜λ ₯
7+
- μ€‘λ³΅λ˜λŠ” μˆ˜μ—΄ => μž¬κ·€
8+
# TIL
9+
q = [1,2,3]
10+
print(*q) > 1,2,3 # ν•œμ€„λ‘œ 리슀트 μ›μ†Œλ“€ 좜λ ₯ κ°€λŠ₯
11+
"""
12+
import sys
13+
14+
#0. μž…λ ₯ λ°›κΈ°
15+
N , M = map(int, sys.stdin.readline().split())
16+
# M개의 μˆ˜μ—΄ κ²°κ³Όλ₯Ό μ €μž₯ν•  λ°°μ—΄
17+
result = [0 for _ in range(M)]
18+
# ν•΄λ‹Ή μ›μ†Œ μ‚¬μš© μ—¬λΆ€ check ν•¨μˆ˜
19+
check = [0 for _ in range(N)]
20+
# n 개 μˆ˜μ—΄ μ›μ†Œ 후보ꡰ μ €μž₯ν•˜λŠ” 리슀트
21+
elements = list(map(int, sys.stdin.readline().split()))
22+
#μ˜€λ¦„ 차순 μ •λ ¬ for μ˜€λ¦„μ°¨μˆœ κ²°κ³Ό 좜λ ₯
23+
elements.sort()
24+
# print(elements)
25+
26+
# 1. m 개 μˆ˜μ—΄ μ°ΎκΈ° by μž¬κ·€ ν•¨μˆ˜
27+
"""
28+
def fun(n) :
29+
if μž¬κ·€μ’…λ£Œ 쑰건
30+
else :
31+
μž¬κ·€λ‘œ λ‹€μŒ μŠ€ν…Œμ΄μ§€λ‘œ λ„˜μ–΄κ°€κΈ° 전에 μ‹€ν–‰ν•˜λŠ” μ½”λ“œλ“€
32+
fun(n+-1) # μž¬κ·€
33+
이전 μž¬κ·€ ν•¨μˆ˜μ˜ μž¬κ·€μ’…λ£Œ 쑰건 μ’…λ£Œ ν›„ μ‹€ν–‰
34+
35+
"""
36+
37+
# start point
38+
def perm(m) : # m : result μ•ˆμ— λ“€μ–΄κ°€μžˆλŠ” μ›μ†Œ 개수 = 넣을 μœ„μΉ˜
39+
if m == M : # result 개수 κ°™μœΌλ©΄ = μž¬κ·€ μ’…λ£Œ 쑰건
40+
print(*result) # 좜λ ₯
41+
42+
else :
43+
for i in range(N) : # 더 뽑아야 ν•˜λ©΄ , N 개 후보ꡰ 쀑에 확인
44+
if check[i] == 0 : #ν˜„μž¬ ν›„λ³΄μ›μ†Œ(i) μ‚¬μš© κ°€λŠ₯함
45+
result[m] = elements[i] # result에 등둝
46+
check[i] = 1 # μ‚¬μš©μ€‘
47+
perm(m+1) # result 에 m+1 개 λ“€μ–΄κ°€ 있음
48+
check[i] = 0 # μ‚¬μš© μ™„λ£Œ
49+
50+
perm(0 )
51+
52+
"""
53+
# (μΆ”κ°€)μš”κ±΄ 좜λ ₯된 μˆœμ—΄ 쀑에 쀑볡 없이 좜λ ₯λ˜λŠ” 경우
54+
55+
# start point
56+
def perm(m , start_point) : # m : result μ•ˆμ— λ“€μ–΄κ°€μžˆλŠ” μ›μ†Œ 개수 = 넣을 μœ„μΉ˜
57+
if m == M : # result 개수 κ°™μœΌλ©΄ = μž¬κ·€ μ’…λ£Œ 쑰건
58+
print(*result) # 좜λ ₯
59+
# print(check)
60+
for s in range(start_point+1,N):
61+
check[s] = 0 # μ‚¬μš© μ™„λ£Œ
62+
# print(f"ν˜„μž¬ ; {check}")
63+
else :
64+
for i in range(N) : # 더 뽑아야 ν•˜λ©΄ , N 개 후보ꡰ 쀑에 확인
65+
if check[i] == 0 : #ν˜„μž¬ ν›„λ³΄μ›μ†Œ(i) μ‚¬μš© κ°€λŠ₯함
66+
result[m] = elements[i] # result에 등둝
67+
check[i] = 1 # μ‚¬μš©μ€‘
68+
# print(f"μ—…λ°μ΄νŠΈ 쀑 {check}")
69+
perm(m+1, start_point) # result 에 m+1 개 λ“€μ–΄κ°€ 있음
70+
start_point += 1 # λ‹€μŒ 칸으둜 이동
71+
72+
perm(0 , 0)
73+
"""

0 commit comments

Comments
Β (0)