회전, 달팽이를 더 디테일하게 인덱스로 접근해보자.
이전에 zip 함수를 통한 접근도 괜찮은 방법이지만, 이렇게 인덱스로 접근해서 문제를 푸는 법도 공부하는게 좋다.
정사각형 시계방향 회전
회전하기 전의 인덱스와 회전하기 후의 각각 인덱스 변화를 보고,
규칙을 찾으면 아래와 같다.
아래 코드는 정올 회전(#1229) 문제에 대한 답이다.
n = int(input())
maps = [list(map(int,input().split())) for _ in range(n)]
while True:
a = int(input().rstrip())
if a == 0:
break
cnt = (a // 90) % 4
for _ in range(cnt):
new_maps = [[0]*n for _ in range(n)]
for i in range(n):
for j in range(n):
new_maps[j][n-1-i] = maps[i][j]
# new_maps[i][j] = maps[j][n-1-i] 틀린 코드
# maps = [[maps[j][n-1-i] for j in range(n)] for i in range(n)] # 틀린 코드
maps = new_maps
for i in maps:
for j in i:
print(j,end=' ')
print()
처음에는
# new_maps[i][j] = maps[j][n-1-i]
# maps = [[maps[j][n-1-i] for j in range(n)] for i in range(n)]
와 같이 maps[i][j] = maps[j][n-1-i] 를 적용하면 그냥 상관없을 줄 알았는데, 이렇게 적용하면 반시계방향 회전이된다.
값을 대입해야할 객체를 잘 떠올리면 지금은 map[i][j]의 값을 변경하는게 아닌, 해당 값을 다른 위치에 옮겨야하는 것이기 때문이다.
직사각형 시계방향 회전
정사각형과 구현 논리가 비슷하지만, NxM 배열이 MxN으로 바뀐다는 것만 주의하자.
매번 회전 돌때마다 m과 n이 바뀐다는것만 주의하면 된다.
n, m= map(int,input().split())
maps = [list(map(int,input().split())) for _ in range(n)]
while True:
a = int(input().rstrip())
if a == 0:
break
cnt = (a // 90) % 4
for _ in range(cnt):
new_maps = [[0]*n for _ in range(m)] # n, m 범위 조심
for i in range(n): # n, m 범위 조심
for j in range(m): # n, m 범위 조심
new_maps[j][n-1-i] = maps[i][j]
maps = new_maps
n,m = m,n # n, m 바꿔주기
for i in maps:
for j in i:
print(j,end=' ')
print()
정삼각형 회전
일단 정삼각형은 처음에 정사각형처럼 그냥 회전해버리면 안되나? 싶었는데,
정삼각형도 회전 각도가 달라서 회전되면 보이는 규칙도 다르다.
따라서 정삼각형은 반시계방향, 시계방향 회전일떄 각각 규칙을 구해주면 된다.
여기서 A은 원본
B는 시계방향 회전
C는 반시계방향 회전이다.
시계방향(B)에서 찾은 회전 규칙은
A[i][j] = B[N-1-i+j][N-1-i]
반시계방향(C)에서 찾은 회전 규칙은
A[i][j] = C[N-1-j][i] 이다.
def right_rotation(maps): # 시계방향
new_maps = [[0] * len(maps[i]) for i in range(n)]
for i in range(n):
for j in range(0,i+1):
new_maps[n-1-i+j][n-1-i] = maps[i][j]
maps = new_maps
return maps
def vertical_rotation(maps): # 좌우대칭
return [[maps[i][j] for j in range(len(maps[i]))][::-1] for i in range(n)]
```
입력
4 # n
1
0 1
0 0 1
0 0 0 1
시계방향
0
0 0
0 0 0
1 1 1 1
좌우대칭
1
1 0
1 0 0
1 0 0 0
```
다음은 정올 두 정삼각형(#5650) 문제를 통해 구현한 코드이다.
n = int(input().rstrip())
t1 = [list(map(int,input().rstrip().split())) for _ in range(n)]
t2 = [list(map(int,input().rstrip().split())) for _ in range(n)]
def right_rotation(maps): # 시계방향
new_maps = [[0] * len(maps[i]) for i in range(n)]
for i in range(n):
for j in range(0,i+1):
new_maps[n-1-i+j][n-1-i] = maps[i][j]
maps = new_maps
return maps
def vertical_rotation(maps): # 좌우대칭
return [[maps[i][j] for j in range(len(maps[i]))][::-1] for i in range(n)]
def calculate(m1,m2):
result = 0 # 안맞는 수 카운트
for i in range(len(m1)):
for j in range(len(m1[i])):
if m1[i][j] != m2[i][j]:
result += 1
return result
tmp1 = vertical_rotation(t1)
MIN = float('inf')
MIN = min(calculate(t1,t2),MIN)
MIN = min(calculate(tmp1,t2),MIN)
for i in range(3):
t1 = right_rotation(t1)
MIN = min(calculate(t1, t2), MIN)
tmp = vertical_rotation(t1)
MIN = min(calculate(tmp, t2), MIN)
print(MIN)
알아야할 것
정사각형 시계방향 회전 요약
# 정사각형 시계방향 회전
def rotation(maps):
new_maps = [[0]*n for _ in range(n)]
for i in range(n):
for j in range(n):
new_maps[j][n-1-i] = maps[i][j]
return new_maps
직사각형 시계방향 회전 요약
- n, m 바뀌는 구간을 조심하자
# 직사각형 시계방향 회전
# n, m 바뀜 주의
def rotation(maps):
n = len(maps)
m = len(maps[0])
# n -> row, m -> cal 이였다면 회전시 n -> cal, m -> row 로 바뀜
new_maps = [[0]*n for _ in range(m)]
# 여기는 안바뀜
for i in range(n):
for j in range(m):
new_maps[j][n-1-i] = maps[i][j] # 여기서 n은 그대로
# 코드에 따라 n,m = m, n 바뀐거 적용
return new_maps
삼각형 시계방향 회전 요약
- for 문 구간도 중요. 헷갈리면 그냥 그림을 좀 그려보고 규칙찾아 바로 구현
# 삼각형 회전
def right_rotation(maps): # 시계방향
new_maps = [[0] * len(maps[i]) for i in range(n)]
for i in range(n):
for j in range(0,i+1):
new_maps[n-1-i+j][n-1-i] = maps[i][j]
maps = new_maps
return maps
'coding test - python > 기본기 문제' 카테고리의 다른 글
기본기 JUNGOL / 도형 회전1 / Python 파이썬 (0) | 2024.09.26 |
---|---|
기본기 JUNGOL / 회전 / Python 파이썬 (1) | 2024.09.26 |
문제 / 배낭(가방) 문제 - 냅색알고리즘 Knapsack algorithm / Python 파이썬 (0) | 2023.02.27 |
문제 / 돌다리 건너기(Bottom-Up) - 동적계획법 / Python 파이썬 (0) | 2023.01.10 |
문제 / 계단오르기(Top-Down : 메모이제이션) - 동적 계획법 / Python 파이썬 (0) | 2023.01.10 |