본문 바로가기
문제 풀이/백준(BOJ)

[Python] 백준 2931번 : 가스관

by 희조당 2022. 8. 25.
728x90

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

 

2931번: 가스관

 

www.acmicpc.net


💡 문제 풀이

구현 문제이다. 문제의 조건만 맞춰서 풀어주면 된다.

중요한 조건은 다음과 같다.

  1. 무조건 답이 존재한다.
  2. 가스의 흐름이 유일하다.
  3. M과 Z에는 단 하나의 파이프와 연결되어있다.
  4. 무조건 하나의 파이프만 문제가 있다.

위 조건들에 따라서 우리는 파이프만 확인해주면 된다.

내 풀이의 사고 과정은 다음과 같다.

  1. 2차원 배열을 돌면서 파이프만 확인한다.
  2. 확인하는 파이프 모양에 맞게 파이프들이 연결되어있는지 체크한다.
  3. 단 하나의 파이프만 문제가 있으므로 연결되어있지 않는 파이프를 확인하면 바로 반복을 종료해준다.
  4. 길이 4의 배열에 문제가 있는 파이프 근처 상, 좌, 우, 하 순서로 파이프의 정보를 담는다.
  5. 가스의 흐름에 맞게 들어올 수 없는 파이프라면 False 처리를 해준다.
  6. 파이프 모양에 맞게 출력해준다.

✔️ 느낀 점

진짜 단순한 구현 문제이고 주어진대로 구현하면 풀 수 있다. 테스트 케이스가 모자라서 기출 테케를 사용했다.

💻 코드

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)

댓글