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+
0 commit comments