백준 보이는 점의 개수

KIMYEONGJUN·2024년 11월 25일
0
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

첫째 줄에 테스트 케이스의 개수 C(1<=C<=1,000)가 주어진다.
각 테스트 케이스는 자연수 N(1<=N<=1,000) 하나로 이루어져 있고,
한 줄에 하나씩 주어진다.

각 테스트 케이스에 대해 한 줄에 하나씩 (0,0)에서 보이는 점(x,y)의 개수를 출력한다.

내가 이 문제를 보고 생각해본 부분

count배열을 이용해서 N일때의 선 개수를 저장한다.
count[1]에 미리 3을 저장했다.(수직, 수평, 대각선)
count[i]는 count[i - 1] 값에서 그림만큼의 점만 체크해서 더하면 된다.
점선이 이어진 파란 점끼리 같은 결과이기 때문에 둘 중 한 번만 구해서 * 2한다.
이때, 빨간 점은 count[1]과 동일한 값이라 볼 필요가 없다.
따라서 내부 반복문으로 j = 1 부터 j = i - 1 까지 탐색한다.
(0,0) -> (x,y)까지 가려진 점이 없는 선분이려면 같은 기울기인 선분이 없어야한다는 말과 동일하다.
i,j의 최대공약수를 체크해서 그 값이 1이라면 기약분수가 된다. gcd가 1인 값만 체크해서 temp에 + 1한다.
temp를 사용하는 이유는 배열을 여러 번 접근하는 것보다 temp를 사용해서 더한 뒤 한 번에 count배열에 더하는 게 좋겠다고 판단했기 때문이다.
gcd를 알아내는 것은 유클리드 호제법을 사용했다.
b != 0 일때,
gcd(a, b) == gcd(b, a % b)이다.
b == 0이라면 gcd(a,b) == a이다.
테스트케이스를 입력받으면서 count[값]을 sb에 더하고,
한번에 출력한다.

코드로 구현

package baekjoon.baekjoon_24;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

// 백준 2725번 문제
public class Main848 {
    public static void main(String[] args) throws IOException {
        int[] count = new int[1001];
        count[1] = 3;
        int temp;
        for(int i = 2; i < 1001; i++) {
            temp = 0;
            for(int j = 1; j < i; j++) {
                if(gcd(i,j) == 1)
                    temp++;
            }
            count[i] = count[i - 1] + temp * 2;
        }

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

        for(int i = 0; i < C; i++) {
            sb.append(count[Integer.parseInt(br.readLine())]).append('\n');
        }

        System.out.print(sb);
        br.close();
    }

    public static int gcd(int a, int b) {
        if(b == 0)
            return a;
        return gcd(b,a % b);
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글