๐Ÿ’ซ ETC/Problem Solving

[SWEA] 1220.[S/W ๋ฌธ์ œํ•ด๊ฒฐ ๊ธฐ๋ณธ] 5์ผ์ฐจ - Magnetic

ming412 2023. 11. 18. 11:41

โœ๏ธ ๋ฌธ์ œ ์š”์•ฝ

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=3&contestProbId=AV14hwZqABsCFAYD&categoryId=AV14hwZqABsCFAYD&categoryType=CODE

 

SW Expert Academy

SW ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์—ญ๋Ÿ‰ ๊ฐ•ํ™”์— ๋„์›€์ด ๋˜๋Š” ๋‹ค์–‘ํ•œ ํ•™์Šต ์ปจํ…์ธ ๋ฅผ ํ™•์ธํ•˜์„ธ์š”!

swexpertacademy.com

 

ํ…Œ์ด๋ธ” ์œ„์— ๋ถ‰์€ ์ž์„ฑ์ฒด์™€ ํ‘ธ๋ฅธ ์ž์„ฑ์ฒด๊ฐ€ ์žˆ๋‹ค. ์ž๊ธฐ์žฅ์„ ๊ฐ€ํ–ˆ์„ ๋•Œ ๋ถ‰์€ ์ž์„ฑ์ฒด๋Š” S๊ทน์— ์ด๋Œ๋ฆฌ๊ณ , ํ‘ธ๋ฅธ ์ž์„ฑ์ฒด๋Š” N๊ทน์— ์ด๋Œ๋ฆฐ๋‹ค.

์ž๊ธฐ์žฅ์„ ๊ฐ€ํ–ˆ์„ ๋•Œ ๊ต์ฐฉ ์ƒํƒœ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜์—ฌ๋ผ.

(์ž์„ฑ์ฒด๋Š” ํ…Œ์ด๋ธ” ์•ž๋’ค ์ชฝ์— ์žˆ๋Š” N๊ทน ๋˜๋Š” S๊ทน์—๋งŒ ๋ฐ˜์‘ํ•˜๋ฉฐ ์ž์„ฑ์ฒด๋ผ๋ฆฌ๋Š” ์ „ํ˜€ ๋ฐ˜์‘ํ•˜์ง€ ์•Š๋Š”๋‹ค.)

 

 

๐Ÿ’ช ๋ฌด์‹ํ•˜๊ฒŒ ํ’€๊ธฐ

๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•œ ์กฐ๊ฑด์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

- ํ…Œ์ด๋ธ”(=๋ณด๋“œ)์„ 90๋„ ๋Œ๋ฆฌ๋ฉด, ์ž์„ฑ์ฒด๊ฐ€ ์œ„/์•„๋ž˜๊ฐ€ ์•„๋‹ˆ๋ผ ์ขŒ/์šฐ๋กœ ์›€์ง์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌํ˜„์ด ์‰ฌ์›Œ์ง„๋‹ค!
    - ๋ถ‰์€ ์ž์„ฑ์ฒด(=1) -> ์™ผ์ชฝ์œผ๋กœ๋งŒ ์›€์ง์ธ๋‹ค.
    - ํ‘ธ๋ฅธ ์ž์„ฑ์ฒด(=2) -> ์˜ค๋ฅธ์ชฝ์œผ๋กœ๋งŒ ์›€์ง์ธ๋‹ค.
- ์ž๊ธฐ์žฅ์„ ๊ฐ€ํ–ˆ์„ ๋•Œ "๋–จ์–ด๋œจ๋ฆด ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ž์„ฑ์ฒด๋“ค์„ ๋–จ์–ด๋œจ๋ฆฐ๋‹ค"๊ณ  ์ƒ๊ฐ ํ›„, ๋‚จ์€ ์ž์„ฑ์ฒด๋ฅผ ๊ฐ€์ง€๊ณ  ๊ต์ฐฉ ์ƒํƒœ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜์ž.
- ๊ฐ๊ฐ์˜ ํ–‰(๊ฐ€๋กœ)๋“ค์„ ๋ณ„๊ฐœ๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.
- ๋ณด๋“œ ์œ„์—์„œ "0"์ธ ์นธ๋งŒ ์ด๋™ ๊ฐ€๋Šฅํ•˜๋‹ค. 

 

์šฐ๋ฆฌ๊ฐ€ ํ•ด์•ผํ•˜๋Š” ์ผ์€ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

1. ์ž๊ธฐ์žฅ์„ ๊ฐ€ํ•œ ์ƒํƒœ์˜ ๋ณด๋“œ๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒƒ

2. 1๋ฒˆ ์ƒํƒœ์˜ ๋ณด๋“œ์—์„œ ๊ต์ฐฉ ์ƒํƒœ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒƒ

 

๊ฐœ์ธ์ ์œผ๋กœ 1๋ฒˆ๋ณด๋‹ค 2๋ฒˆ์ด ๋” ์ƒ๊ฐํ•ด์•ผํ• ๊ฒŒ ๋งŽ๋‹ค๊ณ  ๋А๊ปด์„œ 2๋ฒˆ ์ฝ”๋“œ๋ฅผ ๋”ฐ๋กœ ๋ณผ ๊ฒƒ์ด๋‹ค. (1๋ฒˆ์€ ์•„๋ž˜ ์ฝ”๋“œ ์ฃผ์„์— ์ฃผ์„์œผ๋กœ ๋‹ฌ์•„๋†“์•˜๋‹ค.)

 

์ฒ˜์Œ์—๋Š” ์ž๊ธฐ์žฅ์„ ๊ฐ€ํ•œ ํ›„ ๋ถ™์–ด์žˆ๋Š” ๋ฉ์–ด๋ฆฌ(?)๋ฅผ ํ•˜๋‚˜์˜ ๊ต์ฐฉ ์ƒํƒœ๋กœ ์„ธ๋Š” ๊ฒƒ์œผ๋กœ ์ฐฉ๊ฐํ–ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋ฌธ์ œ ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด, ์•„๋ž˜ ์ƒํƒœ๋ฅผ ๊ต์ฐฉ ์ƒํƒœ๊ฐ€ 7๊ฐœ์ธ ์ƒํƒœ๋ผ๊ณ  ํ–ˆ๋‹ค.

๊ฐ ์—ด์—์„œ ๋นจ๊ฐ•๊ณผ ํŒŒ๋ž‘ ์ฆ‰, "12"๊ฐ€ ๋ถ™์–ด์žˆ์„ ๋•Œ ํ•˜๋‚˜์˜ ๊ต์ฐฉ์ƒํƒœ๋กœ ์„ธ๋Š” ๊ฒƒ์ด๋‹ค.

์šฐ๋ฆฌ๋Š” ๋ณด๋“œ๋ฅผ ๋Œ๋ ธ๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ ํ–‰์—์„œ ํŒŒ๋ž‘๊ณผ ๋นจ๊ฐ• ์ฆ‰, "21"์ด ๋ถ™์–ด์žˆ์„ ๋•Œ ๊ต์ฐฉ์ƒํƒœ๋กœ ์„ธ๋ฉด ๋œ๋‹ค.

 

๊ตฌํ˜„ํ•œ ๋ฐฉ๋ฒ•์€, ๋ณด๋“œ์˜ ๊ฐ `row`๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•œ ๋’ค, 0์„ ๊ธฐ์ค€์œผ๋กœ ์ชผ๊ฐœ ๋ฌธ์ž์—ด ๋ฆฌ์ŠคํŠธ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋ฌธ์ž์—ด ๋ฆฌ์ŠคํŠธ ์ค‘์—์„œ "21"์˜ ๊ฐœ์ˆ˜๋ฅผ ์นด์šดํŠธํ•˜์—ฌ ๋ˆ„์ ํ•˜๋ฉด ๋œ๋‹ค.

 # ๊ต์ฐฉ์ƒํƒœ ์นด์šดํŠธ
cnt = 0
for row in board:
    S = ''.join(map(str, row))
    for x in S.split('0'):
        cnt += x.count('21')

 

์ „์ฒด ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

import sys
sys.stdin = open("input.txt", "r")
sys.stdout = open("output.txt", "w")

# ๋ณด๋“œ 90๋„ ํšŒ์ „ (size๋Š” ํ•œ ๋ณ€์˜ ๊ธธ์ด)
def rotate(B, size):
    RB = [[0]*size for _ in range(size)]
    for i in range(size):
        for j in range(size):
            RB[j][size-1-i] = B[i][j]
    return RB

TC = 10
for test_case in range(1, TC+1):
    N = int(input())
    board = [list(map(int, input().split())) for _ in range(N)]
    board = rotate(board, N) # 90๋„ ํšŒ์ „ # ์ด์ œ ์ขŒ์šฐ๋กœ๋งŒ ์›€์ง์ž„ (1->์™ผ์ชฝ 2->์˜ค๋ฅธ์ชฝ)

    for i in range(N):
        for j in range(N):
            if board[i][j] == 0: continue
            target = j
            if board[i][j] == 1: # ๋นจ๊ฐ• -> ์™ผ์ชฝ์œผ๋กœ๋งŒ ์ด๋™ ๊ฐ€๋Šฅ
                while target-1 >= 0 and board[i][target-1] == 0:
                    board[i][target] = 0 # ๊ธฐ์กด ์œ„์น˜๋Š” 0์œผ๋กœ
                    board[i][target-1] = 1 # ๋นจ๊ฐ•์„ ์™ผ์ชฝ์œผ๋กœ ์ด๋™
                    target -= 1
                if board[i][0] == 1: # ๋นจ๊ฐ•์ด ์™ผ์ชฝ ๋์— ์˜จ๋‹ค๋ฉด ๋–จ์–ด์ง„๋‹ค
                    board[i][0] = 0
            elif board[i][j] == 2: # ํŒŒ๋ž‘ -> ์˜ค๋ฅธ์ชฝ์œผ๋กœ๋งŒ ์ด๋™ ๊ฐ€๋Šฅ
                while target+1 < N and board[i][target+1] == 0:
                    board[i][target] = 0 # ๊ธฐ์กด ์œ„์น˜๋Š” 0์œผ๋กœ
                    board[i][target+1] = 2  # ํŒŒ๋ž‘์„ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™
                    target += 1
                if board[i][N-1] == 2: # ํŒŒ๋ž‘์ด ์˜ค๋ฅธ์ชฝ ๋์— ์˜จ๋‹ค๋ฉด ๋–จ์–ด์ง„๋‹ค
                    board[i][N-1] = 0

    # ๊ต์ฐฉ์ƒํƒœ ์นด์šดํŠธ
    cnt = 0
    for row in board:
        S = ''.join(map(str, row))
        for x in S.split('0'):
            cnt += x.count('21')

    print('#{} {}'.format(test_case, cnt))

 

โœจ ์šฐ์•„ํ•˜๊ฒŒ ํ’€๊ธฐ

์œ„ ํ’€์ด์—์„œ ๋ถˆํ•„์š”ํ•œ ๊ณผ์ •์ด ๋งŽ์Œ์„ ๊นจ๋‹ฌ์•˜๋‹ค..

- `flag`: ๊ต์ฐฉ ์ƒํƒœ ํ™•์ธ์„ ์œ„ํ•œ ๋ณ€์ˆ˜

- N๊ทน์„ ๋งŒ๋‚˜๋ฉด `flag`๋ฅผ ํ™œ์„ฑํ™” ์‹œํ‚ค๊ณ , ๊ทธ ์ƒํƒœ์—์„œ S๊ทน์„ ๋งŒ๋‚˜๋ฉด ๊ต์ฐฉ ์ƒํƒœ

    - ์ดํ›„ `flag`๋ฅผ ์ดˆ๊ธฐํ™”

for tc in range(1, 11):
    n = int(input())
    mag = [list(map(int, input().split())) for _ in range(n)]  # 1: N, 2: S
 
    total_res = 0
    for i in range(n):
        flag = 0
        for j in range(n):
            if mag[j][i] == 1:
                flag = 1
            elif mag[j][i] == 2:
                if flag :
                    total_res += 1
                    flag = 0
 
    print(f'#{tc} {total_res}')

 

๐Ÿ”— ์ฐธ๊ณ 

[SWEA][Python]#1220. Magnetic