Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 2019 KAKAO BLIND RECRUITMENT
- 2020 KAKAO BLIND RECRUITMENT
- 스택
- 최소 신장 트리
- 투 포인터
- 플로이드와샬
- 크루스칼
- 로봇 청소기
- 다익스트라
- 투포인터
- 백준
- 2021 KAKAO BLIND RECRUITMENT
- SWEA
- 2020 카카오 인턴십
- GIT
- 플로이드 와샬
- 시뮬레이션
- 2018 KAKAO BLIND RECRUITMENT
- BFS
- 프로그래머스
- 파이썬
- 구현
- 브루트포스
- 이분탐색
- 조합
- 비트마스킹
- 백트래킹
- 우선순위큐
- 트라이
- Spring
Archives
- Today
- Total
개발조아
[BOJ/백준] 16927 배열 돌리기 2 파이썬 본문
728x90
문제 링크 : https://www.acmicpc.net/problem/16927
2차원 배열을 규칙에 바깥부터 한꺼풀씩 돌리는 것이다. 반시계 방향으로 돌리는 것이다.
그냥 쉽게 숫자 하나씩 반시계방향으로 한칸씩 밀면서 하려고 보니 최대 10^9 만큼 돌려야한다.
그러므로 한바퀴 돌릴때 원소의 개수를 구해서 모듈러 연산을 이용하여 횟수를 줄이자.
4x4 행렬일 경우 첫번째 꺼풀의 원소 개수는 (4-1)*2+(4-1)*2=12개이다. 그러므로 12바퀴 돌리면 제자리로 오게된다.
이를 이용하여 연산횟수를 줄이자. 이제 이 횟수만큼 반시계 방향으로 돌리면 된다.
줄여도 횟수가 많다. 더 줄여보자.
회전하려는 꺼풀을 1자로 펼치고 인덱스를 더하는 방식으로 한다면 더 빠르게 돌릴 수 있다.
예를 들어
1 2 3
8 9 4
7 6 5
라고 한다면
첫번째 꺼풀은 1 2 3 4 5 6 7 8이다
여기서 12바퀴 회전한다면 각 원소의 위치는 (idx-12)%8이 될 것이다.
이때 idx-12가 음수가 되는데 이는 8+(음수결과값)으로 계산이된다. 이는 모듈러 연산 성질이다.
가장 중요한 것이 한꺼풀씩 빼내는 것이다.
회전의 시작 인덱스는 (0,0),(1,1),(2,2) 이런식으로 최대 min(n,m)만큼 돌리게 된다.
또한 한꺼풀씩 들어갈때 n과 m은 2씩 줄어든다.
이것 직접 그려보면 금방 이해된다.
나는 반복문 4개로 테두리별로 빼서 임시 배열에 저장하고, 다시 테두리 돌면서 값을 업데이트 시켰다.
이는 코드를 보면 금방 이해가 갈 것이다.
from sys import stdin
input = stdin.readline
n,m,r = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(n)]
def solv():
global n,m
p = 0
for _ in range(min(n,m)//2):
rotate(p,p)
p += 1
n -= 2
m -= 2
for row in board:
print(*row)
def rotate(sx,sy):
global board
length = (n-1)*2+(m-1)*2
row = [0]*length
idx = 0
for y in range(sy, sy+m-1):
row[(idx-r)%length] = board[sx][y]
idx+=1
for x in range(sx, sx+n-1):
row[(idx-r)%length] = board[x][sy+m-1]
idx += 1
for y in range(sy+m-1, sy,-1):
row[(idx-r)%length] = board[sx+n-1][y]
idx += 1
for x in range(sx+n-1, sx,-1):
row[(idx-r)%length] = board[x][sy]
idx+=1
idx = 0
for y in range(sy, sy+m-1):
board[sx][y] = row[idx]
idx += 1
for x in range(sx, sx+n-1):
board[x][sy+m-1] = row[idx]
idx += 1
for y in range(sy+m-1, sy,-1):
board[sx+n-1][y] = row[idx]
idx += 1
for x in range(sx+n-1, sx,-1):
board[x][sy] = row[idx]
idx += 1
solv()
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ/백준] 14503 로봇 청소기 파이썬 (0) | 2021.09.09 |
---|---|
[BOJ/백준] 14891 톱니바퀴 파이썬 (0) | 2021.09.09 |
[BOJ/백준] 16434 드래곤 앤 던전 파이썬 (0) | 2021.09.05 |
[BOJ/백준] 7573 고기잡이 파이썬 (0) | 2021.09.01 |
[BOJ/백준] 11967 불켜기 파이썬 (0) | 2021.08.31 |
Comments