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 | 31 |
Tags
- 딥러닝 보코더
- 노래합성
- Vocoder
- 딥러닝
- deep voice
- YOLO
- korean tts
- you only look once
- waveglow
- tacotron
- melgan
- 한국어 tts
- text-to-speech
- TTS
- 한국어 음성 합성
- 학습
- 음성 합성
- 윈도우
- 트레이닝
- singing voice synthesis
- 보코더
- 타코트론
- 딥러닝 음성 합성
- DCTTS
Archives
- Today
- Total
chldkato
백준 5373 큐빙 (파이썬) 본문
https://www.acmicpc.net/problem/5373
전개도, 방향, 인덱스를 신경써서 코딩해야한다
윗면, 아랫면을 돌리는 경우는 서로 비슷해서 묶어서 해결할 수 있다. 이는 좌우, 앞뒤도 마찬가지다
큐브의 전개도를 펼쳤을 때 인덱스 순서가 어떻게 되느냐가 중요하다
아래의 코드는 전개도를 세로로 길게 펼치고 가운데가 U일 때,
u, l, r, f, b는 0~2 순서로 d는 2~0 순서로 정했다
그러면 u방향에서 봤을 때 u와 d의 순서는 일치한다
1. 큐브 리스트 u, d, l, r, f, b를 매 테스트 케이스마다 만든다
2. 입력받은 회전할 면과 방향을 cube 함수에 입력한다.
3. 위아래, 앞뒤, 좌우를 돌리는 경우 3가지로 조건문을 처리한다
매 경우마다 회전할 면과 방향을 turn 함수에 입력하여 해당 면부터 우선 회전한다
4. 이제는 모든 회전 케이스를 꼼꼼하게 설계하면 된다
코드처럼 윗면을 시계방향 회전하는 것과 아랫면을 반시계 회전하는 것은 유사하고 이는 다른 면도 마찬가지
5. 모든 회전을 마치고 윗면의 색을 출력한다
import sys
input = sys.stdin.readline
def cube(side, dir):
global u, d, f, b, l, r
if side == 'U' or side == 'D':
if side == 'U':
u = turn(u, dir)
i, j = 2, 0
else:
d = turn(d, dir)
i, j = 0, 2
temp_l = [list(x) for x in zip(*l)]
temp_r = [list(x) for x in zip(*r)]
temp = b[i]
if (side == 'U' and dir == '+') or (side == 'D' and dir == '-'):
b[i] = list(reversed(temp_l[i]))
temp_l[i] = f[j]
f[j] = list(reversed(temp_r[j]))
temp_r[j] = temp
else:
b[i] = temp_r[j]
temp_r[j] = list(reversed(f[j]))
f[j] = temp_l[i]
temp_l[i] = list(reversed(temp))
l = [list(x) for x in zip(*temp_l)]
r = [list(x) for x in zip(*temp_r)]
elif side == 'F' or side == 'B':
if side == 'F':
f = turn(f, dir)
i = 2
else:
b = turn(b, dir)
i = 0
temp = u[i]
if (side == 'F' and dir == '+') or (side == 'B' and dir == '-'):
u[i] = l[i]
l[i] = d[i]
d[i] = r[i]
r[i] = temp
else:
u[i] = r[i]
r[i] = d[i]
d[i] = l[i]
l[i] = temp
elif side == 'L' or side == 'R':
if side == 'L':
l = turn(l, dir)
i, j = 0, 2
else:
r = turn(r, dir)
i, j = 2, 0
temp_u = [list(x) for x in zip(*u)]
temp_d = [list(x) for x in zip(*d)]
temp_f = [list(x) for x in zip(*f)]
temp_b = [list(x) for x in zip(*b)]
temp = temp_b[i]
if (side == 'L' and dir == '+') or (side == 'R' and dir == '-'):
temp_b[i] = list(reversed(temp_d[j]))
temp_d[j] = list(reversed(temp_f[i]))
temp_f[i] = temp_u[i]
temp_u[i] = temp
else:
temp_b[i] = temp_u[i]
temp_u[i] = temp_f[i]
temp_f[i] = list(reversed(temp_d[j]))
temp_d[j] = list(reversed(temp))
u = [list(x) for x in zip(*temp_u)]
d = [list(x) for x in zip(*temp_d)]
f = [list(x) for x in zip(*temp_f)]
b = [list(x) for x in zip(*temp_b)]
def turn(side, dir):
if dir == '+':
return [list(reversed(x)) for x in zip(*side)]
else:
side = [list(x) for x in zip(*side)]
temp = side[0]
side[0] = side[2]
side[2] = temp
return side
tc = int(input())
for _ in range(tc):
u = [['w' for _ in range(3)] for _ in range(3)]
d = [['y' for _ in range(3)] for _ in range(3)]
f = [['r' for _ in range(3)] for _ in range(3)]
b = [['o' for _ in range(3)] for _ in range(3)]
l = [['g' for _ in range(3)] for _ in range(3)]
r = [['b' for _ in range(3)] for _ in range(3)]
n = int(input())
case = list(input().strip().split())
for k in case:
side, dir = list(k)
cube(side, dir)
for s in u:
print(''.join(s))
'백준' 카테고리의 다른 글
백준 15685 드래곤 커브 (파이썬) (0) | 2020.04.14 |
---|---|
백준 15686 치킨 배달 (파이썬) (0) | 2020.04.14 |
백준 5213 과외맨 (파이썬) (0) | 2020.04.12 |
백준 2186 문자판 (파이썬) (0) | 2020.04.10 |
백준 3108 로고 (파이썬) (4) | 2020.04.09 |
Comments