고도고도
🍎🍏
고도고도
전체 방문자
13,424
오늘
31
어제
64
  • 분류 전체보기 (170)
    • 🔨 프로젝트 (0)
      • TP 1 (0)
      • WhiteHCCTV (0)
      • FootPrint (0)
    • 💻 개발 (61)
      • iOS (28)
      • Android (6)
      • Kotlin (4)
      • Flutter (9)
      • Node.js (5)
      • Architecture (1)
      • 오늘의 삽질 (7)
      • 에러와의 동침 (1)
    • ✏️ 알고리즘 (6)
      • Graph (6)
      • String (0)
      • Sort (0)
    • ✍️ 코테 준비 (44)
      • Math (1)
      • Implementation (3)
      • String (3)
      • Brute Force (5)
      • Back Tracking (7)
      • Greedy (0)
      • Dynamic Programming (13)
      • Binary Search (1)
      • DFS, BFS (5)
      • Shortest Path (2)
      • Two Pointer (4)
      • MST (0)
    • 📚 CS (6)
      • Operating System (6)
    • ⛹️ 라이프 (53)
      • 2020 겨울방학 모칵코(팀) (13)
      • 2020 겨울방학 모각코(개인) (13)
      • 2021 여름방학 모칵코(팀) (8)
      • 2021 여름방학 모각코(개인) (7)
      • 코딩 테스트 (1)
      • 회고 (10)

블로그 메뉴

  • 홈
  • 깃허브
  • 링크드인

공지사항

인기 글

  • [NCSOFT] 2022 엔씨소프트 썸머 인턴 후기 - 1⋯
    2022.08.10
    [NCSOFT] 2022 엔씨소프트 썸머 인턴 후기 - 1⋯
  • [Flutter] SingleChildScrollView,⋯
    2021.08.18
    [Flutter] SingleChildScrollView,⋯
  • [iOS / SwiftUI] MapKit, 실시간으로 도로⋯
    2022.12.20
    [iOS / SwiftUI] MapKit, 실시간으로 도로⋯
  • [Android] 백그라운드에서 소켓 통신으로 이벤트 수신⋯
    2022.06.08
    [Android] 백그라운드에서 소켓 통신으로 이벤트 수신⋯
  • [iOS / SwiftUI] OnAppear, OnDisa⋯
    2022.12.01
    [iOS / SwiftUI] OnAppear, OnDisa⋯

최근 댓글

  • https://developer.apple.com/docu⋯
    고도고도
  • 게시글 잘 보았습니다. 혹시 주소에서 구를 가지고 오시는⋯
    나그네
  • 혹시 댓글이 안보이는데 .. y2e010924@naver.⋯
    eun
  • 글 솜씨가 뛰어나시네요! 좋은 글 잘 보고 갑니다 다음에도⋯
    alpha-traveler
  • NC......가슴이...웅장해집니다.......🤯
    이상한핑구 🐧

최근 글

  • [Architecture] MVVM + Clean Arch⋯
    2023.01.07
    [Architecture] MVVM + Clean Arch⋯
  • [iOS / SwiftUI] MapKit, 실시간으로 도로⋯
    2022.12.20
    [iOS / SwiftUI] MapKit, 실시간으로 도로⋯
  • [iOS / SwiftUI] OnAppear, OnDisa⋯
    2022.12.01
    [iOS / SwiftUI] OnAppear, OnDisa⋯
  • [에러와의 동침] 22년 11월 4주차
    2022.11.28
    [에러와의 동침] 22년 11월 4주차
  • [iOS / SwiftUI] 스크롤, 무한으로 즐겨요~ (⋯
    2022.11.28
    [iOS / SwiftUI] 스크롤, 무한으로 즐겨요~ (⋯

티스토리

hELLO · Designed By 정상우.
고도고도

🍎🍏

[백트래킹 / Kotlin] BOJ 9663 - N Queen
✍️ 코테 준비/Back Tracking

[백트래킹 / Kotlin] BOJ 9663 - N Queen

2022. 3. 29. 20:08

문제

풀이 언어

Kotlin

코드

import java.util.*
import kotlin.math.abs

lateinit var array: Array<Int>
var n = 0
var cnt = 0

fun main() = with(Scanner(System.`in`)) {
    n = nextInt()
    array = Array(n) { 0 }

    nQueen(0)
    println(cnt)
}

fun nQueen(depth: Int) { // depth는 row
    if (depth == n) {
        println(depth)
        cnt++
        return
    }

    for (i in 0 until n) { // i는 col
        array[depth] = i

        if (check(depth)) {
            nQueen(depth + 1)
        }
    }
}

fun check(row: Int): Boolean {
    for (i in 0 until row) {
        // 1. 이전 열 (저장되어 있는 값) 과 비교, index 값이 row 이므로 행은 무조건 다름
        if (array[row] == array[i]) return false
        // 2. 대각선 비교
        else if (abs(array[row] - array[i]) == abs(row - i)) return false
    }
    return true
}

풀이 방법

N-Queen

우선 N-Queen 문제에 대해 알아보자.

 

체스에서 Queen 은 상, 하, 좌, 우, 대각선으로 나아갈 수 있다. 이러한 Queen 을 서로 겹치지 않게 체스판 위에 배치하는 문제가 N-Queen 문제이다. Quuen 을 겹치지 않게 배치하기 위해서는 아래 조건을 만족해야 한다.

  • 하나의 Queen 의 상, 하, 좌, 우 에는 다른 Queen 이 존재하지 않는다.
  • 하나의 Queen 의 대각선에는 다른 Queen 이 존재하지 않는다.

언뜻 보면 2차원 배열로 문제를 해결해야할 것 같지만, 1차원 배열로도 해결이 가능하다. 1차원 배열의 index 를 Row로, 해당 원소를 Col 으로 사용하면 2차원 배열을 1차원 배열로 표현할 수 있게 된다.

 

1. 우선 첫번째 행 (체스판의 맨 위) 부터 시작한다.

fun main() = with(Scanner(System.`in`)) {
    n = nextInt()
    array = Array(n) { 0 }

    nQueen(0)
    println(cnt)
}

 

2. array[0] = 0, 즉 (row = 0, col = 0) 에 Queen 을 배치한다.

fun nQueen(depth: Int) { // depth는 row
    if (depth == n) {
        cnt++
        return
    }

    for (i in 0 until n) { // i는 col
        array[depth] = i

        if (check(depth)) {
            nQueen(depth + 1)
        }
    }
}

 

3. 이 때, 해당 위치를 검증한다. 상, 하, 좌, 우, 대각선을 판단하는데 대각선을 검증할 때 abs 를 활용하면 좀 효율적으로 계산할 수 있다. abs(array[row] - array[i]) 는 두 Queen 간의 col 차이를 의미하고, abs(row - i) 는 두 Queen 간의 row 차이를 의미한다. 이 값이 같으면 서로 대각선 상으로 존재하는 것이므로 종료한다.

fun check(row: Int): Boolean {
    for (i in 0 until row) {
        // 1. 이전 열 (저장되어 있는 값) 과 비교, index 값이 row 이므로 행은 무조건 다름
        if (array[row] == array[i]) return false
        // 2. 대각선 비교
        else if (abs(array[row] - array[i]) == abs(row - i)) return false
    }
    return true
}

결과

참고 자료

N-Queen Problem

저작자표시 비영리 변경금지

'✍️ 코테 준비 > Back Tracking' 카테고리의 다른 글

[백트래킹 / Kotlin] BOJ 1759 - 암호 만들기  (0) 2022.04.10
[백트래킹 / Kotlin] BOJ 1987 - 알파벳  (0) 2022.04.10
[백트래킹 / Kotlin] BOJ 14888 - 연산자 끼워넣기  (0) 2022.03.31
[백트래킹 / Kotlin] BOJ 2580 - 스도쿠  (0) 2022.03.30
[백트래킹 / Kotlin] BOJ 15649 ~ 15652 - N과 M (1 ~ 4)  (0) 2022.03.28
    '✍️ 코테 준비/Back Tracking' 카테고리의 다른 글
    • [백트래킹 / Kotlin] BOJ 1987 - 알파벳
    • [백트래킹 / Kotlin] BOJ 14888 - 연산자 끼워넣기
    • [백트래킹 / Kotlin] BOJ 2580 - 스도쿠
    • [백트래킹 / Kotlin] BOJ 15649 ~ 15652 - N과 M (1 ~ 4)
    고도고도
    고도고도
    iOS 꿀잼
    댓글쓰기
    [백트래킹 / Kotlin] BOJ 2580 - 스도쿠
    다음 글
    [백트래킹 / Kotlin] BOJ 2580 - 스도쿠
    [백트래킹 / Kotlin] BOJ 15649 ~ 15652 - N과 M (1 ~ 4)
    이전 글
    [백트래킹 / Kotlin] BOJ 15649 ~ 15652 - N과 M (1 ~ 4)

    티스토리툴바