[2021-09-10] 복서 정렬하기
2021. 9. 11. 00:07ㆍ코딩테스트
푼 시간 : 2시간 30분
언어 : 자바
https://programmers.co.kr/learn/courses/30/lessons/85002?language=java
코딩테스트 연습 - 6주차
복서 선수들의 몸무게 weights와, 복서 선수들의 전적을 나타내는 head2head가 매개변수로 주어집니다. 복서 선수들의 번호를 다음과 같은 순서로 정렬한 후 return 하도록 solution 함수를 완성해주세요
programmers.co.kr
정렬인데, 단순한 정렬같은 느낌이 아니었다...
완전탐색을 보는듯한 풀이법..
코드를 더 효율적으로 쓰고싶다...ㅜㅜ
주어진 조건대로 풀이를 하고나서 처음에는 테스트케이스가 맞아서 기뻐했는데
제출을 해보니 안맞는것이었다.
조건 몇가지를 내 맘대로 생각해서 질질 끌고 있었다.
조건이 세세적으로 주어졌는데도 오래동안 잡고있었더니 너무 힘들다..
import java.util.*;
class Solution {
public int[] solution(int[] weights, String[] head2head) {
int[] answer = {};
char[] key = {'L', 'W'};
// 이기고 진것만 카운트 하기 위해
double win = 0;
// 이긴것
double sum = 0;
// 총 경기한 수
double[] late = new double[weights.length];
// 승률
int[] heavy = new int[weights.length];
// 나보다 몸무게 많은사람을 이긴 횟수
int[] num = new int[weights.length];
// 나의 번호
char[] temp;
// 복서가 이기고 진 경기 내용
int box = 0;
// 그냥 더하기 빼기할때 쓰려고
double latebox = 0;
// 승률이 더블이라...
for(int i=0; i<weights.length; i++){
num[i]=i+1;
}
for(int i=0; i<weights.length; i++) {
sum=0;
win=0;
temp = head2head[i].toCharArray();
// 경기결과를 저장했다.
for(int j=0; j<weights.length; j++) {
if(temp[j] == key[0])
// 졌으면 경기수만
sum += 1;
else if(temp[j] == key[1]){
// 이겼으면 경기수, 이긴 수
win += 1;
sum += 1;
if(weights[i]<weights[j])
// 나보다 무거운사람을 이긴 경우 +1
heavy[i] += 1;
}
}
late[i] = win / sum;
// 승률
if(Double.isNaN(late[i])){
// 승률이 0일경우 nan이 되기때문에, 0을 직접 넣어줘야 한다.
late[i]=0;
}
}
// 이제부터 그냥 하드코딩... 진짜 멋대가리 없다.
for(int i=0; i<weights.length; i++) {
for(int j=0; j<weights.length-1; j++){
if(late[j] < late[j+1]){
// 승률이 나보다 높으면 뒤로 도망 ㅠㅠ
latebox = late[j];
late[j] = late[j+1];
late[j+1] = latebox;
box = num[j];
num[j] = num[j+1];
num[j+1] = box;
box = weights[j];
weights[j] = weights[j+1];
weights[j+1] = box;
box = heavy[j];
heavy[j] = heavy[j+1];
heavy[j+1] = box;
}
}
}
for(int i=0; i<weights.length; i++){
for(int j=0; j<weights.length-1; j++){
if(heavy[j] < heavy[j+1] && late[j] == late[j+1]){
// 승률은 같은데 무거운사람을 많이 때려눕힌경우 도망 ㅠㅠ
latebox = late[j];
late[j] = late[j+1];
late[j+1] = latebox;
box = num[j];
num[j] = num[j+1];
num[j+1] = box;
box = weights[j];
weights[j] = weights[j+1];
weights[j+1] = box;
box = heavy[j];
heavy[j] = heavy[j+1];
heavy[j+1] = box;
}
}
}
for(int i=0; i<weights.length; i++){
for(int j=0; j<weights.length-1; j++){
if(weights[j] < weights[j+1] && late[j] == late[j+1] && heavy[j] == heavy[j+1]){
// 둘다 같은데 나보다 체중이 높은경우 ㅠㅠ
latebox = late[j];
late[j] = late[j+1];
late[j+1] = latebox;
box = num[j];
num[j] = num[j+1];
num[j+1] = box;
box = weights[j];
weights[j] = weights[j+1];
weights[j+1] = box;
box = heavy[j];
heavy[j] = heavy[j+1];
heavy[j+1] = box;
}
}
}
for(int i=0; i<weights.length; i++){
for(int j=0; j<weights.length-1; j++){
if(num[j] > num[j+1] && weights[j] == weights[j+1] && late[j] == late[j+1] && heavy[j] == heavy[j+1]){
// 셋다 같은데 나보다 번호가 작은경우 ㅠㅠ
latebox = late[j];
late[j] = late[j+1];
late[j+1] = latebox;
box = num[j];
num[j] = num[j+1];
num[j+1] = box;
box = weights[j];
weights[j] = weights[j+1];
weights[j+1] = box;
box = heavy[j];
heavy[j] = heavy[j+1];
heavy[j+1] = box;
}
}
}
return answer = Arrays.copyOf(num, num.length);
// 구했으면 복사해주자.
}
}
다른사람의 코드를 보니 놀랍다...
나는 얼마나 하드코딩을 때려박는 사람인가...
다시 한번 나를 돌아보는 시간이었다.
'코딩테스트' 카테고리의 다른 글
알고리즘 문제해결 전략 (0) | 2023.12.18 |
---|---|
[2022-03-24] 유기농 배추 (0) | 2022.03.24 |
[2021-07-25] 기능개발 (lv2) (0) | 2021.07.25 |
[2021-07-13] 예산 (0) | 2021.07.13 |
[2021-07-12] 숫자 문자열과 영단어 (0) | 2021.07.12 |