백준 클리크 조절

KIMYEONGJUN·2025년 12월 6일
post-thumbnail

문제

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

첫 번째 줄에 각 사격 훈련마다 발사한 총알의 개수를 의미하는 양의 정수 N이 주어진다. (1 ≤ N ≤ 200000)
두 번째 줄부터 N줄에 걸쳐 첫 번째 사격 훈련에서 발사한 총알이 표적지에 꽂힌 위치의 좌표를 의미하는 정수 x와 y가 공백으로 구분되어 주어진다. (-10^9 ≤ x,y ≤ 10^9)
그다음 N줄에 걸쳐 두 번째 사격 훈련에서 발사한 총알이 표적지에 꽂힌 위치의 좌표를 의미하는 정수 x와 y가 공백으로 구분되어 주어진다. (-10^9 ≤ x,y ≤ 10^9)

각 탄착군이 x축과 y축 양의 방향에 대하여 평행이동한 값을 의미하는 A와 B를 공백으로 구분하여 출력한다.
문제의 조건을 만족시키는 A와 B가 반드시 존재한다.

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

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));: 표준 입력(콘솔)으로부터 데이터를 읽어오기 위한 BufferedReader 객체를 생성한다.
N 값 읽기:
int N = Integer.parseInt(br.readLine());: 첫 번째 줄에서 총알의 개수 N을 읽어 정수형으로 변환해 저장한다.
합계 변수 초기화:
long sumX1 = 0;, long sumY1 = 0;, long sumX2 = 0;, long sumY2 = 0;: 첫 번째 사격과 두 번째 사격의 x 좌표와 y 좌표를 각각 합산할 변수들을 선언한다. 
좌표값이 크기 때문에 long 타입으로 선언하여 오버플로우를 방지한다.
첫 번째 사격 데이터 처리:
for(int i = 0; i < N; i++): N번 반복하면서 첫 번째 사격의 총알 위치를 읽는다.
StringTokenizer st = new StringTokenizer(br.readLine());: 한 줄씩 읽은 뒤, StringTokenizer를 이용해 x와 y 좌표를 분리한다.
int x = Integer.parseInt(st.nextToken());, int y = Integer.parseInt(st.nextToken());: 분리된 문자열을 정수형으로 변환한다.
sumX1 += x;, sumY1 += y;: 각 좌표를 해당 합계 변수에 더해준다.
두 번째 사격 데이터 처리:
마찬가지로 N번 반복하여 두 번째 사격의 총알 위치를 읽고 sumX2, sumY2에 합산한다. 
과정은 첫 번째 사격 데이터 처리와 동일하다.
A와 B 계산 및 출력:
long A = (sumX2 - sumX1) / N;: 위에서 설명한 대로 A 값을 계산한다. (두 번째 사격의 총 x좌표 합 - 첫 번째 사격의 총 x좌표 합)을 N으로 나누어 평균적인 x 이동량을 구하는 거다.
long B = (sumY2 - sumY1) / N;: B 값도 같은 방식으로 계산한다.
System.out.println(A + " " + B);: 계산된 A와 B 값을 공백으로 구분하여 출력한다.
자원 해제:
br.close();: 사용이 끝난 BufferedReader를 닫아서 시스템 자원을 해제한다.

코드로 구현

package baekjoon.baekjoon_31;

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

// 백준 33884번 문제
public class Main1229 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        // N (총알 개수) 읽기
        int N = Integer.parseInt(br.readLine());

        long sumX1 = 0; // 첫 번째 사격의 x좌표 합계
        long sumY1 = 0; // 첫 번째 사격의 y좌표 합계

        // 첫 번째 사격 훈련의 N개 총알 위치 읽기
        for (int i = 0; i < N; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int x = Integer.parseInt(st.nextToken());
            int y = Integer.parseInt(st.nextToken());
            sumX1 += x;
            sumY1 += y;
        }

        long sumX2 = 0; // 두 번째 사격의 x좌표 합계
        long sumY2 = 0; // 두 번째 사격의 y좌표 합계

        // 두 번째 사격 훈련의 N개 총알 위치 읽기
        for (int i = 0; i < N; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int x = Integer.parseInt(st.nextToken());
            int y = Integer.parseInt(st.nextToken());
            sumX2 += x;
            sumY2 += y;
        }

        // A와 B 계산
        // (두 번째 사격의 총 x좌표 합 - 첫 번째 사격의 총 x좌표 합) / N
        long A = (sumX2 - sumX1) / N;
        // (두 번째 사격의 총 y좌표 합 - 첫 번째 사격의 총 y좌표 합) / N
        long B = (sumY2 - sumY1) / N;

        // 결과 출력
        System.out.println(A + " " + B);
        br.close(); // BufferedReader 닫기
    }
}

마무리

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

profile
Junior backend developer

0개의 댓글