๋ชฉ์ฐจ
๋ฌธ์
์ค๋๋ ์์ค์ด๋ ์ ํ ์ ๋ ฌ ์์ ์กฐ๊ต๋ฅผ ํ๊ณ ์๋ค. ์๋น ๊ฐ ์์ ํ ๋ด์ฉ์ ํ์๋ค์ด ์ ์ดํดํ๋์ง ๋ฌธ์ ๋ฅผ ํตํด์ ํ์ธํด๋ณด์.
N๊ฐ์ ์๋ก ๋ค๋ฅธ ์์ ์ ์๊ฐ ์ ์ฅ๋ ๋ฐฐ์ด A๊ฐ ์๋ค. ์ ํ ์ ๋ ฌ๋ก ๋ฐฐ์ด A๋ฅผ ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ ๊ฒฝ์ฐ K ๋ฒ์งธ ๊ตํ๋๋ ์๋ฅผ ๊ตฌํ์.
N์ด ๋งค์ฐ ์ปค์ ์๊ฐ ์ด๊ณผ๋ฅผ ๊ณ ๋ฏผํ๊ณ ์๋ ์ฐ๋ฆฌ ์์ค์ด๋ฅผ ๋์์ฃผ์.
ํฌ๊ธฐ๊ฐ N์ธ ๋ฐฐ์ด์ ๋ํ ์ ํ ์ ๋ ฌ ์์ฌ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
selection_sort(A[1..N]) { # A[1..N]์ ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ๋ค.
for last <- N downto 2 {
A[1..last]์ค ๊ฐ์ฅ ํฐ ์ A[i]๋ฅผ ์ฐพ๋๋ค
if (last != i) then A[last] <-> A[i] # last์ i๊ฐ ์๋ก ๋ค๋ฅด๋ฉด A[last]์ A[i]๋ฅผ ๊ตํ
}
}
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๋ฐฐ์ด A์ ํฌ๊ธฐ N(5 ≤ N ≤ 500,000), ๊ตํ ํ์ K(1 ≤ K ≤ N)๊ฐ ์ฃผ์ด์ง๋ค.
๋ค์ ์ค์ ์๋ก ๋ค๋ฅธ ๋ฐฐ์ด A์ ์์ A1, A2, ..., AN์ด ์ฃผ์ด์ง๋ค. (1 ≤ Ai ≤ 109)
์ถ๋ ฅ
K ๋ฒ์งธ ๊ตํ๋๋ ๋ ๊ฐ์ ์๋ฅผ ์์ ์๋ถํฐ ํ ์ค์ ์ถ๋ ฅํ๋ค. ๊ตํ ํ์๊ฐ K ๋ณด๋ค ์์ผ๋ฉด -1์ ์ถ๋ ฅํ๋ค.
์์ ์ ๋ ฅ 1 ๋ณต์ฌ
5 2
3 1 2 5 4
์์ ์ถ๋ ฅ 1 ๋ณต์ฌ
2 3
3 1 2 5 4 (4์ 5๊ฐ ๊ตํ๋จ) -> 3 1 2 4 5 (A[1..4]์์ 4๊ฐ ๊ฐ์ฅ ํฌ๋ฏ๋ก ๊ตํ์ด ๋ฐ์ํ์ง ์์) -> 3 1 2 4 5 (2์ 3์ด ๊ตํ๋จ) -> 2 1 3 4 5 (1๊ณผ 2๊ฐ ๊ตํ๋จ) -> 1 2 3 4 5. ์ด 3ํ ๊ตํ์ด ๋ฐ์ํ๊ณ ๋ ๋ฒ์งธ ๊ตํ์ 2์ 3์ด๋ค.
์์ ์ ๋ ฅ 2 ๋ณต์ฌ
5 4
3 1 2 5 4
์์ ์ถ๋ ฅ 2 ๋ณต์ฌ
-1
๊ตํ ํ์ 3์ด K ๋ณด๋ค ์์ผ๋ฏ๋ก -1์ ์ถ๋ ฅํ๋ค.
์ฝ๋
import sys
def selection_sort(N, K, A):
# ์ ๋ ฌ๋ ๋ฆฌ์คํธ
sortedA = sorted(A)
numDict = {}
# ๋์
๋๋ฆฌ key : A์์ value : ์ ๋ ฌ ์ ์ธ๋ฑ์ค
for i, j in enumerate(A):
numDict[j] = i
cnt = 0
for i in range(N-1, -1, -1): # i : ํ์ฌ ์ ๋ ฌํ ์ธ๋ฑ์ค
if sortedA[i] != A[i]: # ํ์ฌ ์ธ๋ฑ์ค๊ฐ ์๋๋ฉด?
result = [A[i], sortedA[i]]
A[i], A[numDict[sortedA[i]]] = A[numDict[sortedA[i]]], A[i]
numDict[result[0]], numDict[result[1]] = numDict[result[1]], numDict[result[0]]
cnt += 1
if K == cnt : print(*result);return
if K > cnt : print(-1);return
N, K = map(int, sys.stdin.readline().rstrip().split())
A = list(map(int, sys.stdin.readline().rstrip().split()))
selection_sort(N, K, A)
๋ฆฌ๋ทฐ
๋จ์ํ ์์๋๋ก ์ ํ์ ๋ ฌ์ ํ์์ ๋ ๋ฐฐ์ด์ ํฌ๊ธฐ๋ก ์ธํด ์๊ฐ ์ด๊ณผ๊ฐ ๋๋ ๋ฌธ์ ์๋ค.
๊ฐ์ฅ ๋จผ์ ์๊ฐ ๋ณต์ก๋ ๋ถ๋ถ์ ํด๊ฒฐํ๊ธฐ ์ํด์ ์ด๋ค ๊ฒ์ ์ฌ์ฉํด๋ณผ๊น? ๋ผ๋ ์ง๋ฌธ์
ํ์ฌ ์ ๋ ฌ ์ธ์ ์ ๊ฐ์ฅ ํฐ ๊ฐ์ ์ฐพ๋ ๋ถ๋ถ์ ํ ์ ๋ ฌ์ ์ฌ์ฉํ๋ ๊ฒ์ ์๋ํ์๋ค.
์ด๋ฅผ ์ํด์ heapq ๋ชจ๋์ ์ฌ์ฉํ๋ ค ํ์ง๋ง
๋งค ๋ฐ๋ณต ๋์ ๋ถ๋ถ๋ฆฌ์คํธ๋ง๋ค ํ ์ ๋ ฌ์ ์ํด heapify๋ฅผ ํด์ผํ๋๋ฐ
์ด๋ฅผ ์ํด์ ๊ณ์ ๋ฐ๋ก ํ์ ์์ฑํ๊ณ ์ต๋๊ฐ์ ์ฐพ๊ณ , ํด๋น ๊ฐ์ ์ธ๋ฑ์ค๋ฅผ ๋ค์ ์ฐพ์์ผํ๋ ์ ์ด
๋นํจ์จ์ ์ผ ๊ฒ ๊ฐ์์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฐพ์๋ณด์๋ค.
๊ทธ๋์ ๋ ๋ฒ์งธ๋ก ๊ณ ๋ คํด๋ณธ ๊ฒ์ ๋์ ๋๋ฆฌ๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด์๋ค.
๋์ ๋๋ฆฌ ์๋ฃํ์ ๋ด๋ถ์ ์ผ๋ก ํด์ ํ ์ด๋ธ์ ์ด์ฉํ๋ฏ๋ก ๋ฐ์ดํฐ์ '์กฐํ ๋ฐ ์์ ์ด O(1)'์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๊ธฐ ๋๋ฌธ์
์ด๋ฅผ ์ด์ฉํ๋ฉด ์ ํฉํ์ง ์์๊น? ๋ผ๊ณ ์๊ฐํ์๋ค.
1) ์ ๋ ฌ ๋ฆฌ์คํธ ์์ฑ๊ณผ ๋์ ๋๋ฆฌ ์์ฑ
# ์ ๋ ฌ๋ ๋ฆฌ์คํธ
sortedA = sorted(A)
numDict = {}
# ๋์
๋๋ฆฌ key : A์์ value : ์ ๋ ฌ์ ์ธ๋ฑ์ค
for i, j in enumerate(A):
numDict[j] = i
๋จผ์ ์ต์ ์ ๊ฒฝ์ฐ์๋ nlogn์ ์๊ฐ์ ๋ณด์ฅํ๋ Timsort์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๊ตฌํ๋ sorted()๋ฅผ ์ด์ฉํ์ฌ
์ฃผ์ด์ง ๋ฆฌ์คํธ A๋ฅผ ์ ๋ ฌํ๋ฆฌ์คํธ sortedA๋ฅผ ์์ฑํ์๋ค.
enumerate()๋ฅผ ์ด์ฉํ์ฌ numDIct ๋์ ๋๋ฆฌ์
key = A์ ์์, value=ํด๋น ์์์ ์ธ๋ฑ์ค
๋ก ์ฝ์ ํ์๋ค.
2) ์ ํ์ ๋ ฌ & ๊ฒฐ๊ณผ๊ฐ ์ฐพ๊ธฐ
for i in range(N-1, -1, -1): # i : ํ์ฌ ์ ๋ ฌํ ์ธ๋ฑ์ค
if sortedA[i] != A[i]: # ํ์ฌ ์ธ๋ฑ์ค๊ฐ ์๋๋ฉด?
result = [A[i], sortedA[i]]
A[i], A[numDict[sortedA[i]]] = A[numDict[sortedA[i]]], A[i]
numDict[result[0]], numDict[result[1]] = numDict[result[1]], numDict[result[0]]
cnt += 1
if K == cnt : print(*result);return
if K > cnt : print(-1);return
sortedA์ A์ ๋ง์ง๋ง ์์๋ถํฐ ๋น๊ตํ๋ฉฐ ์ ๋ ฌ์ ์งํํ๋ค.
๋ง์ฝ ํ์ฌ ์ธ๋ฑ์ค์ ๊ฐ์ด ์๋ก ๋ค๋ฅด๋ค๋ฉด A๋ ์ ๋ ฌ๋์ด์ผํ๋ค.
์ ๋ ฌํ ๊ฐ์ ์ธ๋ฑ์ค๋ "numDict[sortedA[ํ์ฌ์ธ๋ฑ์ค]]"์ ๋ด๊ฒจ ์๋ค.
์ด๋ฅผ ์ด์ฉํ์ฌ A[ํ์ฌ ์ธ๋ฑ์ค] ์ A[numDict[sortedA[ํ์ฌ์ธ๋ฑ์ค]]] ๋ฅผ ์๋ก ๋ฐ๊พธ์ด ์ ๋ ฌํ๋ค.
๋ฐ๊พผ ๊ฒ์ ๋ํ ์ ๋ณด๋ฅผ numDict์๋ ์ ์ฉํ๋ค.
'๐ฆ | ์ฝ๋ฉํ ์คํธ ์ฐ์ต > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Python] ๋ฐฑ์ค 1068 ํธ๋ฆฌ (0) | 2023.04.12 |
---|---|
[Python] ๋ฐฑ์ค 1083 ์ํธ (0) | 2022.03.28 |
[Python] ๋ฐฑ์ค 1920 ์ ์ฐพ๊ธฐ (0) | 2022.03.28 |
[Python] ๋ฐฑ์ค 1966๋ฒ ํ๋ฆฐํฐ ํ (0) | 2022.03.28 |
[Python] ๋ฐฑ์ค 10951๋ฒ A+B - 4 (0) | 2022.01.10 |
๋๊ธ