
내가 생각했을때 문제에서 원하는부분
첫째 줄에 테스트 케이스의 개수가 주어진다.
각 테스트 케이스는 한 줄에 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; // 최종 점수 반환
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.