μ•Œκ³ λ¦¬μ¦˜/κ΅¬ν˜„

[λ°±μ€€ 18428 πŸ₯‡] κ°μ‹œ ν”Όν•˜κΈ°

1eehyunji 2023. 7. 6. 01:07

문제

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

각 μ„ μƒλ‹˜λ“€μ€ μžμ‹ μ˜ μœ„μΉ˜μ—μ„œ 상, ν•˜, 쒌, 우 4κ°€μ§€ λ°©ν–₯으둜 κ°μ‹œλ₯Ό μ§„ν–‰ν•œλ‹€. 단, 볡도에 μž₯애물이 μœ„μΉ˜ν•œ 경우, μ„ μƒλ‹˜μ€ μž₯μ• λ¬Ό λ’€νŽΈμ— μˆ¨μ–΄ μžˆλŠ” 학생듀은 λ³Ό 수 μ—†λ‹€. λ˜ν•œ μ„ μƒλ‹˜μ€ 상, ν•˜, 쒌, 우 4κ°€μ§€ λ°©ν–₯에 λŒ€ν•˜μ—¬, 아무리 멀리 μžˆλ”λΌλ„ μž₯μ• λ¬Όλ‘œ λ§‰νžˆκΈ° μ „κΉŒμ§€μ˜ 학생듀은 λͺ¨λ‘ λ³Ό 수 μžˆλ‹€κ³  κ°€μ •ν•˜μž.

λ‹€μŒκ³Ό 같이 3x3 ν¬κΈ°μ˜ λ³΅λ„μ˜ 정보가 μ£Όμ–΄μ§„ 상황을 ν™•μΈν•΄λ³΄μž. λ³Έ λ¬Έμ œμ—μ„œ μœ„μΉ˜ 값을 λ‚˜νƒ€λ‚Ό λ•ŒλŠ” (ν–‰,μ—΄)의 ν˜•νƒœλ‘œ ν‘œν˜„ν•œλ‹€. μ„ μƒλ‹˜μ΄ μ‘΄μž¬ν•˜λŠ” 칸은 T, 학생이 μ‘΄μž¬ν•˜λŠ” 칸은 S, μž₯애물이 μ‘΄μž¬ν•˜λŠ” 칸은 O둜 ν‘œμ‹œν•˜μ˜€λ‹€. μ•„λž˜ κ·Έλ¦Όκ³Ό 같이 (3,1)의 μœ„μΉ˜μ—λŠ” μ„ μƒλ‹˜μ΄ μ‘΄μž¬ν•˜λ©° (1,1), (2,1), (3,3)의 μœ„μΉ˜μ—λŠ” 학생이 μ‘΄μž¬ν•œλ‹€. 그리고 (1,2), (2,2), (3,2)의 μœ„μΉ˜μ—λŠ” μž₯애물이 μ‘΄μž¬ν•œλ‹€. 

 

이 λ•Œ (3,3)의 μœ„μΉ˜μ— μ‘΄μž¬ν•˜λŠ” 학생은 μž₯μ• λ¬Ό λ’€νŽΈμ— μˆ¨μ–΄ 있기 λ•Œλ¬Έμ— κ°μ‹œλ₯Ό ν”Όν•  수 μžˆλ‹€. ν•˜μ§€λ§Œ (1,1)κ³Ό (2,1)의 μœ„μΉ˜μ— μ‘΄μž¬ν•˜λŠ” 학생은 μ„ μƒλ‹˜μ—κ²Œ λ“€ν‚€κ²Œ λœλ‹€.

학생듀은 λ³΅λ„μ˜ 빈 μΉΈ μ€‘μ—μ„œ μž₯애물을 μ„€μΉ˜ν•  μœ„μΉ˜λ₯Ό 골라, μ •ν™•νžˆ 3개의 μž₯애물을 μ„€μΉ˜ν•΄μ•Ό ν•œλ‹€. 결과적으둜 3개의 μž₯애물을 μ„€μΉ˜ν•˜μ—¬ λͺ¨λ“  학생듀을 κ°μ‹œλ‘œλΆ€ν„° ν”Όν•˜λ„λ‘ ν•  수 μžˆλŠ”μ§€ κ³„μ‚°ν•˜κ³ μž ν•œλ‹€. NxN ν¬κΈ°μ˜ λ³΅λ„μ—μ„œ 학생 및 μ„ μƒλ‹˜μ˜ μœ„μΉ˜ 정보가 μ£Όμ–΄μ‘Œμ„ λ•Œ, μž₯애물을 μ •ν™•νžˆ 3개 μ„€μΉ˜ν•˜μ—¬ λͺ¨λ“  학생듀이 μ„ μƒλ‹˜λ“€μ˜ κ°μ‹œλ₯Ό ν”Όν•˜λ„λ‘ ν•  수 μžˆλŠ”μ§€ 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

예λ₯Ό λ“€μ–΄ N=5일 λ•Œ, λ‹€μŒκ³Ό 같이 μ„ μƒλ‹˜ 및 ν•™μƒμ˜ μœ„μΉ˜ 정보가 μ£Όμ–΄μ‘Œλ‹€κ³  κ°€μ •ν•˜μž.

 

이 λ•Œ λ‹€μŒκ³Ό 같이 3개의 μž₯애물을 μ„€μΉ˜ν•˜λ©΄, λͺ¨λ“  학생듀을 μ„ μƒλ‹˜μ˜ κ°μ‹œλ‘œλΆ€ν„° ν”Όν•˜λ„λ‘ λ§Œλ“€ μˆ˜ μžˆλ‹€.

 

μž…λ ₯

첫째 쀄에 μžμ—°μˆ˜ N이 μ£Όμ–΄μ§„λ‹€. (3 ≤ N ≤ 6) λ‘˜μ§Έ 쀄에 N개의 쀄에 κ±Έμ³μ„œ λ³΅λ„μ˜ 정보가 μ£Όμ–΄μ§„λ‹€. 각 ν–‰μ—μ„œλŠ” N개의 μ›μ†Œκ°€ 곡백을 κΈ°μ€€μœΌλ‘œ κ΅¬λΆ„λ˜μ–΄ μ£Όμ–΄μ§„λ‹€. ν•΄λ‹Ή μœ„μΉ˜μ— 학생이 μžˆλ‹€λ©΄ S, μ„ μƒλ‹˜μ΄ μžˆλ‹€λ©΄ T, 아무것도 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ Xκ°€ μ£Όμ–΄μ§„λ‹€.

단, 전체 μ„ μƒλ‹˜μ˜ μˆ˜λŠ” 5μ΄ν•˜μ˜ μžμ—°μˆ˜, 전체 ν•™μƒμ˜ μˆ˜λŠ” 30μ΄ν•˜μ˜ μžμ—°μˆ˜μ΄λ©° 항상 빈 칸의 κ°œμˆ˜λŠ” 3개 μ΄μƒμœΌλ‘œ μ£Όμ–΄μ§„λ‹€.

좜λ ₯

첫째 쀄에 μ •ν™•νžˆ 3개의 μž₯애물을 μ„€μΉ˜ν•˜μ—¬ λͺ¨λ“  학생듀을 κ°μ‹œλ‘œλΆ€ν„° ν”Όν•˜λ„λ‘ ν•  수 μžˆλŠ”μ§€μ˜ μ—¬λΆ€λ₯Ό 좜λ ₯ν•œλ‹€. λͺ¨λ“  학생듀을 κ°μ‹œλ‘œλΆ€ν„° ν”Όν•˜λ„λ‘ ν•  수 μžˆλ‹€λ©΄ "YES", κ·Έλ ‡μ§€ μ•Šλ‹€λ©΄ "NO"λ₯Ό 좜λ ₯ν•œλ‹€.

문제 풀이

import sys
from itertools import combinations

n=int(sys.stdin.readline())
pos=[list(sys.stdin.readline().strip().split(' ')) for _ in range(n)]

def avoid_teacher(position):
    global n
    directions=[(0,1),(1,0),(-1,0),(0,-1)]
    for i in range(n):
        for j in range(n):
            if position[i][j]=='T':
                # μ„ μƒλ‹˜μ΄λ©΄ 학생에 도달할 수 μžˆλŠ”μ§€ 체크
                for dir in directions:
                    dy=i+dir[0]
                    dx=j+dir[1]
                    while 0<=dy<n and 0<=dx<n:
                        # μž₯애물을 λ§Œλ‚˜λ©΄ break
                        if position[dy][dx]=='O':
                            break
                        elif position[dy][dx]=='S':
                            return False
                        dy+=dir[0]
                        dx+=dir[1]
    else:
        return True

object=[]
for i in range(n):
    for j in range(n):
        if pos[i][j]=='X':
            object.append((i,j))
# object 배열에 λ‹΄κΈ΄ 후보듀 쀑 3개 선택
nCr=list(combinations(object,3))
for o1,o2,o3 in nCr:
    pos[o1[0]][o1[1]] = 'O'
    pos[o2[0]][o2[1]] = 'O'
    pos[o3[0]][o3[1]] = 'O'
    if avoid_teacher(pos):
        print('YES')
        sys.exit(0)
    pos[o1[0]][o1[1]] = 'X'
    pos[o2[0]][o2[1]] = 'X'
    pos[o3[0]][o3[1]] = 'X'
else:
    print('NO')

 

1. itertools의 combinationsλ₯Ό μ΄μš©ν•΄μ„œ μž₯애물을 놓을 수 μžˆλŠ” μœ„μΉ˜(pos[i][j]=='X'인 μœ„μΉ˜)κ°€ λ‹΄κΈ΄ objectμ—μ„œ κ°€λŠ₯ν•œ μ‘°ν•© 3개λ₯Ό

뽑아낸닀. 

 

2. 뽑아낸 쑰합듀을 νƒμƒ‰ν•˜λ©΄μ„œ ν•΄λ‹Ή μœ„μΉ˜μ— 'O' ν‘œμ‹œλ₯Ό ν•œλ‹€.

 

3. avoid_teacher ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄μ„œ ν•΄λ‹Ή μœ„μΉ˜μ— μž₯애물을 λ†“μœΌλ©΄ 학생듀이 λͺ¨λ‘ μˆ¨μ„ 수 μžˆλŠ” ν™•μΈν•œλ‹€.

  1.  μ„ μƒλ‹˜κ³Ό 학생, μž₯μ• λ¬Όμ˜ μœ„μΉ˜κ°€ ν‘œμ‹œλœ pos 2차원 배열을 νƒμƒ‰ν•˜λ©΄μ„œ, μ„ μƒλ‹˜μΌ 경우 μƒν•˜μ’Œμš° λ°©ν–₯을 μ°¨λ‘€λ‘œ νƒμƒ‰ν•˜λ©΄μ„œ 학생을 μ°ΎκΈ° 전에 μž₯애물에 λ„λ‹¬ν•΄μ„œ breakλ₯Ό ν†΅ν•˜κ±°λ‚˜ ν•΄λ‹Ή λ°©ν–₯의 λͺ¨λ“  ν–‰ λ˜λŠ” 열을 νƒμƒ‰ν•˜κ³  while문을 λΉ μ Έλ‚˜μ™€ λ‹€μŒ λ°©ν–₯을 νƒμƒ‰ν•œλ‹€.
  2. μƒν•˜μ’Œμš° μ°¨λ‘€λ‘œ νƒμƒ‰ν•˜λ‹€ 학생을 λ§Œλ‚  경우, μ„ μƒλ‹˜μ˜ κ°μ‹œ κ°€λŠ₯ λ²”μœ„ μ•ˆμ— 학생이 μžˆλŠ” κ²ƒμ΄λ―€λ‘œ return False
  3. 쀑간에 return λ˜μ§€ μ•Šκ³ , 학생듀이 λͺ¨λ‘ μˆ¨μ„ 수 μžˆλŠ” 경우 return True

4. avoid_teacherκ°€ Trueλ₯Ό λ°˜ν™˜ν•˜λ©΄ 'YES'λ₯Ό 좜λ ₯ν•˜κ³  ν”„λ‘œκ·Έλž¨ μ’…λ£Œ.

 

5. avoid_teacherκ°€ Falseλ₯Ό λ°˜ν™˜ν•˜λ©΄ 'O' ν‘œμ‹œν–ˆλ˜ μœ„μΉ˜λ₯Ό λ‹€μ‹œ 'X'둜 λ°”κΏ”μ£Όκ³  λ‹€λ₯Έ μœ„μΉ˜λ‘œ 반볡문 μˆ˜ν–‰

 

6. λͺ¨λ“  μœ„μΉ˜μ—μ„œ avoid_teacherκ°€ Falseλ₯Ό λ°˜ν™˜ν•˜λ©΄ 'NO'λ₯Ό 좜λ ₯ν•˜κ³  ν”„λ‘œκ·Έλž¨ μ’…λ£Œ.