※문제 출처
https://www.acmicpc.net/problem/14499
명령을 통해 주사위가 계속 움직이는 프로그램입니다.
주사위를 클래스로 설정하여 구현했습니다.
주사위 모든 면의 숫자를 알 수 있게 dictionary를 선언해줍니다.
dice = { key : 주사위 면, value : 적힌 숫자 }
changeDice 함수
방향을 입력하면 주사위의 모양이 변경됩니다.
주사위 모양은 바닥, 왼쪽, 앞쪽에 위치하는 주사위 면을 통해 알 수 있습니다.
어느 방향으로 움직이는지를 통해, 바닥, 왼쪽, 앞쪽 면을 변경해주고, y와 x 값도 변경해줍니다.
이때, 주사위가 바깥으로 벗어나려 한다면 명령을 무시합니다.
changeMapDiceNumber 함수
주사위가 변경되었다면, 지도와 주사위 바닥의 숫자를 변경해주어야 합니다.
주의 !!
분명 올바르게 구현했는데, 자꾸 TestCase를 시작조차 못해보고 틀렸다고 나와서 굉장히 당황했습니다.
오류가 난 것도 아니고, 일부 TestCase가 틀린 것도 아니고....
결국 문제는 x, y 값에 있었네요. 당연히 평소대로 좌표평면이라 생각하고 풀었는데 그게 아니었습니다.
최초 입력받을 때, y와 x 순서를 바꾸어주니 통과했네요......;;
class Dice:
def __init__(self, N, M, x, y, k, maps):
self.N = N
self.M = M
self.x = x
self.y = y
self.k = k
self.map = maps # 지도
self.bottom = 6 # 바닥
self.front = 5 # 앞
self.west = 4 # 서쪽
self.dice = { # 주사위
1: 0,
2: 0,
3: 0,
4: 0,
5: 0,
6: 0
}
# 방향 입력
# 주사위 모양 변경
def changeDice(self, moving):
# 동쪽은 1, 서쪽은 2, 북쪽은 3, 남쪽은 4
# 바깥으로 벗어나려 하면, 명령 무시
if (self.y == 0 and moving == 3) or \
(self.y == self.N-1 and moving == 4) or \
(self.x == 0 and moving == 2) or \
(self.x == self.M-1 and moving == 1) :
return False
if moving == 1: # 동쪽
temp = self.bottom
self.bottom = 7 - self.west
self.west = temp
self.x += 1
elif moving == 2: # 서쪽
temp = self.bottom
self.bottom = self.west
self.west = 7 - temp
self.x -= 1
elif moving == 3: # 북쪽
temp = self.front
self.front = 7 - self.bottom
self.bottom = temp
self.y -= 1
elif moving == 4: # 남쪽
temp = self.front
self.front = self.bottom
self.bottom = 7 - temp
self.y += 1
return True
# 지도와 주사위 숫자 변경
def changeMapDiceNumber(self):
if self.map[self.y][self.x] == 0:
self.map[self.y][self.x] = self.dice[self.bottom]
else:
self.dice[self.bottom] = self.map[self.y][self.x]
self.map[self.y][self.x] = 0
return
if __name__ == "__main__":
N, M, y, x, k = [ int(x) for x in input().split() ]
maps = []
for _ in range(N):
maps.append( [ int(x) for x in input().split()] )
moving = [ int(x) for x in input().split()]
d = Dice(N, M, x, y, k, maps) #클래스 선언
for m in moving: # 명령 하나씩
if d.changeDice(m): # 만약 바깥으로 벗어나지 않으면
d.changeMapDiceNumber() # 지도와 주사위 숫자 변경
print( d.dice[7 - d.bottom] ) # 주사위 위쪽 출력
반응형
'baekjoon 풀이' 카테고리의 다른 글
[C++] 백준 23309 : 철도 공사 (0) | 2022.11.15 |
---|---|
[Python] 백준 16637번 : 괄호 추가하기 (0) | 2021.03.28 |
[Python] 백준 4153번 : 직각 삼각형 판단하기 (0) | 2021.03.27 |