1 분 소요

1. 문제

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

  • DP 문제
// 문제
전구 100개가 10×10 정사각형 모양으로 늘어서 있다. 
전구에 달린 스위치를 누르면 
 전구와 , 아래, 왼쪽, 오른쪽에 있는 전구의 상태도 바뀐다. 
전구 100개의 상태가 주어지면 모든 전구를 끄기 위해 
최소한으로 눌러야 하는 스위치의 개수를 출력하라

// 입력
10줄에 10글자씩 입력이 주어진다. 
# 꺼진 전구고 O(대문자 알파벳 o) 켜진 전구다.
# O외에는 입력으로 주어지지 않는다.

// 출력
모든 전구를 끄기 위해 최소한으로 눌러야 하는 스위치의 개수를 출력하라. 불가능하면 -1 출력하라.

// 예제 입력 1 
#O########
OOO#######
#O########
####OO####
###O##O###
####OO####
##########
########O#
#######OOO
########O#

// 예제 출력 1 
4


2. 핵심 아이디어


3. Python 문제풀이

import sys
input = sys.stdin.readline

t = []
for i in range(10) :
  tmp = list(input().rstrip())
  for j in range(10) :
    if tmp[j] == 'O' :
      tmp[j] = True 
      continue
    tmp[j] = False
  t.append(tmp)
 
dx = [-1, 1, 0, 0, 0]
dy = [0, 0, 0, -1, 1]
result = 101

for f in range(1 << 10) :
  a = []
  for i in range(10) :
    a.append(t[i][:])
  cnt = 0

  for i in range(10) :
    if f & (1 << i) :
      cnt += 1
      for k in range(5) :
        nx = i + dx[k]
        ny = 0 + dy[k]
        if 0 <= nx <= 9 and 0 <= ny <= 9:
          a[ny][nx] = not a[ny][nx]

  for i in range(1, 10) :
    for j in range(10) :
      if not a[i-1][j] :
        continue
      for k in range(5) :
        nx = j + dx[k]
        ny = i + dy[k]
        if 0 <= nx <= 9 and 0 <= ny <= 9 :
          a[ny][nx] = not a[ny][nx]
      cnt += 1


  c = True
  for i in range(10) :
    if a[9][i] == True :
      c = False

  if c :
    result = min(cnt, result)
 
print(result if result != 101 else -1)


4. Java 문제풀이


댓글남기기