본문 바로가기
백준 삼성

(기출x)[python] 18428 - 감시 피하기

by 다데기 2022. 8. 30.

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

 

18428번: 감시 피하기

NxN 크기의 복도가 있다. 복도는 1x1 크기의 칸으로 나누어지며, 특정한 위치에는 선생님, 학생, 혹은 장애물이 위치할 수 있다. 현재 몇 명의 학생들은 수업시간에 몰래 복도로 빠져나왔는데, 복

www.acmicpc.net

정답률 32.032%

난이도 골5

 


코드 설명

1. 입력 받기

2. 선생님, 학생, 장애물 후보 좌표

3. 장애물 조합별로 체크

4. 체크

 

 

 

※ 주의할 점

  • 입력받는 동시에 좌표 저장해놓으면 시간 절약
  • 왜 안되는지 모르겠을 땐 출력이 "YES", "NO"인지도 확인해보기..
dx = [-1, 0, 0, 1]
dy = [0, -1, 1, 0]

# 4. 체크
def check(oa):
    for x, y in ta:
        for d in range(4):
            cnt = 1
            for cnt in range(1, N):
                nx, ny = x + cnt * dx[d], y + cnt * dy[d]
                if nx == -1 or nx == N or ny == -1 or ny == N:
                    break
                elif (nx, ny) in oa:
                    break
                elif (nx, ny) in sa:
                    return False

    return True

# 1. 입력 받기
N = int(input())
ta = []
sa = []
cand = []
board = []
for i in range(N):
    temp = list(map(str, input().split()))
    # 2. 선생님, 학생, 장애물 후보 좌표
    for j in range(N):
        if temp[j] == "T":
            ta.append((i, j))
        elif temp[j] == "S":
            sa.append((i, j))
        else:
            cand.append((i, j))
    board.append(temp)

# 3. 장애물 조합별로 체크
cl = len(cand)
ans = False
for i in range(cl - 2):
    for j in  range(i + 1, cl - 1):
        for k in range(j + 1, cl):
            oa = [cand[i], cand[j], cand[k]]
            ans = check(oa)
            if ans:
                print("YES")
                break
        if ans:
            break
    if ans:
        break
else:
    print("NO")

 


코드 결과

'백준 삼성' 카테고리의 다른 글

(기출x)[python] 10825 - 국영수  (1) 2022.09.02
[python] 16234 - 인구 이동  (0) 2022.08.31
[python] 14888 - 연산자 끼워넣기  (0) 2022.08.30
[python] 17779 - 게리맨더링 2  (0) 2022.08.29
[python] 19236 - 청소년 상어  (0) 2022.08.27