• TOC {:toc}

이 글은 백준 온라인 저지의 16956번 문제를 파이썬(Python)으로 풀이한 것을 모아놓은 글입니다.

일종의 연습 기록이며 제가 정답을 받은 코드와 참고할만한 다른 코드를 같이 기록합니다. 필요한 경우 코드에 대한 해설을 기록합니다만 코드는 통과했어도 해설은 틀릴 수 있기 때문에 가볍게 참고해주시길 부탁드립니다. 피드백은 편하신 방법으로 자유롭게 주시면 감사하겠습니다.

2021.08.13

메모리 시간 코드 길이
30384 KB 248 ms 630 B
단계 시작 시각 끝난 시각 걸린 시간
문제 이해 14:35:15 14:37:18
풀이 생각 1 14:37:19 14:52:56
풀이 생각 2 12:26:52 12:41:34
풀이 생각 3 15:45:11 17:24:44
코딩 17:24:50 17:38:17
디버깅 17:38:20 17:44:38
import sys
input = lambda: sys.stdin.readline().rstrip()

R, C = map(int, input().split())
F = [list(input()) for _ in range(R)]

dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]

for i in range(R):
    for j in range(C):
        if F[i][j] == "W":
            for k in range(4):
                x = j + dx[k]
                y = i + dy[k]
                if not(0 <= x < R and 0 <= y < C) :
                    continue

                if F[y][x] == "S":
                    print(0)
                    exit()
                elif F[y][x] == ".":
                    F[y][x] = "D"

print(1)
for i in range(R):
    print("".join(F[i]))

아이디어 & 풀이

예제 출력과 반드시 동일한 결과를 출력할 필요가 없다. 울타리를 얼마나 어디에 놓든 늑대의 이동 경로만 막을 수 있으면 된다.

울타리를 이차원 리스트 F로 입력받은 뒤 완전 탐색하면서 늑대 주변을 울타리 D로 감싼다.

  • 해당 위치에 늑대(W)가 있으면 상하좌우를 탐색한다.
  • 양(S)이 있으면 0을 출력하고 실행을 종료한다.
  • 아무것도 없는 칸(.)은 울타리(D)로 바꾼다.

디버그

  • 늑대의 경로를 막을 수 있을 때 1을 출력해야 하는데 빠뜨렸다.

피드백

  • 입력받을 때 .을 모두 D로 바꾸면 늑대의 위치에 상관없이 이동하지 못한다.
  • 입력과 출력 모두 리스트가 아닌 문자열로 하므로 가능하면 리스트로 변환하지 않고 해결하는 게 나을 것 같다.

참고 답안

R, C = map(int, input().split())
F = [input().replace(".", "D") for i in range(R)]

for s in F + [*zip(*F)]:
    s = "".join(s)
    if "SW" in s or "WS" in s:
        print(0)
        break
else:
    print(1)
    print(*F, sep="\n")

아이디어 & 풀이

모든 비어있는 칸을 울타리로 채워 늑대가 이동하지 못하게 한 뒤, 늑대와 양이 인접해있는지만 확인한다.

  • 처음 입력받을 때 replace를 이용해 .D로 바꾸면 된다.
  • 늑대와 양이 인접해있는지는 각 행과 열을 문자열로 만든 뒤 SWWS가 들어있는지 확인하면 된다.
    • 행은 F의 원소(줄마다 입력받은 문자열)이고
    • 열은 행을 zip으로 재구성하면 된다.
      • zip으로 재구성한 결과는 튜플이기 때문에 join으로 다시 문자열로 구성해준다.