> [!date] published: 2022-03-18
## ๐ intro
์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ๋ํด์ ๊ณต๋ถํ๋ ๊ณผ์ ์ด๋ค.
์คํ์ ๊ตฌํํ๊ณ , ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ๊ณ , ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ๋ํด์ ๊ณต๋ถํ ์ ์๋ ๊ณผ์ ์๋ค.
## ๐ ํด๊ฒฐ ์์
์์์ ํ๋ ๊ณผ์ ๋ค์ ์ฌ์ค ํด์ผ ํ ์ผ์ด ๋ช
ํํ ์ ํด์ ธ ์์ด์ ๊ทธ๋ฅ ๋ง์๊ฐ๋๋๋ก (?) ํ๋์ฉ ํด๊ฒฐํด๊ฐ๋ฉด ์์ฐ์ค๋ฝ๊ฒ ์ ์ฒด์ ์ผ๋ก ๊ณผ์ ๊ฐ ํด๊ฒฐ์ด ๋์์๋๋ฐ push_swap์ ํด์ผ ํ ์ผ์ด ๋๋ฌด ๋ง์์ ๊ทธ๋ฅ ๋ฌดํฑ๋๊ณ ์์์ ํ๋๊น ์ด๊ฒ๋ ํ์ํ๊ณ , ์ ๊ฒ๋ ํ์ํ ์ํฉ์ด ๋ง์์ง๋ฉด์ ๋๋ฌด ํผ๋์ค๋ฌ์ ๋ค.
๊ทธ๋์ ์ด๋ฒ ๊ณผ์ ๋ฅผ ํ๋ฉด์๋ ์ด๋ค ์์๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด ๋๊ฐ์ง ๊ณํ์ ์ธ์ฐ๊ณ , ๊ทธ ์์๋๋ก ๊ณผ์ ๋ฅผ ์ฐจ๊ทผ์ฐจ๊ทผ ์งํํด ๋๊ฐ๋ค.
1. ์๋ธ์ ํธ ์ดํดํ๊ธฐ
2. STACK ๊ตฌํํ๊ธฐ - ์๋ฃ๊ตฌ์กฐ ๊ตฌํ, `push`, `pop` ํจ์ ๊ตฌํ
3. ์๋ธ์ ํธ์ ๋ช
๋ น์ด ๊ตฌํํ๊ธฐ - `sa`, `sb`, `ss`, `pa`, `pb`, `ra`, `rb`, `rr`, `rra`, `rrb`, `rrr`
4. ์ธ์ ์ ์ฒ๋ฆฌ ๊ตฌํํ๊ธฐ - ์ ์ ๋ณํ, ์ค๋ฅ ์
๋ ฅ ์ฒ๋ฆฌ
5. sort ๊ตฌํํ๊ธฐ
์ด๋ ๊ฒ ์ผ์ฃผ์ผ ์ ๋ ์์ ํด๊ฒฐ์ ํด์ผ๊ฒ ๋ค ๊ณํ์ ์ธ์ฐ๊ธด ํ๋๋ฐ ์ค๊ฐ์ sort ์๊ณ ๋ฆฌ์ฆ๋ ๋ฐ๊พธ๊ณ , ํ๋ฃจ์ ํ๋์ฉ ํ๊ธฐ๋ ์ข ๋ฌด๋ฆฌ์๊ณ , ์ข ๋ฐ๊ธฐ์ ๊ฑฐ๋ฆฌ๊ธฐ๋ ํ๊ณ (์ ๋ค๋ณด๋๊น ๋ณ๋ช
๊ฐ์๋ฐ ํ ๋ง์ ์๋ค;;) ๊ทธ๋์ ์ด 2์ฃผ ์ ๋ ๊ฑธ๋ฆฐ ๊ฒ ๊ฐ๋ค.
## ๐ 1. ์๋ธ์ ํธ ์ดํดํ๊ธฐ
์คํ 2๊ฐ๋ฅผ ๊ฐ์ง๊ณ ์์๋ค์ ์ด๋ฆฌ์ ๋ฆฌ ์ฎ๊ฒจ๊ฐ๋ฉด์ ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ๋ ๊ณผ์ ์ด๋ค.
์์๋ค์ ์ฎ๊ธธ ๋ ์๋ธ์ ํธ์์ ์ ์ํด ์ค ๋ช
๋ น์ด๋ค์ ์ฌ์ฉํด์ ์ฎ๊ฒจ์ค์ผ ํ๊ณ , ๊ทธ ๋ ์ฌ์ฉํ๋ ๋ช
๋ น์ด์ ๊ฐ์๋ฅผ ์ต์๋ก ํ๋ ๊ทธ ๋ชฉ๋ก์ ์ถ๋ ฅํ๋ ๊ฒ์ด ์ด ๊ณผ์ ์ ์ต์ข
๋ชฉํ์ด๋ค.
## ๐ 2. STACK ๊ตฌํํ๊ธฐ
์๋ธ์ ํธ์์๋ ์คํ์ด๋ผ๊ณ ๋งํ๊ธด ํ์ง๋ง ์ฌ์ฉํ ์ ์๋ ๋ช
๋ น์ด๋ฅผ ๋ณด๋ฉด ์คํ๋ณด๋ค๋ ์ํ ํ์ ๋ ๊ฐ๊น๋ค๋ ์๊ฐ์ด ๋ ๋ค. ๊ทธ๋๋ ์๋ธ์ ํธ์์ ์คํ์ด๋ผ๊ณ ํ์ผ๋ ์คํ์ ๊ตฌํํ๊ณ , ์คํ์์ ์ฌ์ฉํ `push`์ `pop` ๋ช
๋ น์ด๋ฅผ ๊ตฌํํด์คฌ๋ค.
์คํ์ ์ํ ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ก ๊ตฌํํด์คฌ๋ค. ๋๋ rotate ์ฐ์ฐ์ ๋ณด๋ค ์ฝ๊ฒ ํ๊ธฐ ์ํด์, ๊ทธ๋ฆฌ๊ณ ํ์์ ๋ณด๋ค ์ฝ๊ฒ ํ๊ธฐ ์ํด์ ์ํ, ๊ทธ๋ฆฌ๊ณ ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ก ๊ตฌํ์ ํ๊ฑด๋ฐ ๊ตณ์ด ์ํ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ก ๊ตฌํํ์ง ์๊ณ ์คํ์ ์ ๋ณด๋ฅผ ์ ์ฅํ ๊ตฌ์กฐ์ฒด์ top๊ณผ bottom ์ ๋ชจ๋ ์ ์ฅํ๊ฒ ํด์ ์์๊ณผ ๋์ ์กฐ์ ํด๊ฐ๋ฉด์ rotate ์ฐ์ฐ์ ๊ตฌํํ์ ๋ถ๋ ๊ณ์ ๋ฏ ํ๋ค. ์ด๊ฑฐ๋ ์ด๋ค ์ชฝ์ด ํธํ๋์ ๋ฐ๋ผ ์ ํํ๋ฉด ๋ ๋ฏ ํ๋ค!
์ฐ๊ฒฐ๋ฆฌ์คํธ ๊ตฌํ์ ๋ค ํ์ผ๋ฉด ์ด์ push ์ pop ๊ตฌํํ๊ธฐ... ์ฌ์ค ์ํ ์ด์ค ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ก ์คํ์ ๊ตฌํํ๊ฒ ๋๋ฉด push์ pop๊ตฌํ์ด ์ข ๊ณจ์น์ํ์ง๋ค. ์๋ฌดํผ
![[27bcab83-e27e-4e67-b993-0bd27cddc91e.png]]
์คํ์ ์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ก ๊ตฌํํ๊ณ
![[3876bbb7-5047-4a3c-83e8-35b86fc6deba.png]]
๊ฐ๋จํ ํ
์คํธ ๊ฒฐ๊ณผ ์ ๋๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค.
## ๐ 3. ์๋ธ์ ํธ์ ๋ช
๋ น์ด ๊ตฌํํ๊ธฐ
### โจ `sa`, `sb`, `ss`
๊ฐ stack์ top์ ์๋ 2๊ฐ์ ์์๋ฅผ swap
๊ตณ์ด pop๊ณผ push๋ฅผ ํด ์ค ํ์ ์์ด ๊ทธ๋ฅ value๋ง swapํด์ฃผ๋ฉด ๋๋ค.
### โจ `pa`, `pb`
๊ฐ ์คํ์ top์ ๋ค๋ฅธ ์คํ์ pushํ๊ณ , ํ์ฌ stack์์๋ popํ๊ธฐ
### โจ `ra`, `rb`, `rr`, `rra`, `rrb`, `rrr`
top์ ์ํฉ์ ๋ง๊ฒ ๋ฐ๊พธ์ด์ฃผ๋ฉด ๋๋ค.
## ๐ 4. ์ธ์ ์ ์ฒ๋ฆฌ ๊ตฌํํ๊ธฐ
์๋ธ์ ํธ์์ ์ค๋ฅ ์
๋ ฅ์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ์๊ตฌํ๊ธด ํ๋๋ฐ ๊ทธ ๊ธฐ์ค์ด ๊ต์ฅํ ๋ชจํธํด์ ์๊ฐํ ์ ์๋ ์
๋ ฅ์ ๋ํด์๋ ๋ชจ๋ ์ฒ๋ฆฌ๋ฅผ ํด ์คฌ์ด์ผ ํ๋ค. (๋ง์ ํ๊ฐํ์์๋ ๊ทธ๋ ๊ฒ ๋นก๋นกํ๊ฒ ๊ฒํ ํ์ง ์์์ง๋ง ํ๊ฐ์์ ๋ฐ๋ผ์๋ ๋ค์ํ ์ผ์ด์ค๋ฅผ ๊ฒํ ํ ์๋ ์์ ๊ฒ ๊ฐ๋คใ
ใ
)
๋ด๊ฐ ์ฒ๋ฆฌํด์ค ์์ธ ์
๋ ฅ๋ค์
- ์ธ์๊ฐ ์๋ ๊ฒฝ์ฐ => ์๋ฌด๊ฒ๋ ์ถ๋ ฅํ์ง ์๋๋ค. (error๊ฐ ์๋๋ค!)
- ์ธ์์ ์ซ์๊ฐ ์๋ ๋ฌธ์๊ฐ ์๋ ๊ฒฝ์ฐ => error
- ๋ถํธ๋ง ์๋ ๊ฒฝ์ฐ => error
- 1๊ฐ์ ์ธ์์ ๊ณต๋ฐฑ์ ๊ธฐ์ค์ผ๋ก ์ฌ๋ฌ ๊ฐ์ ์ ์๊ฐ ์๋ ๊ฒฝ์ฐ => ๊ณต๋ฐฑ์ ๊ธฐ์ค์ผ๋ก ํ์ฑํด์ค์ผ ํ๋ค.
- ์ ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ๊ฒฝ์ฐ => error
- ์ค๋ณต๋ ์ธ์ง๊ฐ ์
๋ ฅ๋ ๊ฒฝ์ฐ => error
๊ฐ ์๋ค.
๋ค๋ฅธ ์์ธ ์ผ์ด์ค๋ค์ ์ฒ๋ฆฌํ๋๊ฒ ๊ทธ๋ ๊ฒ ์ด๋ ต์ง๋ ์์๋๋ฐ 4๋ฒ์งธ ์์ธ์ธ ๊ณต๋ฐฑ์ ๊ธฐ์ค์ผ๋ก ํ์ฑํ๋ ๋ถ๋ถ์ด ์ข ์ด๋ ต๊ธด ํ๋ค.
๋ง์ด ์ฐ์๋ ๋ฐฉ๋ฒ์ผ๋ก๋ ๊ธฐ์กด libft์์ ๋ง๋ค์ด๋๋ `ft_split`์ ์ฌ์ฉํ์๋ ๊ฒ ๊ฐ์๋๋ฐ ๋๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๊ฐ ์ข ์ด๋ ค์ธ ๊ฒ ๊ฐ์์ ๊ทธ๋ฅ ๋ฐ๋ก๋ฐ๋ก stack์ pushํด์ฃผ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค.
๋ง์ง๋ง ์์ธ ์ผ์ด์ค์ธ ์ค๋ณต์ธ์์ ๊ฒฝ์ฐ์๋ ์ค๊ฐ๊ฐ์ผ๋ก ํผ๋ด์ ์ค์ ํ๊ธฐ ์ํด์ ๋ฏธ๋ฆฌ ์
๋ ฅ๋ฐ์ ์ธ์๋ค์ ์ ๋ ฌํด๋๊ธฐ ๋๋ฌธ์ ๊ทธ ์ ๋ ฌ๋ ๋ฐฐ์ด์์ ์ธ์ ํ 2๊ฐ์ ์์๋ค์ ๋น๊ตํ๋ฉด์ ์ค๋ณต๋ ๊ฒ์ด ์๋์ง ํ๋จํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ค๋ณต ์ธ์ ์ฌ๋ถ๋ฅผ ํ์ธํด์ฃผ์๋ค.
## ๐ 5. sort ๊ตฌํํ๊ธฐ
### โจ ์๋ก
์ข์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐํด๋ณด๋ ค ํ์ผ๋ ์ฝ์ง ์์๋ค. ๊ทธ๋์ ์ด๋ฐ์ ๋ฐ ๊ฐ์ด๋๋ค์ ๋ง์ด ์ฐพ์๋ดค๋๋ฐ ๋๋ถ๋ถ quick sort, ์๋๋ฉด merge sort๋ฅผ ์ด์ฉํ ๊ฐ์ด๋๋ค์ด ๋ง์๋ค. ๊ทธ๋์ ๋๋ ๋์ธ๋ฅผ ๋ฐ๋ผ quick sort๋ก ๊ตฌํ์ ํ๊ณ , 2~5๊ฐ ์ ๋ ฌ๊น์ง ๋ชจ๋ ๊ตฌํํ๊ณ , ๋ช
๋ น์ด ์ต์ ํ๊น์ง ๊ฐ๋๋ฐ... ๊ฐ์๊ธฐ ํํ๊ฐ ์๋ค.
![[44b752d2-89af-439b-bdab-946ba81a4d0f.png]]
ํํ์จ๋ ์ ์ผ์ผ ๊ธฐ๋ก...
๋ฏธ๋ฆฌ ์ ์ฅํด๋ ๋ช
๋ น์ด๋ฅผ ์ต์ ํํ๋ ๋ถ๋ถ์์ ์์ฒญ ์ง์ณค๋ ๊ฒ ๊ฐ๋ค. ์ด์ฐจํผ ์ค์ง์ ์ธ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ณ ๋ คํด์ผ ํ๋ ๊ณผ์ ๊ฐ ์๋๊ธฐ ๋๋ฌธ์ (์ด ์๊ฐ์ ๋๋ฃํ๊ฐ ๋ ๋ฐ๋ฐ๋นํ๊ธด ํ๋ค..ใ
ใ
) ๊ตณ์ด ๋๋ฒ๊น
๋ ์ด๋ ค์ด quick sort๋ฅผ ์ด์ฉํด์ ์ ๋ ฌ์ ํด์ผ ํ๋์ง, ๊ทธ๋ง์ ๋ ์ต์ ์ ์ ๋ ฌ ๋ฐฉ๋ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ ์ดํ์ ๋ช
๋ น์ด ์ต์ ํ๋ฅผ ํด ์ค์ผ ํ๋๋ฐ? ์ด๋ฐ ์ฌ๋ฌ๊ฐ์ง ์๊ฐ ๋๋ฌธ์ ๋ค์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์๋ ์ด์ฌํ ์ฐพ์๋ดค๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฐ๊ฒฌํ greedy algorithm์ ์ฌ์ฉํ push_swap ๊ฐ์ด๋.... [\[42 ์์ธ\] push_swap์ ์ผ์ดํฌ์ฒ๋ผ ์ฝ๊ฒ ๋จน๋ ๋ฒ - 2](https://techdebt.tistory.com/27)
๊ฐ์ด๋๋ฅผ ๋๋ฌด ์ ์จ์ฃผ์ ๋๋ถ์ ์ดํด๋ ๋๋ฌด ์ ๋์๊ณ , ๊ตฌํ๊ณผ ๋๋ฒ๊น
๊ณผ์ ๋ quick sort์ ๋นํด์๋ ๋ ์ฝ๋ค๊ณ ํ๋จ์ ํ๊ณ , ํญ์ ์ต์ ์ ์ ํ์ ํ๊ธฐ ๋๋ฌธ์ ๋ง์ ๋ ๋๋ํ๊ฒ ๋ฐ์ ์ ์๋ค.
๊ทธ๋์ ๋๋ ์์ ๊ฐ์ด๋๋ฅผ ์ฐธ๊ณ ํด์, ์ด๋ฏธ ์ ๋ ฌ๋ stack์ ํ์ ์์ผ๊ฐ๋ฉด์ ์์๋ฅผ ์ฝ์
ํ๊ธฐ ์ํ ์ต์ ์ ์ ํ์ ํ๋ greedy algorithm์ผ๋ก ์ ๋ ฌ ๊ตฌํ์ ํด ์คฌ๋ค.
### โจ ๊ตฌํํ๊ธฐ
[42Cursus/push_swap at main ยท yoouyeon/42Cursus ยท GitHub](https://github.com/yoouyeon/42Cursus/tree/main/push_swap)
์ ๋ฐ์ ์ธ push_swap์ ๋์์ ํด ์ฃผ๋ ํจ์๋ `ft_push_swap` ํจ์์ด๋ค.
```c
void ft_push_swap(t_varlist *varlist)
{
if (is_sorted_a(varlist))
return ;
if (varlist -> a -> size <= 5)
{
sort_a_less_five(varlist);
return ;
}
divide_two(varlist);
while (varlist -> a -> size > 3)
pb(varlist -> a, varlist -> b);
if (varlist -> a -> size == 2)
sort_two_a(varlist);
else
sort_three_a(varlist);
while (varlist -> b -> size > 0)
rotate_and_pa(varlist);
rotate_last(varlist);
return ;
}
```
์ด ํจ์์์๋ ํผ๋ด ํ๋๋ฅผ ์ฌ์ฉํด์ ๋จผ์ a ์คํ์ ์์๋ค ์ค์์ ๋น๊ต์ ์์ ์์๋ค์ b ์คํ์ผ๋ก ๋ณด๋ธ ๋ค์, (`divide_two` ํจ์)
a ์คํ์ ์ ๋ ฌํด์ฃผ๊ณ ,
b ์คํ์ ๋ชจ๋ ์์๋ค์ a ์คํ์ผ๋ก ๋ณด๋ผ ๋๊น์ง ์ต์ ์ ๋ช
๋ น์ด ๊ฐ์๋ก ๋ณด๋ผ ์ ์๋ b์ ์์๋ฅผ ์ฐพ์์ `pa` ํด ์ฃผ๋ ํจ์(`rotate_and_pa`)๋ฅผ ํธ์ถํด์ค๋ค.
๋ค์์ b์ ์์์ ๊ฐ์๋งํผ ํธ์ถ์ด ๋๋ `rotate_and_pa` ํจ์์ธ๋ฐ,
```c
void rotate_and_pa(t_varlist *varlist)
{
int cnt_ra;
int cnt_rb;
cnt_ra = 0;
cnt_rb = 0;
get_ro_cnt(varlist, &cnt_ra, &cnt_rb);
rotate_stack_a_b(varlist, &cnt_ra, &cnt_rb);
rotate_stack_a(varlist, &cnt_ra);
rotate_stack_b(varlist, &cnt_rb);
pa(varlist -> a, varlist -> b);
}
```
`get_ro_cnt` ํจ์์์ ์ต์ ๋ช
๋ น์ด๋ก b -> a ๋ก ์ฎ๊ธธ ์ ์๋ ๊ทธ ์ต์ ์ ์์๋ฅผ ๊ฐ ์คํ์ top์ผ๋ก ์์น์ํฌ ์ ์๋ `ra` ํ์์ `rb` ํ์๋ฅผ ๊ตฌํด ์ค ๋ค์์
๋์ผํ ๋ฐฉํฅ์ผ๋ก ๋๋ฆด ์ ์๋ค๋ฉด ๊ฐ์ด ๋๋ ค์ฃผ๋ ํธ์ด ๋ ํจ์จ์ ์ด๋ฏ๋ก (`rr`, `rrr`) ๊ฐ๋ฅํ๋ค๋ฉด ๊ฐ์ ๋ฐฉํฅ์ผ๋ก ๋๋ฆด ์ ์์ ๋๊น์ง ๊ฐ์ด ๋๋ ค์ฃผ๊ณ (`rotate_stack_a_b`)
๊ทธ๋ค์์ ๋จ์ ํ์๋งํผ a์คํ๊ณผ b ์คํ์ ๋๋ ค์ฃผ๊ฒ ๋๋ฉด (`rotate_stack_a`, `rotate_stack_b`)
`pa`๋ฅผ ํ์ ๋ b์ ์ํ๋ ์์๋ฅผ a์ ์ํ๋ ์์น์ ๋ฃ์ ์ ์๊ฒ ๋๋ค.
```c
void get_ro_cnt(t_varlist *varlist, int *cnt_ra, int *cnt_rb)
{
t_node *temp;
int b_idx;
int new_cnt_ra;
int new_cnt_rb;
temp = varlist -> b -> top;
b_idx = 0;
while (b_idx < varlist -> b -> size)
{
new_cnt_ra = get_cnt_ra(varlist, temp -> value);
if (b_idx > varlist -> b -> size / 2)
new_cnt_rb = (varlist -> b -> size - b_idx) * -1;
else
new_cnt_rb = b_idx;
if (b_idx == 0 || is_new_best_way(*cnt_ra, *cnt_rb, new_cnt_ra, new_cnt_rb) == 1)
{
*cnt_ra = new_cnt_ra;
*cnt_rb = new_cnt_rb;
}
temp = temp -> next;
b_idx++;
}
}
```
`get_ro_cnt` ํจ์์์๋ b์ ๋ชจ๋ ์์๋ค์ ํ์ํ๋ฉด์
ํ์ฌ a ์คํ์ ๋ฃ๊ณ ์ ํ๋ ๊ทธ ์์์ ์๋ฆฌ๋ฅผ a์คํ์ top์ผ๋ก ๋๊ธฐ ์ํด ํ์ํ `ra`์ ํ์๋ฅผ ๊ตฌํ๊ณ , (`get_cnt_ra`)
`rb`์ ํ์๋ฅผ ๊ตฌํ๊ณ ,
๊ทธ ๋์ ์กฐํฉํด์ ๋ง๋ค ์ ์๋ ์ต์ ์ ๋ช
๋ น์ด์ ๊ฐ์๊ฐ ๊ธฐ์กด์ ๋ช
๋ น์ด์ ๊ฐ์๋ณด๋ค ์ ์ ๊ฒฝ์ฐ(`is_new_best_way`)์๋ ์
๋ฐ์ดํธ๋ฅผ ํด์ฃผ๋ ๊ณผ์ ์ ๊ณ์ํด์ ๋ฐ๋ณตํ๋ฉด์ ์ต์ ์ ์ ํ์ ์ฐพ๋๋ค.
rotate ๋ช
๋ น์ด ํ์๋ฅผ ์ฐพ์ ๋์๋ ์๋ธ์ ํธ์์ rotate ๋ช
๋ น์ด์ reverse rotate ๋ช
๋ น์ด ๋๊ฐ๋ฅผ ๊ตฌ๋ถํ์ฌ ์ ์ํด์คฌ๊ธฐ ๋๋ฌธ์ ๋ง์ฝ ํ์ฌ ์คํ์ ํฌ๊ธฐ์ ์ ๋ฐ ์ด์์ ํ์๋งํผ rotate๋ฅผ ํด์ค์ผ ํ ๊ฒฝ์ฐ์๋ reverse rotate๋ฅผ ํ๊ฒ ํด์ ์ข ๋ ๋ช
๋ น์ด์ ํธ์ถ ํ์๋ฅผ ์ค์ฌ์ฃผ์๋ค.
์ด ๊ณผ์ ์ b์ ์์๊ฐ ์์ ๋๊น์ง ๊ณ์ ๋ฐ๋ณตํ๋ฉด ์ ๋ ฌ์ด ์๋ฃ๋๋ค.
### โจ visualizer
์์ ์ ๋ ฌ๋ฐฉ๋ฒ์ push_swap visualizer๋ก ๋๋ ค๋ณด์๋ค. ([GitHub - o-reo/push_swap_visualizer: A clean visualizer for your Push Swap Algorithm, you can't fix what you can't see !](https://github.com/o-reo/push_swap_visualizer))
![[ab3c06e2-16db-4015-887c-85cf5a76e723.png]]
![[f953dbd7-27cd-45fd-8da2-5e1745a2a9a0.png]]
![[2a521a65-645d-4973-b50f-d223d0b8a053.png]]
![[40c93dff-fb7d-4749-8231-e19476c86155.png]]
1. pivot์ ๊ธฐ์ค์ผ๋ก a์ b ์คํ์ ์ ๋ฐ์ผ๋ก ๋๋์ด์ฃผ์๋ค.
2. ํ๋์ฝ๋ฉ์ผ๋ก ์ ๋ ฌ์ด ๊ฐ๋ฅํ ์๋ง ๋จ๊ธฐ๊ณ ๋ชจ๋ b ์คํ์ผ๋ก ๋๊ฒจ์ฃผ์๋ค.
3. a ์คํ์ ๋๋ ค๊ฐ๋ฉด์ ์ ์ ํ ์์น์ b์ ์์๋ฅผ ๋ฃ์ด์ฃผ์๋ค.
4. ๋ชจ๋ ์์๊ฐ a ์คํ์ ๋ค์ด์ค๋ฉด ๊ณผ์ ์์ ์๊ตฌํ๋ ๋๋ก ๊ฐ์ฅ ์์ ์์๊ฐ top์ ์ค๋๋ก ์คํ์ ํ์ ์์ผ์ค๋ค.
![[push_swap_visualization.gif]]
## ๐ ๊ฒฐ๋ก ๊ณผ ๋ฐ์ฑ
quick sort ๋ก ๊ตฌํํ์ ๋์๋ ๋ช
๋ น์ด๋ฅผ ์ ์ฅํด๋์๋ค๊ฐ ์ถ๋ ฅ ์์ ์ต์ ํํ๋ ๊ณผ์ ์ด ํ์ํ๊ณ , ๊ทธ๋ง์ ๋ ๋๋ pivot์ ํ๋๋ง ์ผ๊ธฐ ๋๋ฌธ์ ๋ง์ ๊ธฐ์ค์ ๋ง์ถ๋๊ฒ์ด ๊ฝค ๊น๋ค๋ก์ ๋๋ฐ greedy ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ ๋ง์ ๊ธฐ์ค์ ๋๋ํ๊ฒ ๋ง์ถ ์ ์์๋ค.
์ฌ์ค ๋๋ ์ด ๊ณผ์ ๊ฐ ์๊ตฌํ๋ ๋ฐ๊ฐ "์ถ๋ ฅ๋๋ ๋ช
๋ น์ด์ ๊ฐ์๋ฅผ ์ต์ํํ๋ ๊ฒ"์ด๋ผ๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ์๊ฐ๋ณต์ก๋์ ๋ํด์๋ ๋ณ๋ก ๊ณ ๋ฏผํ์ง ์์์๋๋ฐ ๋๋ฃํ๊ฐ๋ ํ ํ๊ฐ์๋์ด ์ด ์๋ธ์ ํธ์ ๋ณต์ก๋์ ๋ํ ๊ณ ๋ฏผ์ ํ ์ ์๋ ๊ณผ์ ๋ผ๋ ์ธ๊ธ์ด ๋์ด ์๋ค๋ ์ ์ ์ง์ด ์ฃผ์
จ๋ค. ํํ
์ผ๋จ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ๋ ๊ณผ์ ์ด๊ณ , ์๊ณ ๋ฆฌ์ฆ์ ๊ณต๋ถํ๋ฉด์ ์๊ฐ๋ณต์ก๋๋ ๋บ ์ ์๋ ์ฃผ์ ์ด๊ธฐ ๋๋ฌธ์ ๋ด๊ฐ ๊ตฌํํ ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ๋ณต์ก๋๋ ์ด๋์ ๋ ๋์ฌ์ง ๊ณ ๋ฏผ์ ํด ๋ดค์ผ๋ฉด ๋ ์ข์ง ์์์๊น ํ๋ ์๊ฐ์ ํ๊ณ , ๋์ค์ ํ๊ฐ๋ฅผ ๋ค๋๋ค ๋๋ ๊ฐ์ ๋ฐฉ์์ผ๋ก ํธ์ ๋ถ์ด ๊ณ์๋ค๋ฉด ์๊ฐ๋ณต์ก๋์ ๋ํด์ ํ๋ฒ ์ฌ์ญค๋ด์ผ๊ฒ ๋ค๋ ์๊ฐ์ ํ๋คใ
ใ