๐Ÿ”‘ CS/์ฝ”๋”ฉํ…Œ์ŠคํŠธ

[๋ฐฑ์ค€ 16926๋ฒˆ] ๋ฐฐ์—ด ๋Œ๋ฆฌ๊ธฐ 1 (python/ํŒŒ์ด์ฌ)

๋ณต๋งŒ 2022. 7. 5. 00:21

๋ฌธ์ œ ์„ค๋ช…์„ ๊ทธ๋Œ€๋กœ ๊ตฌํ˜„ํ–ˆ๋”๋‹ˆ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋– ์„œ, ์ข€๋” ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์„ ๊ณ ์•ˆํ•ด์•ผ ํ–ˆ์Œ.

 

๐ŸŒผ ๋ฌธ์ œ ๋งํฌ

https://www.acmicpc.net/problem/16926

 

16926๋ฒˆ: ๋ฐฐ์—ด ๋Œ๋ฆฌ๊ธฐ 1

ํฌ๊ธฐ๊ฐ€ N×M์ธ ๋ฐฐ์—ด์ด ์žˆ์„ ๋•Œ, ๋ฐฐ์—ด์„ ๋Œ๋ ค๋ณด๋ ค๊ณ  ํ•œ๋‹ค. ๋ฐฐ์—ด์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ˜์‹œ๊ณ„ ๋ฐฉํ–ฅ์œผ๋กœ ๋Œ๋ ค์•ผ ํ•œ๋‹ค. A[1][1] ← A[1][2] ← A[1][3] ← A[1][4] ← A[1][5] ↓ ↑ A[2][1] A[2][2] ← A[2][3] ← A[2][4] A[2][5]

www.acmicpc.net

  • ํ‹ฐ์–ด: ์‹ค๋ฒ„ I
  • ๋ถ„๋ฅ˜: ๊ตฌํ˜„

 

 

โ— TRIAL 1.

๋”๋ณด๊ธฐ
์ฝ”๋“œ
def move(v1, v2, direction, arr, ans):
    if direction == 'l':
        x = v1[0]
        for y in range(v1[1], v2[1]):
            ans[x][y] = arr[x][y+1]
    elif direction == 'u':
        y = v1[1]
        for x in range(v1[0], v2[0]):
            ans[x][y] = arr[x+1][y]
    elif direction == 'r':
        x = v1[0]
        for y in range(v2[1]+1, v1[1]+1):
            ans[x][y] = arr[x][y-1]
    else: # 'd'
        y = v1[1]
        for x in range(v2[0]+1, v1[0]+1):
            ans[x][y] = arr[x-1][y]
    return ans
    
N, M, R = map(int, input().split())
arr = []
for _ in range(N):
    arr.append(list(map(int, input().split())))

ans = [[0 for _ in range(M)] for _ in range(N)]

num_circle = min(N//2, M//2)
for r in range(R):
    for i in range(num_circle):
        v = [(i, i), (i, M-i-1), (N-i-1, M-i-1), (N-i-1, i), (i, i)]
        d = ['l', 'u', 'r', 'd']
        for j in range(4):
            ans = move(v[j], v[j+1], d[j], arr, ans)
    arr = [ans_i[:] for ans_i in ans]

for ans_i in ans:
    print(' '.join(map(str, ans_i)))

 

์ฝ”๋“œ ์„ค๋ช…

 

- ๊ฐ™์€ ํšŒ์ „ group ์•ˆ์— ์žˆ๋Š” ์›์†Œ ๋‹จ์œ„๋กœ ํšŒ์ „์„ ํšŒ์ „ ํšŸ์ˆ˜๋งŒํผ ์ง„ํ–‰ํ•จ.

- ๊ฐ ํšŒ์ „์— ๋Œ€ํ•ด, l, u, r, d๋กœ ๋ฐฉํ–ฅ์„ ์ง€์ •ํ•˜๊ณ  ๋ฐฐ์—ด์„ ํšŒ์ „์‹œํ‚ด.

 

ํ‹€๋ฆฐ ์›์ธ

 

์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ ์›์†Œ๋“ค์ด ํšŒ์ „ํ•˜๋ฏ€๋กœ, ์ผ์ • ํšŸ์ˆ˜์˜ ํšŒ์ „ ์ดํ›„์—๋Š” ์›๋ž˜ ์ƒํƒœ์™€ ๋™์ผํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜์Œ.

 

 

โ— TRIAL 2.

๋”๋ณด๊ธฐ
์ฝ”๋“œ
def move(v1, v2, direction, arr, ans):
    if direction == 'l':
        x = v1[0]
        for y in range(v1[1], v2[1]):
            ans[x][y] = arr[x][y+1]
    elif direction == 'u':
        y = v1[1]
        for x in range(v1[0], v2[0]):
            ans[x][y] = arr[x+1][y]
    elif direction == 'r':
        x = v1[0]
        for y in range(v2[1]+1, v1[1]+1):
            ans[x][y] = arr[x][y-1]
    else: # 'd'
        y = v1[1]
        for x in range(v2[0]+1, v1[0]+1):
            ans[x][y] = arr[x-1][y]
    return ans

N, M, R = map(int, input().split())
arr = []
for _ in range(N):
    arr.append(list(map(int, input().split())))

ans = [arr_i[:] for arr_i in arr]

num_circle = min(N//2, M//2)
for i in range(num_circle):
    R_i = R%(2*(M+N-4*i-2))
    for _ in range(R_i):
        v = [(i, i), (i, M-i-1), (N-i-1, M-i-1), (N-i-1, i), (i, i)]
        d = ['l', 'u', 'r', 'd']
        for j in range(4):
            ans = move(v[j], v[j+1], d[j], arr, ans)
        arr = [ans_i[:] for ans_i in ans]

for ans_i in ans:
    print(' '.join(map(str, ans_i)))

 

์ˆ˜์ •ํ•œ ๋ถ€๋ถ„

 

- ๊ฐ ํšŒ์ „์— ๋Œ€ํ•ด์„œ, ํšŒ์ „ ํšŸ์ˆ˜๋ฅผ ํšŒ์ „ํ•˜๋Š” ์›์†Œ์˜ ๊ฐฏ์ˆ˜๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€ ๋งŒํผ๋งŒ ํšŒ์ „์‹œ์ผœ์„œ ํšŒ์ „ ํšŸ์ˆ˜๋ฅผ ์ตœ์†Œํ•œ์œผ๋กœ ํ–ˆ์Œ.

 

ํ‹€๋ฆฐ ์›์ธ

 

์‹œ๊ฐ„์ดˆ๊ณผ. ๋ฌธ์ œ์—์„œ ์„ค๋ช…ํ•œ ๋ฐฉ์‹์ฒ˜๋Ÿผ ๋งค ํšŒ์ „๋งˆ๋‹ค ํ•œ ๋ฒˆ์˜ for ๋ฌธ์„ ๋Œ๊ฒŒ ํ•˜๋ฉด iteration ํšŸ์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ๋Š˜์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ํšŒ์ „์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•จ.

 

๐Ÿ’ก Solution

์ฝ”๋“œ
N, M, R = map(int, input().split())
arr = []
for _ in range(N):
    arr.append(list(map(int, input().split())))
arrT = [list(x) for x in zip(*arr)]

num_circle = min(N//2, M//2) #ํ•จ๊ป˜ ํšŒ์ „ํ•˜๋Š” group์˜ ๊ฐœ์ˆ˜

for i in range(num_circle):
    c_h, c_w = N-2*i-1, M-2*i-1
    R_i = R%(2*(c_h+c_w)) #์ตœ์†Œ ํšŒ์ „ ํšŸ์ˆ˜
    
    circle_line = arr[i][i:i+c_w] + arrT[i+c_w][i:i+c_h] + arr[i+c_h][i+c_w:i:-1] + arrT[i][i+c_h:i:-1]
    
    new_circle_line = circle_line[R_i:] + circle_line[:R_i]
    
    arr[i][i:i+c_w] = new_circle_line[:c_w] #u
    arr[i+c_h][i+1:i+c_w+1] = new_circle_line[2*c_w+c_h-1:c_w+c_h-1:-1] #d
    for dx in range(c_h): 
        arr[i+dx][i+c_w] = new_circle_line[c_w+dx] #r
        arr[i+c_h-dx][i] = new_circle_line[2*c_w+c_h+dx] #l

for ans_i in arr:
    print(' '.join(map(str, ans_i)))

 

์ฝ”๋“œ ์„ค๋ช…
  • ๊ฐ™์€ ํšŒ์ „ group ์•ˆ์— ์žˆ๋Š” ์›์†Œ ๋‹จ์œ„๋กœ ํ•œ ๋ฒˆ์— ํšŒ์ „์„ ์ง„ํ–‰ํ•จ
  • ํšŒ์ „ ํšŸ์ˆ˜๋ฅผ ํšŒ์ „ํ•˜๋Š” ์›์†Œ์˜ ๊ฐฏ์ˆ˜๋กœ ๋‚˜๋ˆ„์–ด ์ตœ์†Œ ํšŒ์ „ ํšŸ์ˆ˜๋ฅผ ๊ตฌํ•จ
  • ์šฐ์„ , ๊ฐ™์€ ํšŒ์ „ group ์•ˆ์— ์žˆ๋Š” ์›์†Œ๋“ค์„ ์ผ๋ ฌ๋กœ ํŽผ์ณ์„œ ํ•˜๋‚˜์˜ list์— ๋ชจ๋‘ ๋‹ด์Œ (circle_line). ์ด๋ฅผ for ๋ฌธ ์—†์ด ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด arr๋ฅผ transposeํ•œ arrT๋ฅผ ์ฒ˜์Œ์— ์ €์žฅํ•จ.
  • circle_line์„ ์ž๋ฅด๊ณ  ์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ๋Š” ๋ฐฉ์‹์œผ๋กœ ํšŒ์ „์„ ๊ตฌํ˜„
  • ์ด๋ฅผ ๋‹ค์‹œ arr์— ์ˆœ์„œ๋Œ€๋กœ ๋‹ด์Œ.

 

์ฃผ์˜์‚ฌํ•ญ
  • ๋ฌธ์ œ์—์„œ ์„ค๋ช…ํ•œ ๋ฐ”์™€ ๊ฐ™์ด ํšŒ์ „ ํšŸ์ˆ˜๋งŒํผ ํšŒ์ „์„ ๊ตฌํ˜„ํ•˜๋ฉด, (ํ˜น์€ ์ตœ์†Œ ํšŒ์ „ ํšŸ์ˆ˜๋งŒํผ๋งŒ ๊ตฌํ˜„ํ•ด๋„) ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋œธ.

 

๋‹ค๋ฅธ ํ’€์ด
  • ํ’€์ด1: queue์™€ while๋ฌธ์„ ์ด์šฉ
    • i๋ฒˆ์งธ ํšŒ์ „ group์˜ ์‹œ์ž‘์ ์€ (i, i)์ด๊ณ , ๊ฐ ํšŒ์ „ group์˜ ํฌ๊ธฐ๋Š” (N, M)๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ 2์”ฉ ์ค„์–ด๋“ ๋‹ค.
    • ๊ฐ ํšŒ์ „ group์— ๋Œ€ํ•ด ์šฐ->ํ•˜->์ขŒ->์ƒ ์ˆœ์„œ๋กœ queue์— appendํ•œ๋‹ค.
    • -R๋งŒํผ rotateํ•œ๋‹ค.
    • ํšŒ์ „ํ•œ queue๋ฅผ ์ˆœ์„œ๋Œ€๋กœ popํ•˜์—ฌ ๋‹ค์‹œ ๋ฐฐ์—ด์— ๋Œ€์ž…ํ•œ๋‹ค.
    • ๋‚ด ํ’€์ด์™€์˜ ์ฐจ์ด์ : queue๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๋ฉด ์ „์ฒด์ ์ธ ๋กœ์ง์€ ๋‚ด ์ฝ”๋“œ์™€ ๋น„์Šทํ•˜๋‚˜, ํ›จ์”ฌ ๊น”๋”ํ•˜๊ณ  ์ง๊ด€์ ์ด๋‹ค.์‹œ๊ฐ„๋ณต์žก๋„๋Š” ๋น„์Šทํ• ๋“ฏ.. ํŠนํžˆ while ๋ฌธ์„ ์ด์šฉํ•ด์„œ ๊ฐ ํšŒ์ „ group์˜ ์‹œ์ž‘์ ๊ณผ h, w๋ฅผ ์ง€์ •ํ•˜๊ณ , ๋งค iteration๋งˆ๋‹ค +1/-2๋ฅผ ํ•ด์คŒ์œผ๋กœ์จ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์„œ ๊น”๋”ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
๋ฐ˜์‘ํ˜•