아무래도 구현문제를 많이 풀어봐야 겠다는 생각이 들었다
문제를 푸는데도 조금 차근차근히 볼 수 있는 습관이 들어지면 좋을 것 같은데 특히 구현문제가 그런것 같다.
compareTo나 Comparator를 사용하는 것에는 이제는 문젠 없는데,,
첫번째 내 코드에서 문제점은 n의 크기 만큼 들어오기 전에 중복 데이터를 검사도 안하고 add한다는 점이었다.
for (int i = 0; i < chuchun; i++) {
if (result.size() < n) {
result.add(new Pictrue(sc.nextInt(), 1));
} else {
int num = sc.nextInt();
boolean flag = true;
for (int j = 0; j < n; j++) {
if (result.get(j).num == num) {
result.get(j).chuchun = result.get(j).chuchun + 1; // 이미 값이 있는 경우
flag = false;
break;
}
}
if (flag) {
Collections.sort(result);
result.remove(0);
result.add(new Pictrue(num, 1));
}
}
}
그래서 else 안에 있는 for문 검증을 밖으로 빼줬다
for (int i = 0; i < chuchun; i++) {
int num = sc.nextInt();
boolean flag = true;
// for문 검증
for (int j = 0; j < result.size(); j++) {
if (result.get(j).num == num) {
result.get(j).chuchun = result.get(j).chuchun + 1; // 이미 값이 있는 경우
flag = false;
break;
}
}
if (flag) {
if (result.size() >= n) {
Collections.sort(result);
result.remove(0);
}
result.add(new Pictrue(num, 1));
}
}
그러고 또 틀려서 검색해봤는데. 내 코드랑 다를게 없다 생각했는데,
들어온 데이터들을 순서대로 저장을 할 수 있는 매개변수를 하나 더 설정했다. 그렇게 해서 정렬할때 조건을 compare에 추가하였다
static class Pictrue implements Comparable<Pictrue> {
int idx;
int num;
int chuchun;
Pictrue(int idx, int num, int chuchun) {
this.idx = idx;
this.num = num;
this.chuchun = chuchun;
}
@Override
public int compareTo(Pictrue o) {
if (this.chuchun == o.chuchun) {
return this.idx - o.idx;
}
return this.chuchun - o.chuchun;
}
}