BOJ 1799 비숍

2025. 5. 27. 12:47·알고리즘
문제 링크 : https://www.acmicpc.net/problem/1799

 

문제 해설

체스판 위에 비숍을 겹치지 않게 놓는 문제입니다.

마음같아선 브루트 포스로 전부 찾아보고 싶지만 시간초과가 나기 때문에 효율적인 방법을 찾아야합니다.

먼저, 비숍을 놓을 수 있는 칸을 흑과 백으로 나눕니다.(비숍은 대각선으로만 움직이기 때문에 서로 다른 색의 칸에는 영향을 못 줍니다.)

비숍을 놓을 수 있는 위치를 흑백으로 나눴다면 백트래킹을 통해 가능한 비숍의 최대 개수를 각각 구합니다.

(대각선은 i + j와 i - j + (N - 1)음수방지 로 2차원 배열이 아닌 1차원 배열로 구현 가능합니다.)

 

코드

더보기
import Foundation

if let n = Int(readLine()!) {
    var board = [[Int]]()

    for _ in 0..<n {
        let line = readLine()!.split(separator: " ").map{ Int(String($0))! }
        board.append(line)
    }

    var whiteBoard = [(Int, Int)]()
    var blackBoard = [(Int, Int)]()

    for i in 0..<n {
        for j in 0..<n {
            if board[i][j] == 1 {
                if (i + j) % 2 == 0 {
                    whiteBoard.append((i, j))
                } else {
                    blackBoard.append((i, j))
                }
            }
        }
    }

    // / 대각선
    var leftToRight = [Bool](repeating: false, count: 2 * n)
    // \ 대각선
    var rightToLeft = [Bool](repeating: false, count: 2 * n)


    func dfs(_ arr: [(Int, Int)], _ idx: Int, _ count: Int) -> Int {
        if idx == arr.count {
            return count
        }

        let (x, y) = arr[idx]
        let dir1 = x + y
        let dir2 = x - y + n - 1
		var ret = 0

        if !leftToRight[dir1] && !rightToLeft[dir2] {
            leftToRight[dir1] = true
            rightToLeft[dir2] = true
            ret = max(ret, dfs(arr, idx + 1, count + 1))
            leftToRight[dir1] = false
            rightToLeft[dir2] = false
        }

        ret = max(ret, dfs(arr, idx + 1, count))
        return ret
    }

    let whiteMax = dfs(whiteBoard, 0, 0)
    let blackMax = dfs(blackBoard, 0, 0)
    print(whiteMax + blackMax)
}

'알고리즘' 카테고리의 다른 글
  • BOJ 3190 뱀 swift
  • BOJ 2449 전구 swift
  • BOJ 1865 웜홀 swift
  • BOJ 1918 후위 표기식 swift
GwanSon
GwanSon
버그는 도전, 코드는 해결. 열정있는 개발을 하자.
  • GwanSon
    관슨의 개발일지
    GwanSon
  • 전체
    오늘
    어제
    • 분류 전체보기 (56)
      • iOS (3)
      • swift (15)
      • UIKit (0)
      • swiftUI (2)
      • 알고리즘 (8)
      • CS (8)
      • 면접 (11)
      • Flutter (4)
      • 회고 (2)
      • 잡담 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    후기
    부스트캠프
    네이버 부스트캠프
    tuist
    챌린지
    백준
    모듈화
    2025 토스 Next
    부스트캠프 10기
    토스
    ios
    네이버 부스트캠프 후기
    Swift
    boj
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
GwanSon
BOJ 1799 비숍
상단으로

티스토리툴바