기본기 / 정사각형, 직사각형, 정삼각형 회전 정리 / Python 파이썬

2024. 9. 29. 02:46·coding test - python/기본기 문제
728x90
반응형

회전, 달팽이를 더 디테일하게 인덱스로 접근해보자.
 
이전에 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()

 

위 배열을 90도 회전을 하면
ㅇㅣ렇게 된다.

 
처음에는 
 # 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
728x90
반응형

'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
'coding test - python/기본기 문제' 카테고리의 다른 글
  • 기본기 JUNGOL / 도형 회전1 / Python 파이썬
  • 기본기 JUNGOL / 회전 / Python 파이썬
  • 문제 / 배낭(가방) 문제 - 냅색알고리즘 Knapsack algorithm / Python 파이썬
  • 문제 / 돌다리 건너기(Bottom-Up) - 동적계획법 / Python 파이썬
sillon
sillon
꾸준해지려고 합니다..
    반응형
  • sillon
    sillon coding
    sillon
  • 전체
    오늘
    어제
    • menu (614)
      • notice (2)
      • python (68)
        • 자료구조 & 알고리즘 (23)
        • 라이브러리 (19)
        • 기초 (8)
        • 자동화 (14)
        • 보안 (1)
      • coding test - python (301)
        • Programmers (166)
        • 백준 (76)
        • Code Tree (22)
        • 기본기 문제 (37)
      • coding test - C++ (5)
        • Programmers (4)
        • 백준 (1)
        • 기본기문제 (0)
      • 공부정리 (5)
        • 신호처리 시스템 (0)
        • Deep learnig & Machine lear.. (41)
        • Data Science (18)
        • Computer Vision (17)
        • NLP (40)
        • Dacon (2)
        • 모두를 위한 딥러닝 (강의 정리) (4)
        • 모두의 딥러닝 (교재 정리) (9)
        • 통계 (2)
      • HCI (23)
        • Haptics (7)
        • Graphics (11)
        • Arduino (4)
      • Project (21)
        • Web Project (1)
        • App Project (1)
        • Paper Project (1)
        • 캡스톤디자인2 (17)
        • etc (1)
      • OS (10)
        • Ubuntu (9)
        • Rasberry pi (1)
      • App & Web (9)
        • Android (7)
        • javascript (2)
      • C++ (5)
        • 기초 (5)
      • Cloud & SERVER (8)
        • Git (2)
        • Docker (1)
        • DB (4)
      • Paper (7)
        • NLP Paper review (6)
      • 데이터 분석 (0)
        • GIS (0)
      • daily (2)
        • 대학원 준비 (0)
      • 영어공부 (6)
        • job interview (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Python
    소수
    programmers
    백준
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
sillon
기본기 / 정사각형, 직사각형, 정삼각형 회전 정리 / Python 파이썬
상단으로

티스토리툴바