돌았다...카카오 2019? 문제라던데....
레벨 1짜리인데......
아....
자바 처음부터 다시 하는 수준이라...문제 푸는 데 이틀 걸림...
내가 가장 먼저 생각한 코드...
사실 실패율을 배열로 만든 것까지는 다 됨.
그걸 어떻게 인덱스 순으로 정렬하는지가 관건이었다.
근데 그게 하도 안돼서 진짜 개고생개고생을 함...파이썬이라면 어찌어찌했을텐데 자바라서 하도 문법이 생각이 안 났음...
근데 막상 돌려보니 런타임 에러밖에 안남.
import java.util.*;
class Solution {
public static int[] solution(int N, int[] stages) {
int[] answer = new int[N];
int people = stages.length;
int clear = people;
Arrays.sort(stages);
Float [] failure = new Float[N];
for (int i=1; i<=N; i++){
int fail = 0;
for (int j=0; j<people; j++){
if (stages[j] == i) fail ++;
else if (stages[j] > i) break;
}
float result = (float)fail/clear;
failure[i-1] = result;
clear -= fail;
}
Float [] failure2 = new Float[N];
System.arraycopy(failure,0,failure2,0,N);
Arrays.sort(failure2, Collections.reverseOrder());
int [] path = new int[5];
for (int x=0; x<N; x++){
for (int y=0; y<N; y++){
if (failure2[x] == failure[y]){
answer[x] = y+1;
path[x] = y;
break;
}
}
}
System.out.println(Arrays.toString(failure));
System.out.println(Arrays.toString(failure2));
System.out.println(Arrays.toString(answer));
return answer;
}
public static void main(String [] args) {
int [] arr = {2, 1, 2, 6, 2, 4, 3, 3};
System.out.println(solution(5,arr));
}
}
1차 시도에서 실패율까지는 성공적으로 구했으니까 그걸 정렬을 좀 더 용이하게 하기 위해서 2차원 배열을 이용함! 원래 실패율 구한 그 배열을 1차원-> 2차원으로 바꿔어서 [i][0]번째에는 스테이지 인덱스 값을 [i][1]번째에는 실패율을 넣기로 함.
2차원 배열 정렬하는 문법이 정말 새로웠음....이것도 외워야 한다니..!
아무튼 근데 돌렸는데 70.4 점이 나온거임.
import java.util.*;
class Solution {
public static int[] solution(int N, int[] stages) {
int[] answer = new int[N];
int people = stages.length;
int clear = people;
Arrays.sort(stages);
Double [][] failure = new Double[N][2];
for (int i=1; i<=N; i++){
int fail = 0;
for (int j=0; j<people; j++){
if (stages[j] == i) fail ++;
else if (stages[j] > i) break;
}
failure[i-1][0] = (double)i;
failure[i-1][1] = (double)fail/clear;
clear -= fail;
}
Arrays.sort(failure, (o1, o2) -> {
if(o1[1] == o2[1]){
return Double.compare(o2[0], o1[0]);
}else{
return Double.compare(o2[1], o1[1]);
}
});
for (int i=0; i<failure.length; i++){
answer[i] = failure[i][0].intValue();
}
return answer;
}
public static void main(String [] args) {
int [] arr = {2, 1, 2, 6, 2, 4, 3, 3};
System.out.println(solution(5,arr));
}
}
2차 시도가 끝일 줄 알았는데 내 코드의 정확도가 70.4라는 사실이 너무 짜증나서 다른 사람 코드를 볼까 고민했음.
근데 다른 사람 코드 봐도 어차피 또 내 코드랑 다르니까 헷갈릴 게 분명함.
그래서 그냥 테스트코드 예시를 검색함.
다행히 어떤 블로그에서 N=8, {1,2,3,4,5,6,7} 예시를 해 보라고 했고,
내 코드의 문제점을 발견(!)
내 코드에서는 한 명도 도달하지 않은 스테이지에 대한 고려가 전혀 없었음.
N=8, {1,2,3,4,5,6,7} 예시의 경우, 한 명도 스테이지 8까지 못 간 케이스임. 근데 내가 이걸 고려하지 않았으니, 다시 실패율 구하는 부분에서 코드만 한 줄 더 추가함.
import java.util.*;
class Solution {
public static int[] solution(int N, int[] stages) {
int[] answer = new int[N];
int people = stages.length;
int clear = people;
Arrays.sort(stages);
Double [][] failure = new Double[N][2];
for (int i=1; i<=N; i++){
int fail = 0;
for (int j=0; j<people; j++){
if (stages[j] == i) fail ++;
else if (stages[j] > i) break;
}
failure[i-1][0] = (double)i;
if (clear == 0) failure[i-1][1] = 0.0;
else failure[i-1][1] = (double)fail/clear;
clear -= fail;
}
//Arrays.sort(failure, Comparator.comparingDouble(o1 -> o1[1]));
Arrays.sort(failure, (o1, o2) -> {
if(o1[1] == o2[1]){
return Double.compare(o2[0], o1[0]);
}else{
return Double.compare(o2[1], o1[1]);
}
});
for (int i=0; i<failure.length; i++){
//System.out.println(failure[i][0].intValue()+" " + failure[i][1]);
answer[i] = failure[i][0].intValue();
}
System.out.println(Arrays.toString(answer));
return answer;
}
public static void main(String [] args) {
int [] arr = {1,2,3,4,5,6,7};
System.out.println(solution(8,arr));
}
}