알고리즘 문제풀이(Python)

4577번: 소코반

coucou3 2020. 6. 5. 00:19
반응형

https://www.acmicpc.net/problem/4577

 

4577번: 소코반

문제 소코반은 1982년에 일본에서 만들어진 게임으로, 일본어로 창고지기라는 뜻이다. 이 게임은 캐릭터를 이용해 창고 안에 있는 박스를 모두 목표점으로 옮기는 게임이다. 목표점의 수와 박스�

www.acmicpc.net

 

 

창고지기 소코반

소코반 관련된 게 있나 찾아본 문제인데

막상 소코반과는 별 관련이 없다 .

 

 

 

 

단순 조건문으로 대충 풀이 본 소스.

문제의 예제 입력과 출력을 똑같이 보기 위해 입력을 처음에 다 받았다.

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명밖에 안나오는 문제였다.

반응형