
내가 생각했을때 문제에서 원하는부분
첫째 줄에는 반의 학생들의 수 N (3 ≤ N ≤ 1,000)이 주어진다.
다음 N개의 각 줄에는 각 학생이 제출한 회장후보 3명에 대한 선호 점수가 주어지는 데,
첫 번째 점수는 후보 1번에 대한 점수이고 두 번째 점수는 후보 2번에 대한 점수이고 세 번째 점수는 후보 3번에 대한 점수이다.
이 세 점수는 서로 다르며,
1, 2, 3이 정확히 한 번씩 나타난다.
학생들의 선호도 투표 결과로부터,
회장이 유일하게 결정되는 경우에는 회장으로 결정된 후보의 번호와 최고 점수를 출력하고,
유일하게 결정할 수 없는 경우에는 0과 최고 점수를 출력한다.
내가 이 문제를 보고 생각해본 부분
입력 처리: 사용자로부터 기온 기록 일수 N과 K일 동안의 최대 기온 합을 찾기 위한 기간 K를 입력을 받는다.
기온 배열 생성: N일 간의 기온을 저장할 배열을 선언하고, 각 기온을 입력받는다.
초기 K일간 기온 합 계산: 처음 K일간의 기온 합을 계산하여 maxSum에 저장한다.
슬라이딩 윈도우 기법: K일 이후부터는 슬라이딩 윈도우 기법을 사용하여 이전 K일의 첫 번째 기온을 빼고 현재 기온을 더하여 새로운 K일 기온 합을 계산한다.
이 과정에서 maxSum을 갱신한다.
결과 출력: 찾은 최대 기온 합을 출력한다.
코드로 구현
package baekjoon.baekjoon_24;
import java.util.Scanner;
// 백준 2456번 문제
public class Main824 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 후보자 점수를 저장할 배열 (각 후보자 1, 2, 3)
int[] candidate = new int[3];
// 각 후보자가 받은 점수의 제곱을 저장할 배열 (3점, 2점, 1점의 횟수 계산)
int[] squared = new int[3];
// 학생 수 N을 입력받음
int N = Integer.parseInt(sc.nextLine());
// 각 학생의 선호도 점수를 입력받음
for(int i = 0; i < N; i++) {
String[] input = sc.nextLine().split(" ");
// 각 후보자에 대한 점수를 정수형으로 변환
int a = Integer.parseInt(input[0]); // 후보 1에 대한 점수
int b = Integer.parseInt(input[1]); // 후보 2에 대한 점수
int c = Integer.parseInt(input[2]); // 후보 3에 대한 점수
// 후보자 점수 합산
candidate[0] += a; // 후보 1 점수 합산
candidate[1] += b; // 후보 2 점수 합산
candidate[2] += c; // 후보 3 점수 합산
// 각 후보자 점수의 제곱을 합산 (3점, 2점, 1점의 횟수 확인을 위해)
squared[0] += a * a; // 후보 1의 제곱 점수 합산
squared[1] += b * b; // 후보 2의 제곱 점수 합산
squared[2] += c * c; // 후보 3의 제곱 점수 합산
}
// 최고 점수 계산
int maxScore = Math.max(candidate[0], Math.max(candidate[1], candidate[2]));
// 최고 점수를 받은 후보가 한 명인지 확인
if(countOccurrences(candidate, maxScore) == 1) {
// 유일한 후보를 찾고 출력
for(int i = 0; i < candidate.length; i++) {
if(candidate[i] == maxScore) {
System.out.println((i + 1) + " " + maxScore); // 후보 번호와 점수 출력
break;
}
}
} else {
// 최고 점수가 여러 후보에 걸쳐 있을 경우
int maxSquared = Math.max(squared[0], Math.max(squared[1], squared[2]));
int elected = -1;
// 제곱 점수로 후보를 결정
for(int i = 0; i < squared.length; i++) {
if(squared[i] == maxSquared) {
elected = i; // 제곱 점수가 가장 높은 후보 저장
break;
}
}
// 제곱 점수도 같은 후보가 여러 명인지 확인
if(countOccurrences(squared, maxSquared) > 1) {
// 여러 후보가 동점일 경우
System.out.println("0 " + candidate[elected]); // 0과 후보의 점수 출력
} else {
// 유일한 후보가 결정되었을 경우
System.out.println((elected + 1) + " " + candidate[elected]); // 후보 번호와 점수 출력
}
}
sc.close(); // 스캐너 닫기
}
// 특정 값이 배열에서 몇 번 나타나는지 세는 메소드
private static int countOccurrences(int[] array, int value) {
int count = 0;
for(int v : array) {
if(v == value) {
count++; // 값이 같으면 카운트 증가
}
}
return count; // 카운트 반환
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.