반응형
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
- 다이나믹 프로그래밍
- Color
- 검색트리
- html
- 프로그래머스
- BFS
- 클린코드
- algorithm
- Kotlin
- 코딩테스트
- CleanCode
- android
- CSS
- Spring
- 해슁
- DP
- front-end
- javascript
- inflearn
- java
- 자바
- SQL
- 순환
- DFS
- Web
- SWEA
- 알고리즘
- 정렬
- 구현
- codecademy
Archives
- Today
- Total
깡뇽
[백준] 16926번 배열 돌리기1 파이썬 본문
반응형
NxM 크기 배열
반시계 방향 돌리기
ex) 배열 2번 회전
- 입력
1줄 : N, M, R (R은 회전의 수)
2~N줄 : 배열 A의 원소 Aij
- 출력
배열을 R번 회전시킨 결과
- 제한
2 ≤ N, M ≤ 300
1 ≤ R ≤ 1,000
min(N, M) mod 2 = 0
1 ≤ Aij ≤ 10^8
16926번 배열 돌리기1
n, m, r = map(int, input().split())
a = []
new_a = [[0]*m for i in range(n)]
for _ in range(n):
a.append(list(map(int, input().split())))
for i in range(n):
for j in range(m):
rest_i = (i+r) % n
rest_j = (m+r) % m
if j == 1 or j == m:
if i + r <= n:
new_a[i+r][j] = a[i][j]
else:
1. 어디까지 고민을 했는가
입력을 받고 배열A를 R바퀴 회전시킨다.
회전되어서 변경된 인덱스를 가지는 값들을 0으로 초기화되어있는 이중 배열에 변경된 위치 인덱스를 사용해 넣어준다.
반복문에서 j가 m보다 작거나 같을 때에는 j에 회전값을 더하지만 클 때는 나눗셈 나머지를 활용해서 이동시킴...?
2. 어디서 막혔는가
회전할 때에 한 층씩 관여됨.
만약 홀수x홀수이면 가장 중앙은 어떻게 되는가..
=> 한겹씩 따로 뗴어서 생각하자..!
한 겹을 제거하면 n-2와 m-2가 됨.
n과 m 중에서 작은 값을 2로 나눈 것만큼의 겹이 있음.
3. 코드를 보고 개선한 방향
import sys
def rotate():
x, y = 0, 0
n, m = N, M
time = min(N, M) // 2
while time:
first_value = board[x][y]
# 윗쪽
for i in range(m - 1):
board[x][y + i] = board[x][y + i + 1]
# 오른쪽
for i in range(n - 1):
board[x + i][y + m - 1] = board[x + i + 1][y + m - 1]
# 아래쪽
for i in range(m - 1):
board[x + n - 1][y + m - 1 - i] = board[x + n - 1][y + m - 2 - i]
# 왼쪽
for i in range(n - 1):
board[x + n - 1 - i][y] = board[x + n - 2 - i][y]
board[x + 1][y] = first_value
n -= 2
m -= 2
x += 1
y += 1
time -= 1
def getResult():
for _ in range(R):
rotate()
for row in board:
print(*row)
N, M, R = list(map(int, sys.stdin.readline().split()))
board = [list(map(int, sys.stdin.readline().split())) for _ in range(N)]
getResult()
한 층에서 위, 오, 아, 왼 순서대로 한 줄 씩 이동할 떄에 한 칸씩 비우고 이동.
맨 처음 왼쪽에서 비운자리는 first_value로 for 반복문으로 이동할 수 없어서 별도로 이동시킴.
n과 m 사용 주의.
출처 : https://www.acmicpc.net/problem/16926
참고 : https://handhand.tistory.com/185
반응형
'Algorithm > BAEKJOON' 카테고리의 다른 글
[백준] 16935번 배열 돌리기3 파이썬 (0) | 2022.10.07 |
---|---|
[백준] 16927번 배열 돌리기2 파이썬 (0) | 2022.10.07 |
[백준] 17144번 미세먼지 안녕! 파이썬 (0) | 2022.10.05 |
[백준] 15685번 드래곤 커브 파이썬 (0) | 2022.10.05 |
[백준] 15686번 치킨 배달 파이썬 (1) | 2022.10.04 |