๐Ÿ‘จโ€๐Ÿ’ป Seungineer's GitHub Contribution

๐Ÿงญ KAIST JUNGLE/Algorithm

[๋ฐฑ์ค€]17144 - ๋ฏธ์„ธ๋จผ์ง€ ์•ˆ๋…•! (#ํŒŒ์ด์ฌ #ํŠน์ • ๋ฃจํŠธ์˜ ์ˆœํ™˜์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•)

seungineer = seungwoo + engineer 2024. 11. 15. 20:51

 

2์ฐจ์› ๋ฐฐ์—ด ๋‚ด ์ˆ˜๋ฅผ ํŠน์ • ํ˜•ํƒœ์— ๋งž๊ฒŒ ํšŒ์ „์‹œํ‚ค๋Š” ๋กœ์ง์„ for๋ฌธ๊ณผ while๋ฌธ์„ ์ ์ ˆํžˆ ํ™œ์šฉํ•˜์—ฌ์•ผ ํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.
 

17144๋ฒˆ: ๋ฏธ์„ธ๋จผ์ง€ ์•ˆ๋…•!

 

boj.ma

๋ฌธ์ œ์š”์•ฝ

์ˆซ์ž๋กœ ํ‘œํ˜„๋œ ๋จผ์ง€๋“ค์€ ์‚ฌ๋ฐฉ์œผ๋กœ ํผ์ง€๋ฉฐ ๊ทธ ํฌ๊ธฐ๊ฐ€ ํผ์ง„ ๋งŒํผ ์ค„์–ด๋“ ๋‹ค. ๋˜ํ•œ, ์ˆซ์ž -1๋กœ ํ‘œํ˜„๋œ ๊ณต๊ธฐ ์ฒญ์ •๊ธฐ๋กœ ๋จผ์ง€๊ฐ€ ๋“ค์–ด๊ฐ€๋ฉด ํ•ด๋‹น ๋จผ์ง€๋Š” ์‚ฌ๋ผ์ง€๊ฒŒ ๋œ๋‹ค. ๊ณต๊ธฐ ์ฒญ์ •๊ธฐ๊ฐ€ ์ž‘๋™ํ•˜์—ฌ ๋จผ์ง€์˜ ์œ„์น˜๋ฅผ ์ด๋™ ์‹œํ‚ค๋Š” ํŠน์ • ํŒจํ„ด์œผ๋กœ ์ •ํ•ด์ ธ ์žˆ๋‹ค.

 

๋ช‡ ๋‹ฌ ์ „์— ํ’€์–ด๋ณด๋ ค๊ณ  ์‹œ๋„ํ•˜์˜€์œผ๋‚˜ ์‹คํŒจํ–ˆ์—ˆ๋˜ ๋ฌธ์ œ์ด๋‹ค. ์‹คํŒจ์˜ ์›์ธ์€ ๊ณต๊ธฐ์ฒญ์ •๊ธฐ์— ์˜ํ•ด์„œ ๋จผ์ง€๊ฐ€ ์ด๋™ํ•˜๋Š” ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•ด์•ผ ํ• ์ง€ ๊ฐ์ด ์˜ค์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ณต๊ธฐ์ฒญ์ •๊ธฐ์— ์˜ํ•ด์„œ ๋จผ์ง€๊ฐ€ ์–ด๋–ป๊ฒŒ ์›€์ง์ด๊ฒŒ ๋˜๋Š”์ง€๊ฐ€ ํ•ด๋‹น ๋ฌธ์ œ์˜ ํ•ต์‹ฌ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋ฌด์กฐ๊ฑด ๊ณต๊ธฐ์ฒญ์ •๊ธฐ์— ์˜ํ•ด ์ˆœํ™˜ ๊ธฐ๋ฅ˜๊ฐ€ ํ˜•์„ฑ๋œ๋‹ค.

๋ฌธ์ œ ์กฐ๊ฑด์„ ๋ณด๋ฉด N*M ๊ทธ๋ž˜ํ”„์—์„œ ๊ณต๊ธฐ ์ฒญ์ •๊ธฐ๋Š” ํ•ญ์ƒ 1 ~ N-2(์ธ๋ฑ์Šค ๊ธฐ์ค€)์— ์œ„์น˜ํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ์–ด๋–ป๊ฒŒ๋“  ์œ„์•„๋ž˜ ๊ณต๊ธฐ ์ฒญ์ •๊ธฐ๋Š” ์ˆœํ™˜ ๊ธฐ๋ฅ˜๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋จผ์ง€๊ฐ€ ๋น™๊ธ€๋น™๊ธ€ ๋Œ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์–ด๋–ป๊ฒŒ ์ˆœํ™˜ ๊ธฐ๋ฅ˜๋ฅผ ๊ตฌํ˜„ํ•  ๊ฒƒ์ธ๊ฐ€?

# AS-IS
1, 2, 3
4, 5, 6
7, 8, 9

# TO-BE
2, 3, 6
1, 5, 9
4, 7, 8

ํ•ด๋‹น ํ–‰๋ ฌ ๋ณ€ํ™˜์„ ์–ด๋–ป๊ฒŒ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์„์ง€ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์ด ์šฐ์„ ์ด๋‹ค. 5๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฐ˜์‹œ๊ณ„ ๋ฐฉํ–ฅ์œผ๋กœ ํšŒ์ „ํ•˜๋Š” ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜์˜ ์ ˆ์ฐจ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

 

1. ๊ธฐ์ค€์ด ๋˜๋Š” (0, 0) ์ธ๋ฑ์Šค์˜ ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.

2. (0, 1) ์ธ๋ฑ์Šค์˜ ๊ฐ’์„ (0, 0) ์ธ๋ฑ์Šค์— ํ• ๋‹นํ•œ๋‹ค.

3. (0, 2) ์ธ๋ฑ์Šค์˜ ๊ฐ’์„ (0, 1) ์ธ๋ฑ์Šค์— ํ• ๋‹นํ•œ๋‹ค.

4. (1, 2) ์ธ๋ฑ์Šค์˜ ๊ฐ’์„ (0, 2) ์ธ๋ฑ์Šค์— ํ• ๋‹นํ•œ๋‹ค.

...

n. (1, 0) ์ธ๋ฑ์Šค์˜ ๊ฐ’์„ (2, 0) ์ธ๋ฑ์Šค์— ํ• ๋‹นํ•œ๋‹ค.

n+1. ์ €์žฅํ•ด๋‘” ๊ฐ’์„ (1,0)์— ํ• ๋‹นํ•œ๋‹ค.

 

์ฆ‰, ์–ด๋–ค ํ•œ ๊ฐ’์„ ์ €์žฅํ•ด ๋‘๊ณ , ์ €์žฅํ•œ ๊ฐ’์„ ๋ฎ์–ด ์”Œ์šฐ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ˜๋ณต ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ํƒ์ƒ‰ ์ค‘ ์ด๋™ ์˜ˆ์ • ์ธ๋ฑ์Šค์˜ ๊ฐ’์„ ํ˜„์žฌ ์œ„์น˜ํ•œ ์ธ๋ฑ์Šค์— ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์œผ๋กœ๋„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

์–ด๋–ป๊ฒŒ ๊ฐ™์€ ๋ฐฉํ–ฅ์œผ๋กœ ์ญ‰! ์ด๋™ํ•˜๋‹ค๊ฐ€ ๋ง‰๋‹ค๋ฅธ ๊ธธ์ด๋ฉด ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ํšŒ์ „ํ•˜์—ฌ ์ญ‰! ์ด๋™ํ•˜๋Š” ๊ฒƒ์„ ๊ตฌํ˜„ํ•  ๊ฒƒ์ธ๊ฐ€?

์œ„ ๋ฐฉ์‹๋Œ€๋กœ ๊ฐ’์€ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์œผ๋‚˜ ํƒ์ƒ‰ ์ค‘ ์ด๋™ ์˜ˆ์ • ์œ„์น˜๋ฅผ ๋ฌธ์ œ ์กฐ๊ฑด์— ๋งž์ถฐ์•ผ ํ•œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด for ๋ฌธ๊ณผ while๋ฌธ์˜ ์ค‘์ฒฉ์„ ํ™œ์šฉํ•œ๋‹ค.

for ๋ฌธ์˜ ์—ญํ• 

for ๋ฌธ์€ ํƒ์ƒ‰ ์ด๋™ ๋ฐฉํ–ฅ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ฆ‰, for ๋ฌธ์—์„œ ์ฒซ ๋ฒˆ์งธ ์ธ๋ฑ์Šค์ธ ๊ฒฝ์šฐ ๋™์ชฝ์œผ๋กœ, ๋‘ ๋ฒˆ์งธ ์ธ๋ฑ์Šค์ธ ๊ฒฝ์šฐ ๋‚จ์ชฝ์œผ๋กœ, ์„ธ ๋ฒˆ์งธ ์ธ๋ฑ์Šค์ธ ๊ฒฝ์šฐ ์„œ์ชฝ์œผ๋กœ, ๋„ค ๋ฒˆ์งธ ์ธ๋ฑ์Šค์ธ ๊ฒฝ์šฐ ๋ถ์ชฝ์œผ๋กœ ์ด๋™ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰, ํ•ด๋‹น for๋ฌธ์˜ ์ธ๋ฑ์Šค ์ˆœ๋ฒˆ์— ๋”ฐ๋ผ ์ด๋™ ๋ฐฉํ–ฅ์ด ๊ฒฐ์ •๋˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ ์ฝ”๋“œ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

    up_dx = [-1, 0, 1, 0]
    up_dy = [0, 1, 0, -1]
    st_x, st_y = up_x, up_y
    for k in range(4):
        while True:
            prev_x, prev_y = st_x, st_y
            st_x += up_dx[k]
            st_y += up_dy[k]
            if not (0 <= st_x and st_x <= up_x and 0 <= st_y and st_y < M):
                st_x -= up_dx[k]
                st_y -= up_dy[k]
                break
            original_matrix[prev_x][prev_y] = original_matrix[st_x][st_y]
  • for ๋ฌธ์˜ k๋Š” up_dx[k]์˜ ํ˜•ํƒœ๋กœ ํ™œ์šฉ๋œ๋‹ค. k๊ฐ€ 0์ธ ๊ฒฝ์šฐ up_dx[k], up_dy[k]๋Š” ๊ฐ๊ฐ  -1, 0์ด ๋œ๋‹ค.
  • k๊ฐ€ ์ฆ๊ฐ€ํ•˜๋ฉฐ st_x, st_y๊ฐ€ ๋ณ€ํ™”ํ•˜๋Š” ๊ฐ’์ด ๋‹ฌ๋ผ์ง€๋Š” ๊ฒƒ์ด๋‹ค.

while ๋ฌธ์˜ ์—ญํ• 

while ๋ฌธ์€ ๋ฒ”์œ„ ํ•œ๊ณ„๊นŒ์ง€ '์ฃผ์šฑ!'์ด๋™ํ•˜๋„๋ก ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

        while True:
            prev_x, prev_y = st_x, st_y
            st_x += up_dx[k]
            st_y += up_dy[k]
            if not (0 <= st_x and st_x <= up_x and 0 <= st_y and st_y < M):
                ...
                break

st_x, st_y๋Š” if ๋ฌธ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์—ฌ ๋‚ด๋ถ€๋กœ ๋“ค์–ด๊ฐ€๊ธฐ ์ „๊นŒ์ง€ ์ง€์† ๋ฐ˜๋ณต๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๊ณต๊ธฐ ์ฒญ์ •๊ธฐ๊ฐ€ ์ˆœํšŒํ•˜์—ฌ์•ผ ํ•˜๋Š” ๋ฒ”์œ„๋ฅผ ๋ชจ๋‘ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ข…๋ฃŒ ์กฐ๊ฑด์€ ๊ณต๊ธฐ ์ฒญ์ •๊ธฐ๊ฐ€ ๋จผ์ง€๋ฅผ ์ˆœํ™˜์‹œํ‚ค๋Š” ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค.

๐Ÿ’ก ์ด์ „์— ํ’€์ง€ ๋ชป ํ•œ ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ํ’€์—ˆ์„ ๋•Œ '๋งž์•˜์Šต๋‹ˆ๋‹ค!!'๋ฅผ ๋ฐ›์œผ๋ฉด ๊ทธ ํฌ์—ด์€ ์—„์ฒญ๋‚˜๋‹ค. ๋„ํŒŒ๋ฏผ ๐Ÿ’ฅ

๐Ÿ“ ์ฝ”๋“œ ์ „๋ฌธ