[Silver II] 다각형그리기 - 2641
분류
구현
문제 설명
모눈종이에 다각형을 그리려고 한다. 그리는 방법은 모양수열로 표시된다. 모양수열은 1과 4사이의 숫자가 연속되어 나열된 것으로 1은 오른쪽으로, 2는 위쪽으로, 3은 왼쪽으로, 4는 아래쪽으로 한 칸씩 그리는 것을 말한다.
예를 들어 아래 그림의 다각형 (2)는 점 A에서 시작하여 화살표 방향으로 모양수열 1411433322를 따라서 그린 것이다. 다각형 (3)은 점 B에서 시작하여 화살표 방향으로 모양수열 3221411433을 따라서 그린 것이다. 또한 다각형(4)는 점 C에서 시작하여 화살표 방향으로 모양수열 4411123323을 따라서 그린 것이다. 다각형 (2), (3), (4)는 다각형 (1)과 같으므로 모양수열들 1411433322, 3221411433, 4411123323은 모두 같은 다각형을 그릴 수 있다. 단, 다각형이 회전된 것이나 뒤집어진 것은 같은 다각형이 아니다. 그러므로 아래 그림의 다각형 (5)와 (6)은 다각형 (1)과 다르다.
한 개의 표본 모양수열과 여러 모양수열들이 주어졌을 때 표본 모양수열과 같은 다각형을 그릴 수 있는 모양수열들을 모두 찾는 프로그램을 작성하시오.
입력
첫째 줄에는 표본 모양수열의 길이(숫자의 개수)가 주어지고, 둘째 줄에는 표본 모양수열이 주어진다. 셋째 줄에는 모양수열의 개수가 주어지고 넷째 줄부터는 각 줄에 표본 모양수열과 같은 길이의 모양수열이 하나씩 주어진다. 단, 모양수열들의 개수는 최대 100 개이고 모양수열의 길이는 최대 50 이다. 모양수열의 각 숫자 사이에는 빈칸이 하나 있다.
출력
첫째 줄에는 입력된 표본 모양수열과 같은 다각형을 그리는 모양수열들의 개수를 출력한다. 둘째 줄부터는 각 줄에 표본 모양수열과 같은 다각형을 그릴 수 있는 모양수열을 출력한다. 출력되는 모양수열의 숫자들은 한 칸 띄고 출력한다.
import sys
input = sys.stdin.readline
reverse = {1: 3, 2: 4, 3: 1, 4: 2}
N = int(input())
standard = list(map(int, input().split()))
T = int(input())
shapes = []
for _ in range(T):
shape = list(map(int, input().split()))
shapes.append(shape)
result = []
for shape in shapes:
reverse_shape = []
for s in shape:
reverse_shape.append(reverse[s])
reverse_shape = reverse_shape[::-1]
if standard == shape or standard == reverse_shape:
result.append(shape)
continue
for i in range(1, N):
shape_trans = shape[i:] + shape[:i]
reverse_shape_trans = reverse_shape[i:] + reverse_shape[:i]
if standard == shape_trans or standard == reverse_shape_trans:
result.append(shape)
break
print(len(result))
for r in result:
print(*r)
'Algorithm > BAEKJOON' 카테고리의 다른 글
[백준 / Python 파이썬] 13414번 - 수강신청 (0) | 2023.07.06 |
---|---|
[백준 / Python 파이썬] 15787번 - 기차가 어둠을 헤치고 은하수를 (0) | 2023.06.15 |
[백준 / Python 파이썬] 16931번 - 겉넓이 구하기 (0) | 2023.06.13 |
[백준 / Python 파이썬] 26091번 - 현대모비스 소프트웨어 아카데미 (0) | 2023.06.13 |
[백준 / Python 파이썬] 6503번 - 망가진 키보드 (0) | 2023.06.13 |