728x90
https://www.acmicpc.net/problem/2931
💡 문제 풀이
구현 문제이다. 문제의 조건만 맞춰서 풀어주면 된다.
중요한 조건은 다음과 같다.
- 무조건 답이 존재한다.
- 가스의 흐름이 유일하다.
- M과 Z에는 단 하나의 파이프와 연결되어있다.
- 무조건 하나의 파이프만 문제가 있다.
위 조건들에 따라서 우리는 파이프만 확인해주면 된다.
내 풀이의 사고 과정은 다음과 같다.
- 2차원 배열을 돌면서 파이프만 확인한다.
- 확인하는 파이프 모양에 맞게 파이프들이 연결되어있는지 체크한다.
- 단 하나의 파이프만 문제가 있으므로 연결되어있지 않는 파이프를 확인하면 바로 반복을 종료해준다.
- 길이 4의 배열에 문제가 있는 파이프 근처 상, 좌, 우, 하 순서로 파이프의 정보를 담는다.
- 가스의 흐름에 맞게 들어올 수 없는 파이프라면 False 처리를 해준다.
- 파이프 모양에 맞게 출력해준다.
✔️ 느낀 점
진짜 단순한 구현 문제이고 주어진대로 구현하면 풀 수 있다. 테스트 케이스가 모자라서 기출 테케를 사용했다.
💻 코드
import sys
input = sys.stdin.readline
R, C = map(int, input().split())
board = []
for _ in range(R):
board.append(input().strip())
wx, wy = (0, 0)
flag = False
for x in range(R):
if flag : break
for y in range(C):
if board[x][y] != '.' and board[x][y] != 'M' and board[x][y] != 'Z':
if board[x][y] == '|':
for nx in [x-1, x+1]:
if board[nx][y] == '.':
wx, wy = (nx,y)
flag = True
if board[x][y] == '-':
for ny in [y-1, y+1]:
if board[x][ny] == '.':
wx, wy = (x, ny)
flag = True
if board[x][y] == '1':
for nx, ny in [(x+1, y), (x, y+1)]:
if board[nx][ny] == '.':
wx, wy = (nx, ny)
flag = True
if board[x][y] == '2':
for nx, ny in [(x-1, y), (x, y+1)]:
if board[nx][ny] == '.':
wx, wy = (nx, ny)
flag = True
if board[x][y] == '3':
for nx, ny in [(x, y-1), (x-1, y)]:
if board[nx][ny] == '.':
wx, wy = (nx, ny)
flag = True
if board[x][y] == '4':
for nx, ny in [(x+1, y), (x, y-1)]:
if board[nx][ny] == '.':
wx, wy = (nx, ny)
flag = True
if board[x][y] == '+':
for nx, ny in [(x-1, y), (x+1, y), (x, y-1), (x, y+1)]:
if board[nx][ny] == '.':
wx, wy = (nx, ny)
flag = True
# 위쪽, 왼쪽, 오른쪽, 아래쪽 순서
pipe = [False] * 4
if wx-1 >= 0: pipe[0] = board[wx-1][wy]
if wy-1 >= 0: pipe[1] = board[wx][wy-1]
if wy+1 < C: pipe[2] = board[wx][wy+1]
if wx+1 < R: pipe[3] = board[wx+1][wy]
if pipe[0] in ['-', '2', '3', '.', 'M', 'Z']: pipe[0] = False
if pipe[1] in ['|', '3', '4', '.', 'M', 'Z']: pipe[1] = False
if pipe[2] in ['|', '1', '2', '.', 'M', 'Z']: pipe[2] = False
if pipe[3] in ['-', '1', '4', '.', 'M', 'Z']: pipe[3] = False
if pipe[0] and pipe[1] and pipe[2] and pipe[3]: print(wx+1, wy+1, '+')
elif pipe[0] and pipe[3]: print(wx+1, wy+1, '|')
elif pipe[1] and pipe[2]: print(wx+1, wy+1, '-')
elif pipe[2] and pipe[3]: print(wx+1, wy+1, 1)
elif pipe[0] and pipe[2]: print(wx+1, wy+1, 2)
elif pipe[0] and pipe[1]: print(wx+1, wy+1, 3)
elif pipe[1] and pipe[3]: print(wx+1, wy+1, 4)
'문제 풀이 > 백준(BOJ)' 카테고리의 다른 글
[Python] 백준 18223번 : 민준이와 마산 그리고 건우 (0) | 2022.08.29 |
---|---|
[Python] 백준 12904번 : A와 B (0) | 2022.08.26 |
[Python] 백준 14698번 : 전생했더니 슬라임 연구자였던 건에 대하여 (Hard) (0) | 2022.08.24 |
[Python] 백준 1647번 : 도시 분할 계획 (0) | 2022.08.21 |
[Python] 백준 6497번 : 전력난 (0) | 2022.08.21 |
댓글