Solution 1) 내 풀이
import java.util.Arrays;

class Solution {
    public int[] solution(int[] arr, int k) {
        int[] tmp = Arrays.stream(arr).distinct().toArray();
        int[] answer = new int[k];

        for (int i = 0; i < answer.length; i++) {
            answer[i] = -1;
        }
        for (int i = 0; i < Math.min(answer.length, tmp.length); i++) {
        answer[i] = tmp[i];
        }
        return answer;
    }
}

 

문제 및 코드 리뷰

 

문자열 arr과 int 가 주어진다. 새로운 배열을 k의 크기로 만든 후 arr에서 중복되는 수를 뺀 배열을 k에 넣어야한다.

이때 arr에서 중복되지 않는 수가 k 보다 크다면 k의 크기만큼만 가져오면 되지만, 중복되지 않는 수가 k 보다 적다면 남은 k의 요소 공간은 -1로 채운 뒤 반환해야한다.

 

  • 먼져 arr 배열을 distint 메소드를 이용해 중복 되는 수를 없앤다.
    • int[] tmp = Arrays.stream(arr).distinct().toArray();
  • 반환해야하는 배열 answer을 k의 크기로 만든다.
    • int[] answer = new int[k];
  • 새로 만든 answer 배열에 기본 요소들을 -1로 초기화 시킨다. (남는 공간을 -1로 채우기 위함)
    • for (int i = 0; i < answer.length; i++) {
                  answer[i] = -1;
              }
  • answer의 길이 또는 중복 요소를 제외 시킨 tmp 배열 중 작은 크기만큼 돌릴 반복문을 생성한다. 한 다음 반환할 answer 배열의 각 위치에 tmp 배열 요소를 초기화 시킨다.
    • for (int i = 0; i < Math.min(answer.length, tmp.length); i++) {
              answer[i] = tmp[i];
              }

arr과 k의 초기값에 따라

1. 반환시킬 answer의 크기(결국 k의 값)가 클수도

2. 중복 되는 값을 배제 시킨 임시배열 tmp의 값이 클수도 있다.

 

처음엔 스택을 이용해 풀어봤다가 굳이 스택 없이 배열만으로도 풀수 있겠다 싶어 시도했었다.

그치만 예제만 성공할뿐 채점시엔 모든 케이스가 실패였다.

확실히 더 확인해보진 못했지만 아무래도 위에 나열해둔 answer과 중복 값을 배제시킨 임시배열의 크기를

고려하지 못했었기 때문이지 않나 싶다.

 

덕분에 distinct 메서드를 배웠다.

stream의 중간연산자로 equals를 기반으로 중복요소를 제거해준다.

중복요소. distinct 기억하자.

+ Recent posts