반응형
https://www.acmicpc.net/problem/4577
소코반 관련된 게 있나 찾아본 문제인데
막상 소코반과는 별 관련이 없다 .
단순 조건문으로 대충 풀이 본 소스.
문제의 예제 입력과 출력을 똑같이 보기 위해 입력을 처음에 다 받았다.
count = 0;
listR = [] # 행 갯수
listC = [] # 열 갯수
listTestMap = [] # 게임 맵
lisetSolution = [] # 유저 입력
while True:
# Input
_input = input()
_input = _input.split(' ')
R = int(_input[0])
C = int(_input[-1])
if R == 0 and C == 0:
break
testMap = []
for i in range(0, R):
testMap.append(input())
solution = list(input())
listR.append(R)
listC.append(C)
listTestMap.append(testMap)
lisetSolution.append(solution)
for k in range(0, len(listR)): # input 횟수만큼 반복한다.
R = listR[k]
C = listC[k]
testMap = listTestMap[k]
solution = lisetSolution[k]
# 입력(str value)에 따른 x, y 이동값을 쓰기 좋게 나누어뒀다.
# 좌상단->우하단으로 증가하는 좌표계를 사용하여 위로 올라갈수록 y값이 작아진다.
direction = { "U" : (0, -1), "D" : (0, 1), "L" : (-1, 0), "R" : (1, 0) }
x = -1
y = -1
while len(solution) > 0: # 남은 입력이 없을 때까지 반복
result = "complete" # result 초기화
for i in range(0, R):
x = testMap[i].find("w") # player 위치 캐싱
if x < 0:
x = testMap[i].find("W")
if x > -1:
y = i
break
move = solution[0] # n번째 입력("U", "D", "L", "R")
del (solution[0])
moveValue = direction[move] # 입력에 따른 (x, y) 이동값
newX = x + moveValue[0] # 이동할 위치의 x값
newY = y + moveValue[1] # 이동할 위치의 y값
# Move
if testMap[newY][newX] == '.' or testMap[newY][newX] == '+':
l = list(testMap[newY]) # index로 str값의 요소를 바꿀 수 없어 list로 형변화하여 사용했다
if testMap[newY][newX] == '.':
l[newX] = "w"
else:
l[newX] = "W"
testMap[newY] = "".join(l)
l = list(testMap[y])
if l[x] == "w":
l[x] = "."
else:
l[x] = "+"
testMap[y] = "".join(l) # 리스트를 다시 str으로 변환하여 집어 넣는다.
# Push
elif testMap[newY][newX] == "b" or testMap[newY][newX] == "B":
newNewX = newX + moveValue[0]
newNewY = newY + moveValue[1]
if newNewX > -1 and newNewX < C and newNewY > -1 and newNewY < R:
if testMap[newNewY][newNewX] == ".":
l = list(testMap[newNewY])
l[newNewX] = "b"
testMap[newNewY] = "".join(l)
l = list(testMap[newY])
if testMap[newY][newX] == "b":
l[newX] = "w"
else:
l[newX] = "W"
testMap[newY] = "".join(l)
l = list(testMap[y])
if l[x] == "w":
l[x] = "."
else:
l[x] = "+"
testMap[y] = "".join(l)
elif testMap[newNewY][newNewX] == "+":
l = list(testMap[newNewY])
l[newNewX] = "B"
testMap[newNewY] = "".join(l)
l = list(testMap[newY])
if testMap[newY][newX] == "b":
l[newX] = "w"
else:
l[newX] = "W"
testMap[newY] = "".join(l)
l = list(testMap[y])
if l[x] == "w":
l[x] = "."
else:
l[x] = "+"
testMap[y] = "".join(l)
for i in range(0, R):
if (testMap[i].find("b") > -1):
result = "incomplete"
if result == "complete":
break
print ("Game {0}: {1}".format(k+1, result))
for i in range(0, R):
print (testMap[i])
돌려보니 맞게 나온다.
이 문제에서 주의해야할 부분
1) '모든 박스를 목표점으로 이동시킨 경우에 게임은 끝난다. 게임이 끝난 후에 입력하는 키는 모두 무시된다.'
-> 입력이 남아있어도 플레이어가 더이상 움직이지 않고 끝나야한다.
2) 1) '모든 박스를 목표점으로 이동시킨 경우'를 비어있는 목표점 '+'이 없을 때라고 풀어서 문제가 생겼었다.
-> 목표점 위에 플레이어가 올라가도 '+'가 사라지기 때문에 박스 'b'가 없을 때로 조건을 밖?ㅝㅆ다.
시간도 없는데 문제가 늘어져서 보기 나쁜 풀이가 된 것 같다..
파이썬으로 문제를 푼 사람도 4명밖에 안나오는 문제였다.
반응형
'알고리즘 문제풀이(Python)' 카테고리의 다른 글
10816번: 숫자 카드 2 - Hash Table (0) | 2020.07.01 |
---|---|
10816번: 숫자 카드 2 - 이분 탐색(Lower Bound, Upper Bound) (0) | 2020.07.01 |
1260번: DFS와 BFS (0) | 2020.06.15 |