본문 바로가기
문제 해결/BOJ

[백준] 소문난 칠공주

by 자잘 2023. 4. 13.

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

 

1941번: 소문난 칠공주

총 25명의 여학생들로 이루어진 여학생반은 5×5의 정사각형 격자 형태로 자리가 배치되었고, 얼마 지나지 않아 이다솜과 임도연이라는 두 학생이 두각을 나타내며 다른 학생들을 휘어잡기 시작

www.acmicpc.net

완전 탐색 문제입니다. 저는 조합 + 깊이 우선 탐색을 통해 해결하였습니다. 먼저, 좌표의 조합을 구해줍니다. 구해주는 과정에서 도연파가 4명을 넘어가는 경우는 가지치기를 해줍니다. 만약, 칠공주가 완성되면 칠공주가 인접해있는지를 판별해주어야하는데 이를 dfs로 체크해주었습니다. 칠공주가 위치한 곳을 visited[y][x] = true로 만들어주고 dfs로 탐색하면서 false로 바꾸었습니다. 탐색한 좌표의 개수가 7이면 서로 인접해있는 경우이고 그렇지 않으면 인접해있지 않으므로 칠공주를 만들 수 없는 경우입니다.

 

import sys
from collections import deque

#sys.stdin = open("input.txt", "r")
input = sys.stdin.readline

n = 5

board = [
    list(input().rstrip())
    for _ in range(n)
]

ans = 0

dys = [0, 1, 0, -1]
dxs = [1, 0, -1, 0]

def inRange(y, x):
    return 0 <= y < n and 0 <= x < n

def canMakeSeven():
    visited = [
        [False] * n
        for _ in range(n)
    ]

    for y, x in pos:
        visited[y][x] = True

    stack = [pos[0]]

    visited[pos[0][0]][pos[0][1]] = False

    cnt = 1

    while stack:
        y, x = stack.pop()

        for dy, dx in zip(dys, dxs):
            ny = y + dy
            nx = x + dx

            if inRange(ny, nx) and visited[ny][nx]:
                visited[ny][nx] = False
                cnt += 1
                stack.append((ny, nx))

    return True if cnt == 7 else False


# 칠공주들의 위치
pos = []

def combi(start, doyeon, dasom):
    global ans

    #print(start, doyeon, dasom)
    # 도연파가 4명을 넘으면 안된다.
    if doyeon >= 4:
        return

    # 칠공주가 완성된 경우
    if doyeon + dasom == 7:
        if canMakeSeven():
            ans += 1

        return

    for i in range(start, n * n):
        r, c = i // n, i % n

        pos.append((r, c))
        if board[r][c] == 'Y':
            combi(i + 1, doyeon + 1, dasom)
        else:
            combi(i + 1, doyeon, dasom + 1)

        pos.pop()


combi(0, 0, 0)

print(ans)

 

'문제 해결 > BOJ' 카테고리의 다른 글

[백준] 로고  (0) 2023.04.14
[백준] 중량제한  (0) 2023.04.14
[백준] 강의실 배정  (0) 2023.04.12
[백준] 동전 분배  (1) 2023.04.12
[백준] LCS3  (0) 2023.04.11