응애개발자
article thumbnail
728x90

문제

 

16970번: 정수 좌표의 개수

2차원 좌표 평면 위에서 두 점을 골라 선분을 그었을 때, 지나가는 점의 개수가 K개인 선분의 수를 구해보자. 가능한 점의 좌표 (x, y)는 0 ≤ x ≤ N, 0 ≤ y ≤ M 이고, x와 y는 정수이다. 선분의 양 끝

www.acmicpc.net


 

접근 방법

1. 어떤 점들이 주어졌을때 이 선분의 기울기는 y2-y1/x2-x1 입니다. 예를들어 0,0과 6,3이라는 점이 주어졌을때 이 점을 지나는 점의 갯수는 (0,0), (2,1), (4,2), (6,3) 이렇게 4개가 주어지게 됩니다.

2. 따라서 최대공약수를 사용하여 dx와 dy의 최대공약수를 구하고 1을 더하면(시작점을 포함하기 때문에) 해당 선분이 지나가는 격자점의 총 수를 구할 수 있습니다.

 

코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    private static StringBuilder sb;
    private static BufferedReader br;
    private static StringTokenizer st;
    private static int N,M,K;
    private static int answer = 0;

    //입력
    public static void input() throws Exception {
        br = new BufferedReader(new InputStreamReader(System.in));
        sb = new StringBuilder();
        st = new StringTokenizer(br.readLine());

        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        K = Integer.parseInt(st.nextToken());

    }
    public static int gcd(int x, int y){
        if(x == 0 || y == 0){
            return x + y;
        }

        while(x % y != 0){
            int temp = x % y;
            x = y;
            y = temp;
        }
        return y;
    }

    //실행
    public static void process() {
        for(int x1 = 0 ; x1 <= N ; x1++){
            for(int y1 = 0 ; y1 <= M ; y1++){
                for(int x2 = 0 ; x2 <= N ; x2++){
                    for(int y2 = 0 ; y2 <= M ; y2++){
                        if(gcd(Math.abs(x2-x1), Math.abs(y2-y1)) + 1 == K){
                            answer++;
                        }
                    }
                }
            }
        }
        System.out.println(answer/2);
    }


    public static void main(String[] args) throws Exception {
        input();
        process();
    }
}
profile

응애개발자

@Eungae-D

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!