Post

CSES - Two Knights

CSES - Two Knights

문제 정보

항목내용
시간 제한1.00s
메모리 제한512MB
제출 일자2026-04-28
소요 시간0.08s

문제 설명


Two Knights

Your task is to count for $k=1,2,\ldots,n$ the number of ways two knights can be placed on a $k \times k$ chessboard so that they do not attack each other.

Input

The only input line contains an integer $n$.

Output

Print $n$ integers: the results.

Constraints

$1 \le n \le 10000$

Example

Input:

1
8

Output:

1
2
3
4
5
6
7
8
0
6
28
96
252
550
1056
1848

초기 접근 및 로직 구상 방식

  • 체스판에 나이트 2개 서로 공격 못하게하는 경우의 수 같음. DFS나 BFS 사용하면 될거 같음. 나이트는 직선 2칸 이동후 좌 또는 우로 이동. 즉, 나이트 끼리 직선 2칸 이동후 겹치는 수만 빼주면 될거 같음. 공식은 k * (k-1) / 2; 에서 여기서 나이트 이동 범위에 있는 것들 마저 빼주면 정답이 나오지 않을까? dx = {1,-1,0,0}; dy = {0,0,1,-1} 을 써야할듯. dx 2칸 이동후 dy 확인. dy 2칸 이동후 dx 확인. 이미 갔던 곳도 체크 해야하고 visitied[][] = true false 쓰고. 그런데 시간복잡도가 충분할까 모르겠네.

수학 공식이 따로 있을까? k = 1 이면 차는 0 k = 2 이면 차는 6 k = 3 이면 차는 8 k = 4 이면 차는 24 k = 5 이면 차는 48 k = 6 이면 차는 80 k = 7 이면 차는 120 k = 8 이면 차는 168

k가 3일때 2 * 4 = 8

k가 4일때 4 * 6 = 24

k가 5일때 6 * 8 = 48

k가 6일때 8 * 10 = 80

k가 7일때 10 * 12 = 120

k가 8일때 12 * 14 = 168

변수 하나 만들어서 규칙을 봤을때,

x * (x + 2) 하면 될듯.

k = 1이랑 k = 2일때는 따로 빼버리고.

시도

1차 시도 성공.

배운점

  • 이번는 k가 2일때 차가 6이 나오는 부분때문에 쉽사리 규칙을 찾지 못했음. 이 부분 넘겨서 차가 8부터 나오는 부분부터 생각해 봤다면 훨씬 수월하게 풀었을듯. 그냥 많이 틀려보고, 손으로 계산하고, 기하학(도형)적으로 생각해보는게 좋을듯함.

최종 풀이 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class TwoKnights {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        int x = 2;
        StringBuilder sb = new StringBuilder();

        for (int i = 1; i <= n ; i++) {

            long square = (long)i * i;

            if (i == 1) {
                sb.append(0).append("\n");
            } else if (i == 2) {
                sb.append( square * (square - 1) / 2 ).append("\n");
            } else {
                sb.append( (square * (square - 1) / 2) - ((long) x * (x + 2)) ).append("\n");
                x += 2;
            }

        }

        System.out.println(sb);

    }
}
This post is licensed under CC BY 4.0 by the author.