N-Queen

최민수·2023년 8월 3일
0

알고리즘

목록 보기
85/94
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class B9663 {
    static int[] rows = new int[15];
    static int answer = 0;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

        simulate(0, N);
        System.out.println(answer);
    }

    private static void simulate(int idx, int size) {
        if (idx == size) {
            answer++;
            return;
        }

        for (int i = 0; i < size; i++) {
            rows[idx] = i;
            if (isAvailable(idx)) {
                simulate(idx + 1, size);
            }

        }
    }

    private static boolean isAvailable(int idx) {
        for (int i = 0; i < idx; i++) {
            if (Math.abs(rows[idx] - rows[i]) == Math.abs(idx - i) || rows[idx] == rows[i]) {
                return false;
            }
        }
        return true;
    }

}

G4

유명한 문제다. 풀 때마다 느끼는 거지만 조건을 하나씩 따지기 보다 로직을 크게 보는 훈련이 되는 것 같다.

행 별로 훑으면서 들어갈 위치(열)를 배정하고, 그 자리가 대각선과 세로 줄을 검토해보았을 때 통과라면 계속 진행, 아니라면 멈추는 방법의 생각보다 간단한 방법이다.

**근데 신기한 점을 발견했다.
같은 코드를 c++, Java로 작성했을 때는 통과, 파이썬으로 작성했을 때는 시간초과 실패가 나왔다.

그만큼 파이썬이 시간에 있어 취약하다는 것이겠다...


// Java: 14556 KB | 5428 ms
// C++: 2020 KB | 5116 ms
// Python: 시간초과...


출처: https://www.acmicpc.net/problem/9663

profile
CS, 개발 공부기록 🌱

0개의 댓글