백준 다트

KIMYEONGJUN·2024년 11월 18일
post-thumbnail

문제

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

첫째 줄에 테스트 케이스의 개수가 주어진다.
각 테스트 케이스는 한 줄에 12개의 실수(double-precision 값)가 있다.
각 쌍은 중심과 다트의 거리이고, x, y거리 순서이고 단위는 cm이다.
처음 3개의 수는 첫 번째 플레이어가 던진 다트이고,
다음 3개는 두 번째 플레이어가 던진 것이다. (-20.0 ≤ X,Y ≤ 20.0)

각 테스트 케이스에 대해서, 게임을 이긴 사람이 있다면 다음과 같은 형식으로 출력한다.
SCORE: N to M, PLAYER P WINS.
만약, 비겼다면
SCORE: N to M, TIE.
를 출력한다.
N은 첫 번째 플레이어의 점수,
M은 두 번째 플레이어의 점수이고,
P는 게임을 승리한 사람의 번호 1 또는 2이다.
모든 값은 음이 아닌 정수이다.

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

두 플레이어가 다트를 던진 위치를 입력받아 점수를 계산하고 승자를 판별하는 문제이다.
BufferedReader를 사용하여 입력받는다.
각 플레이어의 다트 좌표를 Position 클래스를 설정해준다.
getScore 메서드는 다트의 거리 계산을 통해 각 링에 해당하는 점수를 합산해준다.
최종적으로 두 플레이어의 점수를 비교하여 승자를 출력한다.
이 로직은 게임의 규칙을 그대로 반영하여 점수 계산과 비교하여 출력해주는 구조로 작성해봤다.

코드로 구현

package baekjoon.baekjoon_24;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

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

        // 테스트 케이스의 수를 입력받음
        int T = Integer.parseInt(br.readLine());

        // 각 테스트 케이스에 대해 반복
        for(int i = 0; i < T; i++) {
            List<Position> player1 = new ArrayList<>(); // 첫 번째 플레이어의 다트 위치 저장
            List<Position> player2 = new ArrayList<>(); // 두 번째 플레이어의 다트 위치 저장

            // 6개의 점수를 입력받음
            String[] inputs = br.readLine().split(" "); // 한 줄의 입력을 공백으로 나누어 배열로 저장
            for(int j = 0; j < 6; j++) {
                double x = Double.parseDouble(inputs[j * 2]); // x 좌표
                double y = Double.parseDouble(inputs[j * 2 + 1]); // y 좌표
                if(j < 3) {
                    player1.add(new Position(x, y)); // 첫 번째 플레이어의 다트 위치 추가
                } else {
                    player2.add(new Position(x, y)); // 두 번째 플레이어의 다트 위치 추가
                }
            }

            // 각 플레이어의 점수 계산
            int player1Score = getScore(player1);
            int player2Score = getScore(player2);

            // 결과 출력
            System.out.print("SCORE: " + player1Score + " to " + player2Score + ", ");
            if(player1Score == player2Score) {
                System.out.println("TIE."); // 점수가 같으면 무승부
            } else if(player1Score > player2Score) {
                System.out.println("PLAYER 1 WINS."); // 첫 번째 플레이어 승리
            } else {
                System.out.println("PLAYER 2 WINS."); // 두 번째 플레이어 승리
            }
        }
        br.close(); // BufferedReader 닫기
    }

    // Position 클래스를 정의하여 다트의 x, y 좌표를 저장
    static class Position {
        double x;
        double y;

        Position(double x, double y) {
            this.x = x;
            this.y = y;
        }
    }

    // 플레이어의 점수를 계산하는 메서드
    static int getScore(List<Position> player) {
        int sum = 0; // 점수 초기화
        for(Position p : player) {
            double len = Math.sqrt(p.x * p.x + p.y * p.y); // (0,0)에서의 거리 계산
            // 거리의 범위에 따라 점수를 결정
            if(len <= 3) {
                sum += 100; // 불스아이
            } else if(len <= 6) {
                sum += 80; // 2번째 링
            } else if(len <= 9) {
                sum += 60; // 3번째 링
            } else if(len <= 12) {
                sum += 40; // 4번째 링
            } else if(len <= 15) {
                sum += 20; // 5번째 링
            }
        }
        return sum; // 최종 점수 반환
    }
}

마무리

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

profile
Junior backend developer

0개의 댓글