Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
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
Archives
Today
Total
관리 메뉴

개발이 하고싶니?

[프로그래머스] K번째수 (Java) 본문

스터디 . 코테 해체하기

[프로그래머스] K번째수 (Java)

차해:) 2024. 2. 6. 23:50

배열을 공부했으니 배열관련 문제를 풀어보자.

프로그래머스 K번째수 문제

 

더보기


import java.util.*;

class Solution {
    public int[] solution(int[] array, int[][] commands) {
        
        ArrayList<Integer> arrList = new ArrayList<>();


        for(int i : array){
            arrList.add(i);
        }
        
        int[] answer = new int[commands.length];

        for(int i=0; i<commands.length; i++){
            int startIdx= commands[i][0]-1;
            int endIdx=  commands[i][1];
            int numIdx= commands[i][2]-1;
            
            List<Integer> subList = arrList.subList(startIdx, endIdx);
            answer[i]=subList.get(numIdx);
        }
        
        return answer;
    }
}


**이 문제를 풀면서 검색 + 다른사람의 코드로 알게된 사실.

문자열 & StringBuffer.subString(시작인덱스, 끝 인덱스+1) 메서드가 있다면
리스트에도  리스트명.sudList(시작인덱스, 끝 인덱스+1) 메서드가 있다.


배열에는 Arrays.copyOfRange(배열명, 시작인덱스, 끝 인덱스+1)로 사용할 수 있다.

오류 1, 2

* 분명 ArrayList 생성방법 중에 

ArrayList <자료형> 리스트명 = new ArrayList<>(Arrays.asList(리스트로 변경할 배열명));

이렇게도 생성 가능하다는걸 배웠어서 이걸 써먹으려했다.

우선 첫번째 실수는 

ArrayList <자료형> 리스트명 =  new Arrays.asList(array);  로 작성해버려서 에러가 발생했고,

두번째 실수는

위 코드를 정상코드로 변경했지만. 저건 List의 자료형이 <String>이고,

리스트로 변경할 배열명의 자료형도 String 일때 사용이 가능한 것같다.

 

리스트 자료형이 <Integer>이고 배열의 자료형이 int 일때는 에러가 발생한다.

그래서 그냥 int배열을 List로 변경해줄 때는 for을 사용하기로 했다.


오류 3

*for문에 i를  for 문 밖에 선언한게 문제!

 

"

int startIdx= commands[i][0]-1;
int endIdx=  commands[i][1];
int numIdx= commands[i][2]-1;

"

 

이 부분을 List를 생성하면서 같이 선언해버렸다. 

이런 실수는 하지 말아야하는데...

어서 다시 고쳐서 여차저차 완성한 코드가 위에 코드이다!

세번의 수정을 고친 위에 코드마저 값이 다르게 나왔다.

뭐가 문제일까 

다시 천천히 살펴보니 정렬부분을 누락했다.

그래서 subList.sort(); 를 추가했는데

또 에러가났다. 

Java야 대체 무슨일이니... 왜 이렇게 심통이났어.... 나 좀 그냥 보내줘 ㅠㅠ

더보기

여기서 또 다시 알게된 사실
배열에서는  .sort(); 
리스트에서는 .sort(Comparator.naturalOrder());
를 사용한다는 것이다.
아니다. 

내 머리가 문제라는 사실을 알게된거였네,
또 까먹었네, 또 헷갈리고 어우
내가 작성한건  정렬할리스트.sort();  

 

배열은         Arrays.sort(정렬할배열);

리스트는     정렬할리스트.sort(Comparator.naturalOrder());


로 깔끔하게 해결할 수 있는 것이였다.

고급언어라며... 하나로 통일좀 ㅠㅠ

 List<Integer> subList = arrList.subList(startIdx, endIdx);

 subList.sort(Comparator.naturalOrder()); 
 answer[i]=subList.get(numIdx);

 

로 고치고 나서 다시 실행!!!!!

제발 통과 좀 하자...통과!!!!! 는 무슨 또 값이 다르게 나왔다.

이번엔  5,5,3   (참고로 답은 5,6,3)

 

나온 값으로 유추해봤을때...

6이 나와야하는데 5가 나왔다는건

for문 안에 있는 

 List<Integer> subList = arrList.subList(startIdx, endIdx); 의 

subList에 넣을때  나눌 때 인덱스값이 이상해서 잘 못 짤려 들어갔거나

subList에 6이 잘 들어갔는데 그 전단계 5가 남아있을 확률

 

예제를 넣어 하나씩 직접 해봤는데 인덱스에는 문제가 없고 

아마 subList  요소가 누적되는것 같았다

왜지..? 선언을해서 잘려진 요소들로만 subList가 만들어지는거 아닌가? 

잘모르겠지만 새롭게 생성을 해야하나보다....(new 추가!)

 

List<Integer> subList = new ArrayList<>(arrList.subList(startIdx, endIdx));로 변경해서 코드를 돌려보니 

드디어 통과 ㅠㅠ

나에게 코딩문제는 너무 어렵다.

 

다른사람들은 어떻게 했을까...

*******  다른 사람 코드
import java.util.Arrays;

class Solution {
      public int[] solution(int[] array, int[][] commands) {
            int[] answer = new int[commands.length];
            for(int i=0; i<commands.length; i++){
                 int[] temp = Arrays.copyOfRange(array, commands[i][0]-1, commands[i][1]);
                 Arrays.sort(temp);
                 answer[i] = temp[commands[i][2]-1];
            }
             return answer;
    }
}


*이렇게 작성하면 temp에 그 전 요소가 남지 않나보다..
왜 얘는 new가 없어도 되고 내가 짠 코드에는 new가 있어야하지..?
뭐가 다른거지 ㅠㅠ? 왜지;;

 

와...  문자열과 리스트만 자를수 있을 줄 알았는데

배열도 자를 수 있었다.

Arrays.copyOfRange(배열, 시작인덱스, 끝인덱스+1); 로 사용하면 가능!

그럼 나처럼 리스트로 변경하는 수고스러움은 안해도 되는거.....

그럼 리스트로 변경하면서 생긴 오류 1,2는 경험하지 않아도 됐던거였네...

다시 한 번 정리해보자!

*******참고해서 수정한 나의 코드

import java.util.*;

class Solution {
     public int[] solution(int[] array, int[][] commands) {
         int[] answer = new int[commands.length];
         for(int i=0; i<commands.length; i++){
              int startIdx= commands[i][0]-1;
              int endIdx= commands[i][1];
              int numIdx= commands[i][2]-1;

              int[] subArr = Arrays.copyOfRange(array, startIdx, endIdx);
              Arrays.sort(subArr);
              answer[i]=subArr[numIdx];
         }
          return answer;
     }
}

 

깔끔하다 마음에 든다.

배열은 완벽하게 공부했다고 생각했는데

아니였다 ㅠㅠ

더 열심히 해야겠다.

 

머리야... 굴러가줘 제발

 

 

 

 

+

+

+

아래 두개의 코드가 

첫번째는  리스트로 짠 코드고

두번째는 배열로 짬 코드인데 

결과값이 왜 다른지 아시는분 댓글 좀 남겨주세요 ㅠㅠ