Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 운영체제의 예
- 클래스 변수
- 이것이코딩테스트다
- 객체 배열
- 운영체제의 구조
- 초기화 순서
- stateless widget
- stateful widget
- 명예의전당(1)
- 참조형 매개변수
- 프로그래머스
- 인스턴스 메서드
- 오버라이딩과 오버로딩 차이점
- this()와 참조변수 this 차이점
- 운영체제의 분류
- 조상의 생성자
- 오버로딩
- 운영체제의 목적
- PriorityQueue
- webview_flutter
- FLUTTER
- 호출스택
- this()
- object클래스
- 운영체제란 무엇인가
- stateful widget 생명주기
- static import문
- static 메서드
- 참조형 반환타입
- 기본형 매개변수
Archives
- Today
- Total
Coram Deo
[프로그래머스] - 명예의 전당 (1) (LinkedList 사용) 본문
처음에 문제를 보고 어렵지 않겠구나 했는데, 웬걸 자꾸 오류가 나서 엄청 많은 시간이 걸렸다.
아래와 같은 에러 메시지가 나왔다.
에러 메시지 : java.lang.IndexOutOfBoundsException: Index: 100, Size: 1
배열문제에서 가끔나는 범위 오류이구나 하고 계속 생각해봤는데 대체 어디서 오류가 난건지 한참을 고민했다.
결국 인텔리제이에서 디버깅 후 바로 알았다.
원인 : 연결리스트 add 메서드 매개변수인 인덱스와 값을 반대로 넣음.
원인을 알고 나서 허무함이란..
느낀점은 앞으로는 에러나면 무조건 디버깅하자..
오늘도, 내일도 파이팅 !
나의 풀이
* LinkedList 사용
import java.util.*;
class Solution {
public int[] solution(int k, int[] score) {
// 1번째 요소부터 score 배열의 길이-1까지 현재 인덱스값과 링크드리스트안의 요소를 비교한다.
// 비교 후 크기에 맞는 자리에 값을 추가한다.
// 사이즈가 k가 넘으면 가장 작은 값(링크드리스트의 첫번째 요소)을 삭제한다.
// 추가, 삭제 후 최종적인 링크드리스트의 첫번째 요소를 result 배열에 추가한다.
LinkedList<Integer> rank = new LinkedList();
int[] result = new int[score.length];
// rank에 아무값도 없는 경우, 0번째 값을 넣어준다.
rank.add(score[0]);
// 0번째 값 반환하는 것 잊지 않기 !
result[0] = rank.get(0);
for (int j = 1; j < score.length; j++) {
for (int i = 1; i <= rank.size(); i++) {
if (score[j] >= rank.get(rank.size() - i)) {
// 에러 메시지 : java.lang.IndexOutOfBoundsException: Index: 100, Size: 1
// 계속 범위 오류라고 틀렸던 이유
// -> 연결리스트 add 메서드 매개변수인 인덱스와 값을 반대로 넣음.
// -> rank.add(인덱스, 값)
rank.add(rank.size() - i + 1, score[j]);
break;
}// else문은 사용하면 안됨. 사용할경우 값이 반복문 돌때마다 계속 추가됨
}
// score[j]가 가장 작은 값일 경우(= rank에 있는 요소 중 score[j]보다 작은 값이 없는 경우)
if (score[j] < rank.get(0)) {
rank.addFirst(score[j]);
}
// rank의 사이즈가 k를 넘는 경우, rank의 가장 작은 값을 제거한다.
if (rank.size() > k) {
rank.removeFirst();
}
// rank의 가장 작은 값을 반환한다.
result[j] = rank.get(0);
}
return result;
}
}
다른 사람들 풀이
* PriorityQueue 사용 (보니까 다른 사람들은 우선순위 큐를 사용했다.)
import java.util.*;
class Solution {
public int[] solution(int k, int[] score) {
int[] answer = new int[score.length];
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();
int temp = 0;
for(int i = 0; i < score.length; i++) {
priorityQueue.add(score[i]);
if (priorityQueue.size() > k) {
priorityQueue.poll();
}
answer[i] = priorityQueue.peek();
}
return answer;
}
}
'알고리즘 공부' 카테고리의 다른 글
[프로그래머스] JadenCase 문자열 만들기(Java) - 리팩토링 과정 (0) | 2024.07.09 |
---|---|
[백준] 1427. 소트인사이드 (0) | 2024.06.24 |
[백준 Java] 9012. 괄호 (0) | 2024.06.11 |
[Java 에러] char cannot be dereferenced (0) | 2023.11.22 |
Java - 문자열 한 글자씩 분리하기 (0) | 2023.10.03 |