[BaekJoon] 2251 물통

yunan·2020년 10월 8일
0
post-thumbnail

🔦 문제 링크

✍️ 나의 풀이


물의 양이 항상 같으므로
a->b , a->c
b->c , c->a
c->b , b->a
이 6가지 경우로 물을 옮기는 것만 생각해주면 된다.

또한, 방문 검사는 a, b, c 각 물의 양에 따라 체크하기 위해 3차원 배열을 이용했다.

🛠 나의 코드


from collections import deque

asize, bsize, csize = map(int, input().split())

q = deque()
q.append((0, 0, csize))
check = [[[False] * 201 for _ in range(201)] for _ in range(201)]
result = []


def move(i, _a, _b, _c):
    if i == 0:  # a -> b
        empty = bsize - _b
        if empty >= _a:
            _b += _a
            _a = 0
        else:
            _a -= empty
            _b = bsize
    elif i == 1:  # a -> c
        empty = csize - _c
        if empty >= _a:
            _c += _a
            _a = 0
        else:
            _a -= empty
            _c = csize
    elif i == 2:  # b -> c
        empty = csize - _c
        if empty >= _b:
            _c += _b
            _b = 0
        else:
            _b -= empty
            _c = csize
    elif i == 3:  # c -> a
        empty = asize - _a
        if empty >= _c:
            _a += _c
            _c = 0
        else:
            _c -= empty
            _a = asize
    elif i == 4:  # c -> b
        empty = bsize - _b
        if empty >= _c:
            _b += _c
            _c = 0
        else:
            _c -= empty
            _b = bsize
    elif i == 5:  # b -> a
        empty = asize - _a
        if empty >= _b:
            _a += _b
            _b = 0
        else:
            _b -= empty
            _a = asize
    return _a, _b, _c


c_check = [False] * 201
while q:
    a, b, c = q.popleft()
    if a == 0 and not c_check[c]:
        c_check[c] = True
        result.append(c)
    for index in range(6):
        i, j, k = move(index, a, b, c)
        if not check[i][j][k]:
            check[i][j][k] = True
            q.append((i, j, k))

result.sort()
for i in result:
    print(i, end=" ")

✍️ 다른 사람 풀이


C의 물통을 표시하지 않고 AB 두개의 물통으로만 표현했다.
현재 C의 양은 C의 물통 크기에서 a, b를 뺀 양이라고 볼 수 있다.

  • 방문 체크 또한 A, B 두 개의 양 만을 이용했다.

🛠 다른 사람 코드


	...
		water = min(x, b-y)  # 현재a의 물 양과 B물통의 빈공간을 비교해 더 작은 것을 선택한다.
        pour(x-water, y+water)  #  선택 값을 빼고 더한다.
        water = min(x, c-z)
        pour(x-water, y)
        water = min(y, a-x)
        pour(x+water, y-water)
        water = min(y, c-z)
        pour(x, y-water)
        water = min(z, a-x)
        pour(x+water, y)
        water = min(z, b-y)
        pour(x, y+water)
	...

출처: https://rebas.kr/769 [PROJECT REBAS]

📝 정리


🎈 참고


rebas님 블로그

profile
Go Go

0개의 댓글