꾸물꾸물 졔의 개발공부
백준 1900 - 레슬러 ( JAVA ) 본문
1900번: 레슬러
첫째 줄에 선수들의 수 N이 주어진다. 선수들은 1부터 N까지 번호가 붙어 있다. 다음 N개의 줄에는 한 줄에 한 선수의 힘과 그가 가진 마술 링의 힘이 주어진다. 선수 k의 정보는 k+1번째 줄에 주어
www.acmicpc.net
알고리즘
: 그리디 + 정렬
1:1 경기를 통해 각 선수의 이긴 횟수를 카운트 한다.
( N명의 선수 중 2명의 조합을 찾아 경기를 하면 되므로 이중 반복문을 통해 구현)
금화의 수를 최소화하기 위해선, 많이 이긴 순대로 금화를 수여해야 한다.
금화 = 이긴 경기 수 + 자기 보다 앞에 있는 선수 중 이긴 선수 이기 때문에, 앞쪽에서 수여해야 ' 자기보다 앞에 있는 선수 중 이긴 선수 '의 값이 작아진다.
즉, 선수들 마다 경기에서 이긴 횟수를 count 하고, 해당 값을 기준으로 내림차순 정렬하여 출력한다.
1. N명의 선수들이 주어질 때 2차원 배열을 생성하여 [ 선수의 힘 , 마술링의 힘, 승리 횟수, 선수번호 ] 를 저장한다.
2. 이중 for 문을 통해 1:1 경기를 구현한다. 이긴 선수의 승리 횟수를 count ++ 한다.
( 조합 : 1 vs 2 == 2 vs 1 )
3. 모든 경기가 끝났을 때, 배열을 ' 승리 횟수 ' 를 기준으로 내림차순 정렬한다. ( 많이 이긴 선수가 앞쪽으로 )
4. 순서대로 ' 선수 번호 ' 출력하면 끝 !
소스 코드
import java.io.*;
import java.util.*;
public class Solution_BaekJoon_1900{
public static void main(String[] args) throws Exception{
BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine()); //선수의 수
int[][] player = new int [N][4];
dlrls
for(int i=0; i<N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
player[i][0] = Integer.parseInt(st.nextToken());
player[i][1] = Integer.parseInt(st.nextToken());
player[i][2] = i+1; // 선수 번호
}// -------------- input ----------------
for(int i=0; i<N-1; i++) {
for(int j=i+1; j<N; j++) {
int power1 = player[i][0] + player[i][1] * player[j][0];
int power2 = player[j][0] + player[j][1] * player[i][0];
if(power1 > power2) player[i][3] ++;
else player[j][3]++;
}
}
// 이긴횟수 기준 내림차순 정렬
Arrays.sort(player, (p1, p2) ->{
return p2[3] - p1[3];
});
for(int i=0; i<N; i++) {
System.out.println(player[i][2]);
}
} // end of main
}// end of class
끗
'알고리즘 > 백준' 카테고리의 다른 글
백준 1904 - 01타일 ( JAVA ) (0) | 2023.02.13 |
---|---|
백준 1107 - 리모컨 ( JAVA ) (0) | 2023.02.10 |
백준 9251 - LCS ( JAVA ) (0) | 2023.02.06 |
백준 11403 - 경로 찾기 ( JAVA ) (0) | 2023.02.03 |
백준 2805 - 나무 자르기 ( JAVA ) (0) | 2023.02.02 |