๐ค๋ฌธ์ ํด๊ฒฐ
S1 | ์ํ, ์กฐํฉ๋ก
์์ด์ ๋ณด๋ฉด itertools์ permutation์ด ์๊ฐ๋๋ค. ํ์ง๋ง ์ด ๋ฌธ์ ์์๋ N์ด 20๊น์ง ์ด๋ฏ๋ก 20!์ ๊ตฌํ๋๊ฒ์ ๋ถ๊ฐ๋ฅ.
๋จผ์ ์๋ฌธ์ 1์ผ ๋์ ๊ฒฝ์ฐ๋ฅผ ์ดํด๋ณด์.
N = 5, K = 35 ์ผ ๋(5๊ฐ์ ์ซ์, 35๋ฒ์งธ ์์ด)
N = 5 ์ด๋ฏ๋ก 5! = 120์ด๋ค. 120 / N ์ผ๋ก ๋๋๋ฉด 24๊ฐ ๋๋๋ฐ, ์ด๋ ๊ฐ๊ฐ์ ์์๋ฆฌ 5๊ฐ๊ฐ ๊ฐ์ง๋ ๊ฒฝ์ฐ์ ์์ด๋ค.
์์๋ฆฌ๊ฐ 1์ด๋ฉด 1 ~ 24๋ฒ์งธ, ์์๋ฆฌ๊ฐ 2์ด๋ฉด 25 ~ 48๋ฒ์งธ, ์์๋ฆฌ๊ฐ 3์ด๋ฉด 49 ~ 72๋ฒ์งธ ... ์ด๋ค.
K = 35์ด๋ฉด 25~48์ด๋ฏ๋ก ์์๋ฆฌ๊ฐ 2๋ผ๋ ๊ฒ์ ์ ์ ์๋ค.
๋ค์ ์คํ ์ผ๋ก ๋์ด๊ฐ๋ฉด n = 4, k = 35 - 24 = 11์ด๋ค. ์ฆ, ๋งจ 2 ์ด์ ์ ์ซ์์ธ 1์ด ๋งจ ์์๋ฆฌ์ ์ค๋ ๊ฒฝ์ฐ๋ 24๊ฐ์ง๋ฅผ ์ ๋ถ ์ง๋์น๊ณ 2๊ฐ ๋งจ ์์ผ ๋ 11๋ฒ์งธ ์ซ์๋ฅผ ์ฐพ๋ ๊ฒฝ์ฐ์ด๋ค.
๋ค์ ๋งํด์
N = 4, K = 11 ์ผ ๋๋ก ๋์ด์ค๊ฒ ๋๋ค.
์ด ๊ณผ์ ์ ์ฌ๊ท๋ก ๊ตฌํํ์ฌ ๊ฐ๋ค์ ๋ฝ์๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋์ค๊ฒ ๋๋ค.
์์์์ 2 3 5 1 ๊น์ง ๋ณด์ธ๋ค. ๊ทธ ์ด์ ๋ ๋ง์ง๋ง ์๋ฆฌ๋ ์ซ์๊ฐ ํ๋ ๋จ์๊ธฐ ๋๋ฌธ์ ๊ทธ ๋๋ง ๋จ์ ์ซ์๋ฅผ ์ฑ์์ฃผ๊ณ ํจ์๋ฅผ ์ข
๋ฃ์์ผฐ๋ค.
๋ต์ 2 3 5 1 4 ๊ฐ ๋์ค๊ฒ ๋๋ค.
๋ค์์ ์๋ฌธ์ 2์ผ ๋์ ๊ฒฝ์ฐ๋ฅผ ์ดํด๋ณด์.
์์ด์ด ์ฃผ์ด์ง๋ฉด ๊ทธ๊ฒ ๋ช ๋ฒ์งธ ์์ด์ธ์ง ์์๋ด์ผ ํ๋ค.
N = 5, K = 2, 3, 5, 1, 4 ์ผ ๋
N = 5, 5! = 120, 120 / N = 24์ด๋ค.
๋งจ ์์๋ฆฌ๊ฐ 2์ด๋ฏ๋ก 25 ~ 48 ์ ํฌํจ๋์ด ์๋ค. +24
๊ทธ ๋ค์ 3์ด๋ฏ๋ก ๋ค์ 7 ~ 12 ์ ํฌํจ๋์ด ์๋ค. +6
๊ทธ ๋ค์ 5์ด๋ฏ๋ก ๋ค์ 5 ~ 6 ์ ํฌํจ๋์ด ์๋ค. +4
๊ทธ ๋ค์ 1์ด๋ฏ๋ก ๋ค์ 1 ~ 1 ์ ํฌํจ๋์ด ์๋ฐ. + 1
๋ง์ง๋ง 4๋ ์๋์ผ๋ก ๊ฒฐ์ ๋๋ฏ๋ก ์์ ์ซ์๋ค์ ๋ํ๋ฉด 35๊ฐ ๋์ค๊ฒ ๋๋ค!
๐จ ์ํ๋ฌธ์ ๋ ์์ผ๋ก ํ์ด๋ณด๊ณ ๊ท์น์ ์ฐพ์๋ณด๋๊ฒ ์ข๋ค.
๐ป์์ค ์ฝ๋
import math
def find_one(n, k):
if len(answer) == N - 1:
answer.append(numbers[-1])
return
numberOfCases = math.factorial(n) // n
sequence = math.ceil(k / numberOfCases)
answer.append(numbers.pop(sequence))
find_one(n-1, k-(numberOfCases*(sequence-1)))
def find_k():
n = N
for num in K:
numberOfCases = math.factorial(n) // n
idx = numbers.index(num)
if len(numbers) == 2:
idx += 1
answer.append(numberOfCases*idx)
return
numbers.pop(idx)
answer.append(numberOfCases*idx)
n -= 1
if __name__ == "__main__":
N = int(input())
tmp_input = list(map(int, input().split()))
order = tmp_input.pop(0)
# ์๋ฌธ์ 1
if order == 1:
K = tmp_input[0]
numbers = [x for x in range(N+1)]
answer = []
find_one(N,K)
print(' '.join(list(map(str, answer))))
# ์๋ฌธ์ 2
else:
K = tmp_input
numbers = [x for x in range(1, N+1)]
answer = []
find_k()
print(sum(answer))
๐๋ฌธ์ ํ์ธ
์ถ์ฒ: BACKJOON ONLINE JUDGE
๋งํฌ: https://www.acmicpc.net/problem/1722
๋ฌธ์
1๋ถํฐ N๊น์ง์ ์๋ฅผ ์์๋ก ๋ฐฐ์ดํ ์์ด์ ์ด N! = N×(N-1)×…×2×1 ๊ฐ์ง๊ฐ ์๋ค.
์์์ ์์ด์ ์ ๋ ฌ์ ํ ์ ์๋ค. ์๋ฅผ ๋ค์ด N=3์ธ ๊ฒฝ์ฐ {1, 2, 3}, {1, 3, 2}, {2, 1, 3}, {2, 3, 1}, {3, 1, 2}, {3, 2, 1}์ ์์๋ก ์๊ฐํ ์ ์๋ค. ์ฒซ ๋ฒ์งธ ์๊ฐ ์์ ๊ฒ์ด ์์์์์ ์์๋ฉฐ, ์ฒซ ๋ฒ์งธ ์๊ฐ ๊ฐ์ผ๋ฉด ๋ ๋ฒ์งธ ์๊ฐ ์์ ๊ฒ์ด, ๋ ๋ฒ์งธ ์๋ ๊ฐ์ผ๋ฉด ์ธ ๋ฒ์งธ ์๊ฐ ์์ ๊ฒ์ด….
N์ด ์ฃผ์ด์ง๋ฉด, ์๋์ ๋ ์๋ฌธ์ ์ค์ ํ๋๋ฅผ ํ์ด์ผ ํ๋ค. k๊ฐ ์ฃผ์ด์ง๋ฉด k๋ฒ์งธ ์์ด์ ๊ตฌํ๊ณ , ์์์ ์์ด์ด ์ฃผ์ด์ง๋ฉด ์ด ์์ด์ด ๋ช ๋ฒ์งธ ์์ด์ธ์ง๋ฅผ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ N(1≤N≤20)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค์ ์ฒซ ๋ฒ์งธ ์๋ ์๋ฌธ์ ๋ฒํธ์ด๋ค. 1์ธ ๊ฒฝ์ฐ k(1≤k≤N!)๋ฅผ ์ ๋ ฅ๋ฐ๊ณ , 2์ธ ๊ฒฝ์ฐ ์์์ ์์ด์ ๋ํ๋ด๋ N๊ฐ์ ์๋ฅผ ์ ๋ ฅ๋ฐ๋๋ค. N๊ฐ์ ์์๋ 1๋ถํฐ N๊น์ง์ ์ ์๊ฐ ํ ๋ฒ์ฉ๋ง ๋ํ๋๋ค.
์ถ๋ ฅ
k๋ฒ์งธ ์์ด์ ๋ํ๋ด๋ N๊ฐ์ ์๋ฅผ ์ถ๋ ฅํ๊ฑฐ๋, ๋ช ๋ฒ์งธ ์์ด์ธ์ง๋ฅผ ์ถ๋ ฅํ๋ฉด ๋๋ค.
'Algorithm Problem > Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[python] ํ๋ก๊ทธ๋๋จธ์ค - ์ธ๋ฒฝ ์ ๊ฒ(2020 KAKAO BLIND RECRUITMENT) (0) | 2020.09.06 |
---|---|
[python] ๋ฐฑ์ค - 11052. ์นด๋ ๊ตฌ๋งคํ๊ธฐ / 16194. ์นด๋ ๊ตฌ๋งคํ๊ธฐ 2 (0) | 2020.09.05 |
[python] ๋ฐฑ์ค - 2240. ์๋๋๋ฌด (0) | 2020.09.03 |
[python] ๋ฐฑ์ค - 9084. ๋์ (0) | 2020.09.02 |
[python] ํ๋ก๊ทธ๋๋จธ์ค - ๋ธ๋ก ์ด๋ํ๊ธฐ(2020 KAKAO BLIND RECRUITMENT) (0) | 2020.09.01 |