Algorithm Problem/Python

[python] λ°±μ€€ - 18428. κ°μ‹œ ν”Όν•˜κΈ°

deo2kim 2020. 11. 28. 15:13
λ°˜μ‘ν˜•

πŸ€”λ¬Έμ œ ν•΄κ²°

  • S1 | 완전탐색

N의 λ²”μœ„κ°€ 맀우 μž‘μœΌλ―€λ‘œ 완전탐색을 ν•˜λŠ” λ¬Έμ œμ΄λ‹€.

벽을 μ„ΈμšΈ 수 μžˆλŠ” 빈 곡간을 리슀트둜 κ΅¬ν•˜κ³ ,

μ½€λΉ„λ„€μ΄μ…˜(3)을 ν•œλ‹€. ( 벽을 3개 μ„Έμ›Œμ•Ό ν•˜λ―€λ‘œ )

 

벽을 μ„Έμš°λ©΄ κ°μ‹œλ₯Ό μ‹œμž‘ν•œλ‹€.

μ„ μƒλ‹˜λ¦¬μŠ€νŠΈλ„ λ§Œλ“€μ–΄μ„œ μƒν•˜μ’Œμš° κ°μ‹œλ₯Ό ν•œλ‹€.

κ°μ‹œλ₯Ό ν•˜λ˜ 도쀑 λκΉŒμ§€ κ°€κ±°λ‚˜ 벽을 λ§Œλ‚˜λ©΄ ν•΄λ‹Ή λ°©ν–₯의 κ°μ‹œλŠ” λ©ˆμΆ”κ³ 

학생을 λ§Œλ‚˜λ©΄ κ°μ‹œμ— μ„±κ³΅ν•˜λ―€λ‘œ

κ·Έ 벽은 λ‹€μ‹œ μ² κ±°ν•˜κ³  λ‹€λ₯Έ 벽을 μ„Έμš΄λ‹€.

μ„ μƒλ‹˜μ΄ λͺ¨λ“  λ°©ν–₯에 λŒ€ν•΄μ„œ κ°μ‹œμ— μ‹€νŒ¨ν•  λ•ŒκΉŒμ§€ λ°˜λ³΅ν•œλ‹€.

 

πŸ’»μ†ŒμŠ€ μ½”λ“œ

from itertools import combinations as cb


def watch():
    for teacher in teacher_list:
        x, y = teacher
        # 상
        nx, ny = x, y
        while nx > 0:
            nx -= 1
            if hallway[nx][ny] == 'S':
                return False

            if hallway[nx][ny] == 'O':
                break
        # ν•˜
        nx, ny = x, y
        while nx < N - 1:
            nx += 1
            if hallway[nx][ny] == 'S':
                return False
            if hallway[nx][ny] == 'O':
                break
        # 쒌
        nx, ny = x, y
        while ny > 0:
            ny -= 1
            if hallway[nx][ny] == 'S':
                return False
            if hallway[nx][ny] == 'O':
                break
        # 우
        nx, ny = x, y
        while ny < N - 1:
            ny += 1
            if hallway[nx][ny] == 'S':
                return False
            if hallway[nx][ny] == 'O':
                break
    return True


if __name__ == '__main__':
    N = int(input())
    hallway = [input().split() for _ in range(N)]

    empty_list = []
    teacher_list = []
    for i in range(N):
        for j in range(N):
            if hallway[i][j] == 'X':
                empty_list.append((i, j))
            elif hallway[i][j] == 'T':
                teacher_list.append((i, j))

    # λ²½ 3개 뽑기
    for walls in cb(empty_list, 3):

        # λ²½ μ„Έμš°κΈ°
        for wall in walls:
            x, y = wall
            hallway[x][y] = 'O'
        # κ°μ‹œν•˜κΈ°
        if watch():
            print('YES')
            break
        # λ²½ ν—ˆλ¬ΌκΈ°
        for wall in walls:
            x, y = wall
            hallway[x][y] = 'X'
    else:
        print('NO')
 

 

πŸ“•λ¬Έμ œ 확인

좜처: BACKJOON ONLINE JUDGE

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

 

18428번: κ°μ‹œ ν”Όν•˜κΈ°

NxN ν¬κΈ°μ˜ 볡도가 μžˆλ‹€. λ³΅λ„λŠ” 1x1 ν¬κΈ°μ˜ 칸으둜 λ‚˜λˆ„μ–΄μ§€λ©°, νŠΉμ •ν•œ μœ„μΉ˜μ—λŠ” μ„ μƒλ‹˜, 학생, ν˜Ήμ€ μž₯애물이 μœ„μΉ˜ν•  수 μžˆλ‹€. ν˜„μž¬ λͺ‡ λͺ…μ˜ 학생듀은 μˆ˜μ—…μ‹œκ°„μ— λͺ°λž˜ λ³΅λ„λ‘œ λΉ μ Έλ‚˜μ™”λŠ”λ°, 볡

www.acmicpc.net

 

 

λ°˜μ‘ν˜•