일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Computer Science
- SW Expert Academy
- 프로그래머스
- MYSQL
- Spring JPA
- Spring
- Spotify Api
- programmers
- spotify
- SECS-II
- regression
- SWEA
- c
- java
- CS
- spring boot
- SECS
- 백준
- 회귀
- C++
- 파이썬
- 스포티파이
- Baekjoon
- python
- SECS/GEM
- 회원가입
- 자바
- modern c++
- linux
- Gem
Archives
- Today
- Total
비버놀로지
[Programmers 프로그래머스] 85002 복사정렬하기 (JAVA) 본문
728x90
https://programmers.co.kr/learn/courses/30/lessons/85002
문제 설명
복서 선수들의 몸무게 weights와, 복서 선수들의 전적을 나타내는 head2head가 매개변수로 주어집니다. 복서 선수들의 번호를 다음과 같은 순서로 정렬한 후 return 하도록 solution 함수를 완성해주세요.
- 전체 승률이 높은 복서의 번호가 앞쪽으로 갑니다. 아직 다른 복서랑 붙어본 적이 없는 복서의 승률은 0%로 취급합니다.
- 승률이 동일한 복서의 번호들 중에서는 자신보다 몸무게가 무거운 복서를 이긴 횟수가 많은 복서의 번호가 앞쪽으로 갑니다.
- 자신보다 무거운 복서를 이긴 횟수까지 동일한 복서의 번호들 중에서는 자기 몸무게가 무거운 복서의 번호가 앞쪽으로 갑니다.
- 자기 몸무게까지 동일한 복서의 번호들 중에서는 작은 번호가 앞쪽으로 갑니다.
제한사항
- weights의 길이는 2 이상 1,000 이하입니다.
- weights의 모든 값은 45 이상 150 이하의 정수입니다.
- weights[i] 는 i+1번 복서의 몸무게(kg)를 의미합니다.
- head2head의 길이는 weights의 길이와 같습니다.
- head2head의 모든 문자열은 길이가 weights의 길이와 동일하며, 'N', 'W', 'L'로 이루어진 문자열입니다.
- head2head[i] 는 i+1번 복서의 전적을 의미하며, head2head[i][j]는 i+1번 복서와 j+1번 복서의 매치 결과를 의미합니다.
- 'N' (None)은 두 복서가 아직 붙어본 적이 없음을 의미합니다.
- 'W' (Win)는 i+1번 복서가 j+1번 복서를 이겼음을 의미합니다.
- 'L' (Lose)는 i+1번 복사가 j+1번 복서에게 졌음을 의미합니다.
- 임의의 i에 대해서 head2head[i][i] 는 항상 'N'입니다. 자기 자신과 싸울 수는 없기 때문입니다.
- 임의의 i, j에 대해서 head2head[i][j] = 'W' 이면, head2head[j][i] = 'L'입니다.
- 임의의 i, j에 대해서 head2head[i][j] = 'L' 이면, head2head[j][i] = 'W'입니다.
- 임의의 i, j에 대해서 head2head[i][j] = 'N' 이면, head2head[j][i] = 'N'입니다.
입출력 예
weights | head2head | result |
[50,82,75,120] | ["NLWL","WNLL","LWNW","WWLN"] | [3,4,1,2] |
[145,92,86] | ["NLW","WNL","LWN"] | [2,3,1] |
[60,70,60] | ["NNN","NNN","NNN"] | [2,1,3] |
입출력 예 설명
입출력 예 #1
- 다음은 선수들의 정보를 나타낸 표입니다.
선수 번호 | vs 1번 | vs 2번 | vs 3번 | vs 4번 | 승률 | 자기보다 무거운 복서를 이긴 횟수 | 몸무게 |
1번 | - | 패배 | 승리 | 패배 | 33.33% | 1회 | 50kg |
2번 | 승리 | - | 패배 | 패배 | 33.33% | 0회 | 82kg |
3번 | 패배 | 승리 | - | 승리 | 66.66% | 2회 | 75kg |
4번 | 승리 | 승리 | 패배 | - | 66.66% | 0회 | 120kg |
- 본문에 서술된 우선순위를 따라 [3,4,1,2] 를 return 합니다.
입출력 예 #2
- 다음은 선수들의 정보를 나타낸 표입니다.
선수 번호 | vs 1번 | vs 2번 | vs 3번 | 승률 | 자기보다 무거운 복서를 이긴 횟수 | 몸무게 |
1번 | - | 패배 | 승리 | 50% | 0회 | 145kg |
2번 | 승리 | - | 패배 | 50% | 1회 | 92kg |
3번 | 패배 | 승리 | - | 50% | 1회 | 86kg |
- 본문에 서술된 우선순위를 따라 [2,3,1] 을 return 합니다.
입출력 예 #3
- 다음은 선수들의 정보를 나타낸 표입니다.
선수 번호 | vs 1번 | vs 2번 | vs 3번 | 승률 | 자기보다 무거운 복서를 이긴 횟수 | 몸무게 |
1번 | - | - | - | 0% (무전적) | 0회 | 60kg |
2번 | - | - | - | 0% (무전적) | 0회 | 70kg |
3번 | - | - | - | 0% (무전적) | 0회 | 60kg |
- 본문에 서술된 우선순위를 따라 [2,1,3] 을 return 합니다.
데이터를 저장해 줄 수 있는 Point Class를 정의해 줍니다.
Point안에는 승률, 무게, 번호, 자신보다 몸무게가 많이나가는 상대를 이겼을 때를 담을 수 있도록 했습니다.
그렇게 담겨진 데이터를 정렬할 수 있도록 comparable를 상속받아 사용했습니다.
그렇게 정렬된 값들을 앞에서 부터 출력을 해주면 정답이 나오게 됩니다.
import java.util.Collections;
import java.util.LinkedList;
class Solution {
private class Point implements Comparable<Point> {
int weight, no, winOverWeights;
double win;
public Point(double win, int weight, int no, int winOverWeights) {
super();
this.win = win;
this.weight = weight;
this.no = no;
this.winOverWeights = winOverWeights;
}
// 우선순위 계산
@Override
public int compareTo(Point o) {
if (this.win > o.win) {
return -1;
} else if (this.win == o.win) {
if (this.winOverWeights != o.winOverWeights) {
return o.winOverWeights - this.winOverWeights;
} else if (this.winOverWeights == o.winOverWeights) {
if (this.weight != o.weight) {
return o.weight - this.weight;
} else if (this.weight == o.weight) {
return this.no - o.no;
}
}
}
return no;
}
}
public int[] solution(int[] weights, String[] head2head) {
char[][] arr_head = new char[head2head.length][head2head.length];
LinkedList<Point> result = new LinkedList<Point>();
int answer[] = new int[weights.length];
// 입력을 2차원 배열로 변경
for (int i = 0; i < head2head.length; i++) {
arr_head[i] = head2head[i].toCharArray();
}
// 승률과 무게가 더 많이 나가는 상대를 이겼을 경우를 저장
for (int i = 0; i < head2head.length; i++) {
int w_cnt = 0;
int l_cnt = 0;
int over_cnt = 0;
for (int j = 0; j < head2head.length; j++) {
if (arr_head[i][j] == 'W') {
w_cnt++;
if (weights[j] > weights[i]) {
over_cnt++;
}
} else if (arr_head[i][j] == 'L') {
l_cnt++;
}
}
double avg = 0;
if (w_cnt + l_cnt == 0) {
avg = 0;
} else {
avg = (double) w_cnt / (w_cnt + l_cnt);
}
result.add(new Point(avg, weights[i], i, over_cnt));
}
Collections.sort(result);
for (int i = 0; i < answer.length; i++) {
answer[i] = result.get(i).no + 1;
}
return answer;
}
}
728x90
'ALGORITM > JAVA' 카테고리의 다른 글
[BAEKJOON 백준] 11654 아스키 코드 (JAVA) (0) | 2021.09.10 |
---|---|
[BAEKJOON 백준] 2562 최댓값 (JAVA) (0) | 2021.09.10 |
[Programmers 프로그래머스] 84512 모음사전 (JAVA) (0) | 2021.09.10 |
[Programmers 프로그래머스] 84325 직업군 추천하기 (JAVA) (0) | 2021.09.08 |
[Programmers 프로그래머스] 83201 상호평가 (JAVA) (0) | 2021.09.08 |
Comments