BOJ/๐Ÿฅ‡

โ˜…Sorting Advanced I - 5 Solvedโ˜…

metamong 2023. 7. 28.

 

โ˜… 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 - 4 Solvedโ˜…  (0) 2023.08.30
โ˜…DP Advanced I - 4 Solvedโ˜…  (0) 2023.01.08
โ˜…hashing ์ƒ๊ธ‰ - 1๋ฌธ์ œ()โ˜…  (0) 2022.11.06

๋Œ“๊ธ€