โ 1083 ์ํธ โ
import sys
input=sys.stdin.readline
N=int(input())
arr=list(map(int,input().split()))
S=int(input())
for i in range(N):
subarray_max = max(arr[i:i+S+1])
if arr[i] != subarray_max:
subarray_max_index = arr.index(subarray_max)
for j in range(subarray_max_index-i):
arr[subarray_max_index-j], arr[subarray_max_index-j-1] = arr[subarray_max_index-j-1], arr[subarray_max_index-j]
S-=(subarray_max_index-i)
if S==0: break
print(*arr)
๐ค ๋ฌธ์ ๋ฅผ ์ดํดํ๋ฉด selection sort์ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋งค์ฐ ํก์ฌํ ์ ๋ ฌ ๋ฌธ์ ! selection sort ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์ธ์ ํ ๋ ๊ฐ์ ์์๋ง swap์ด ๊ฐ๋ฅํ๊ณ , ์ด ๋ swap ํ์์ limit์ด ๊ฑธ๋ฆฐ ์ํ์์ ์ฌ์ ์ ๊ฐ์ฅ ๋ค๋ก ๋๋ array๋ฅผ ์ถ๋ ฅํ๋ ์ ํ(selection sort algorithm์ด๋ subarray์ ์ ํ์ด ๊ฑธ๋ฆฐ ์ ํ)
โ selection sort ํฌ์คํ ์ฐธ๊ณ https://sh-avid-learner.tistory.com/285
๐ค 1. ์ฌ์ ์์ด๋? ๐ค
→ ์ต๋ํ ์ฌ์ ์์ผ๋ก ์ ๋ ฌํ array๋ฅผ ์ํ๋๋ฐ, ์ด๊ฒ์ ์ซ์์์ผ๋ก ์ต๋ํ ๋ด๋ฆผ์ฐจ์, ๊ฐ์ฅ ํฐ ์๊ฐ ๋งจ ์์, ๊ทธ ๋ค์ ํฐ ์๊ฐ ๋งจ ์์ ์ค๊ฒ๋ ํ๋ ์ ๋ ฌ์ ๋ปํ๋ค. ์ฆ ์ฒซ๋ฒ์งธ ์นธ๋ถํฐ ์ต๋๊ฐ๋ถํฐ ์ต๋ํ ์ฑ์๋๊ฐ์ ๋ปํ๋ค.
๐ค 2. greedy ์๋ฆฌ ๐ค
→ ์ฌ์ ์์ผ๋ก ์ต๋ํ ์ ๋ ฌํ๊ธฐ ์ํด์๋ ์ผ๋จ์ ๋ฌด์กฐ๊ฑด ๋งจ ์์ ์นธ์ด ์ต๋๊ฐ์ด ๋์ด์ผ ํ๊ณ , ๊ทธ ๋ค์์ด ๊ทธ ๋ค์ ์ต๋๊ฐ... ์ด๋ฐ ์์๋ก ์งํ๋์ด์ผ ํ๋ค. ๋งจ ์ผ์ชฝ์นธ ๋จผ์ ์ต๋๊ฐ์ผ๋ก ๋ฐฐ์น, ๊ทธ ๋ค์ ์นธ์ ๊ทธ ๋ค์ ๊ฐ์ผ๋ก ๋ฐฐ์น: ๊ฐ ์ํฉ๋ง๋ค ์ต์ ์ ์ํฉ(์ต๋๊ฐ ๋ฐฐ์น: greedy ์ ํ)๋ฅผ ๋งค ์นธ๋ง๋ค ์งํ!
โ greedy ์ ํ์์ ์์์ฐจ๋ฆฌ๊ณ ๊ณง๋ฐ๋ก ๊ตฌํ์ ํ์ง ๋ง๊ณ idea์ ์ง์ค!
๐ค 3. swap ํ์ limit์ ์ฃผ์ / subarray์ ์ค๋ฅธ์ชฝ ๋๋ถ๋ถ์ swap limit ๊ณ ๋ คํ subarray(arr[i:i+S+1]) ๐ค
→ swap ํ์์ limit์ด ์์ผ๋ฏ๋ก ์ ์ด์ subarray์ slicing ๋ฒ์๋ฅผ ์ ํํ์ผ๋ฉฐ, S๊ฐ 0์ด ๋์์ ๋ swap limit์ด ๋๋ฌ์ผ๋ฏ๋ก breakํ๊ณ ๋ต ์ถ๋ ฅ!(์ด ๋ S๊ฐ 0๋ณด๋ค ์์ ๊ฒฝ์ฐ๋ ์๋ค. ์ ์ด์ subarray slicing ๋ฒ์๋ฅผ ์ ํํ์ผ๋ฏ๋ก S๋ 0๋ณด๋ค ์์ ์ซ์๋ก ๊ฐ์ํ ์ x)
๐ค 4. swap ์ฝ๋ ๐ค
→ swapํ ๋ ๋ ์์ index ์ฐจ์ด๋งํผ for๋ฌธ์ผ๋ก ์งํํ๋ฉฐ ์ธ์ ํ ๋ ๊ฐ์ฉ swap์ ์งํํ๊ฒ๋ ํ๋ค.
cf) ์ต๋๊ฐ๋ถํฐ ๋ฐ๋๋ก ์ ๋ ฌํ arr2๋ฅผ ์๋ก ๋ง๋ค๊ณ arr2์ ์ต๋๊ฐ๋ถํฐ ์ ๋ ฌ์ด ๋๋ ์ง ํ์ธํ๊ธฐ ์ํด ์ผ์ข ์ pointer cur_max๋ฅผ ์์ฑ / ๊ทธ๋ฆฌ๊ณ S๋ผ๋ limit ๋๋ฌธ์ cur_max์ ํด๋นํ๋ ์๋ก๋ swap ๋ชปํ์ง๋ง ๊ทธ ๋ค์ ์๋ค ์ค์ swap์ด ๊ฐ๋ฅํ ์ ์์ผ๋ฏ๋ก cur_max2 ์์ฑ / ์ค์ arr์์ ์งํํด ๋๊ฐ๋ pointer loc์์ ์งํ. ๋นก๊ตฌํ์ผ๋ก ์ฒซ ํ์ด๋ฅผ ํ๊ธด ํ๋ค..!
import sys
input=sys.stdin.readline
N=int(input())
arr=list(map(int,input().split()))
arr2=sorted(arr,reverse=True)
S=int(input())
cur_max,cur_max2,loc = 0,0,0
while S > 0:
if arr == arr2: break
if arr[loc] == arr2[cur_max2]:
#next move
loc += 1
if cur_max != cur_max2:
arr2.remove(arr2[cur_max2])
cur_max2 = cur_max
else:
cur_max += 1
cur_max2 += 1
else:
cur_max_index = arr.index(arr2[cur_max2])
dist = cur_max_index - loc
if dist <= S:
S -= dist
for i in range(dist):
arr[cur_max_index-i], arr[cur_max_index-i-1] = arr[cur_max_index-i-1], arr[cur_max_index-i]
loc += 1
if cur_max != cur_max2:
arr2.remove(arr2[cur_max2])
cur_max2 = cur_max
else:
cur_max += 1
cur_max2 += 1
else:
cur_max2 += 1
print(*arr)
โ 24053 ์๊ณ ๋ฆฌ์ฆ ์์ - ์ฝ์ ์ ๋ ฌ 3 โ
import sys
input=sys.stdin.readline
N=int(input())
A=list(map(int,input().split()))
B=list(map(int,input().split()))
ans = False
for i in range(1,N):
loc = i-1
newItem = A[i]
while(0<=loc and newItem < A[loc]):
A[loc+1] = A[loc]
if A==B:
print(1)
ans=True
break
loc-=1
if ans: break
if (loc+1 != i):
A[loc+1] = newItem
if A==B:
ans=True
print(1)
break
if not ans: print(0)
๐ค ํ ๋น์ด ๋ ๋ฒ ์ผ์ด๋๋ ๋ฐ, ์ฒซ๋ฒ์งธ subarray๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ํ ๊ฐ์ฉ ์ผ๋ถ ๋ฏธ๋ ๊ฒ / ๋๋ฒ์งธ newItem์ ์ผ์ชฝ ๋น ๊ณต๊ฐ์ ๋ฃ๋ ๊ฒ ์ด๋ ๊ฒ ์ผ์ด๋๋ค. ์ด๋ฌ๋ฉด์ ๊ธฐ์กด ๋ฐฐ์ด์ด ์์๋ก ๋ณํ๋๋ฐ, ๋ณํ ๊ฒฐ๊ณผ์ ๋ฐฐ์ด์ด ์๋ ๋ฐฐ์ด๊ณผ ๊ฐ๋ค๋ฉด 1 ์ถ๋ ฅ, ๊ทธ๋ ์ง ์๋ค๋ฉด 0 ์ถ๋ ฅ
โ 23883 ์๊ณ ๋ฆฌ์ฆ ์์ - ์ ํ ์ ๋ ฌ 3 โ
import sys
input = sys.stdin.readline
N,K=map(int,input().split())
arr = list(map(int,input().split()))
swapped = False
dic = dict()
x = 0
for n in arr:
dic[n] = x
x+=1
sorted_dict = dict(sorted(dic.items())) #sort by key(ascending order)
cur_order = N-1
for cur_max in reversed(sorted_dict.keys()):
if sorted_dict[cur_max] != cur_order: #need to be swapped
cur_max_index = sorted_dict[cur_max]
#change sorted_dict
sorted_dict[cur_max] = cur_order
sorted_dict[arr[cur_order]] = cur_max_index
#change arr
arr[cur_max_index], arr[cur_order] = arr[cur_order], arr[cur_max_index] #swap in array
K-=1
if K== 0:
swapped = True
print(arr[cur_max_index], arr[cur_order])
break
cur_order-=1
if not swapped: print(-1)
๐ค 1~N๊น์ง์ ์์ฐ์๋ก ๊ตฌ์ฑ๋ ํน์ํ ๋ฐฐ์ด์ด๋ฏ๋ก subarray์ ์ต๋๊ฐ์ ์๊ณ ์๊ณ , ํด๋น ์ต๋๊ฐ์ index๋ง ๊ตฌํ๋ฉด ๋จ. ์ด๋ dictionary๋ฅผ ํ์ฉํ์ฌ cur_max index์ cur_order๊ฐ์ index ๋น๊ต๋ก ์ฝ๊ฒ ์ํ๊ฐ๋ฅ
โ 23884 ์๊ณ ๋ฆฌ์ฆ ์์ - ์ ํ ์ ๋ ฌ 4 โ
import sys
input = sys.stdin.readline
N,K=map(int,input().split())
arr = list(map(int,input().split()))
swapped = False
dic = dict()
x = 0
for n in arr:
dic[n] = x
x+=1
sorted_dict = dict(sorted(dic.items())) #sort by key(ascending order)
cur_order = N-1
for cur_max in reversed(sorted_dict.keys()):
if sorted_dict[cur_max] != cur_order: #need to be swapped
cur_max_index = sorted_dict[cur_max]
sorted_dict[cur_max] = cur_order
sorted_dict[arr[cur_order]] = cur_max_index
arr[cur_max_index], arr[cur_order] = arr[cur_order], arr[cur_max_index] #swap in array
K-=1
if K== 0:
swapped = True
print(*arr)
break
cur_order-=1
if not swapped: print(-1)
๐ค ํด๋น swap๋ฒ์งธ์ผ ๋ ๋ฐฐ์ด ๋ด์ฉ ์ถ๋ ฅ(23883๊ณผ ๋์ผ)
โ 23900 ์๊ณ ๋ฆฌ์ฆ ์์ - ์ ํ ์ ๋ ฌ 6 โ
import sys
input = sys.stdin.readline
N=int(input())
A = list(map(int,input().split()))
B = list(map(int,input().split()))
flag=False
if A==B: flag = True
else:
dic = dict()
x = 0
for n in A:
dic[n] = x
x+=1
sorted_dict = dict(sorted(dic.items())) #sort by key(ascending order)
cur_order = N-1
for cur_max in reversed(sorted_dict.keys()):
if sorted_dict[cur_max] != cur_order: #need to be swapped
cur_max_index = sorted_dict[cur_max]
sorted_dict[cur_max] = cur_order
sorted_dict[A[cur_order]] = cur_max_index
A[cur_max_index], A[cur_order] = A[cur_order], A[cur_max_index] #swap in array
if A== B:
flag=True
break
cur_order-=1
print(1 if flag else 0)
๐ค ๋์ค์ ์ํ๋ ๋ฐฐ์ด์ด ๋์ค๋ฉด ๋ฐ๋ก ์ถ๋ ฅ. 23883, 23884์ ๋์ผ
'BOJ > ๐ฅ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
โ Greedy Upper-Advanced I - 1 Solvedโ (1) | 2023.10.18 |
---|---|
โ BF Advanced I - 3 Solvedโ (0) | 2023.10.06 |
โ Greedy Advanced I - 5 Solvedโ (0) | 2023.08.30 |
โ DP Advanced I - 6 Solvedโ (0) | 2023.01.08 |
โ hashing ์๊ธ - 1๋ฌธ์ ()โ (0) | 2022.11.06 |
๋๊ธ