본문 바로가기
끄적/Java_CT

[프로그래머스] - 스택/큐_같은숫자는싫어 List / Set

by 밀키스 2022. 8. 19.

 문제설명 

 

 

 


 

 문제풀이 

 코드전문 

더보기

 

import java.util.*;

public class Solution {
    public int[] solution(int []arr) {
    	// 첫번째
		// Integer[] arr_integer = Arrays.stream(arr).boxed().toArray(Integer[]::new);
		// Set<Integer> set_integer = new LinkedHashSet();
		// Collections.addAll(set_integer, arr_integer);
		// return set_integer.stream().mapToInt(Integer::intValue).toArray();
        // 두번째
		// String ans_string = arr[0]+"";
		// for(int i : arr) {
		// 	if(Integer.parseInt(ans_string.substring(ans_string.length()-1, ans_string.length())) != i) ans_string+="," +i;
		// }
		// return Arrays.stream(ans_string.substring(0,ans_string.length()).split(",")).mapToInt(Integer::parseInt).toArray();
         
		List<Integer> arr_list = new ArrayList<>();
		arr_list.add(arr[0]);
		for(int i : arr) {
			if(arr_list.get(arr_list.size()-1) != i) arr_list.add(i);
		}
		return arr_list.stream().mapToInt(i->i).toArray();
    }
}

 

  1. 처음에 문제 이해를 잘못하여 Set으로 변환하면 풀리겠다 했는데.. 연속된 문자 한정이였다.
    1.  1,1,0,1,1 이면 1,0,1이지 1,0이 아니다.
  2. String에 담은 뒤에 조건문으로 거르고 후에 배열로 바꾸려 했는데 효율성에서 틀렸다.
  3. 더 효율적일 필요 없이 List라는 방법이 있었다! 2번과 마찬가지로 조건문을 사용하였다.

 

많이 어려운 문제는 아니더라도 이 안에서 바로 효율적인 면을 잡을 수 있게 되면 좋겠다.

 

 

 

 

 

*Set :: HashSet과 LinkedHashSet

앞서 말했던것처럼 만일 숫자가 [1,1,3,3,0,1,1]과 같이 주어졌을 때, 답이 [1,3,0] 이였다면 LinkedHashSet이 좋은 선택지였지만 아니였다.

 

여기서 Set은 기본적으로

  1. 데이터의 중복을 허락하지 않는다.
  2. 순서를 보장하지 않는다.

라는 두가지 특징이 있는데, LinkedHashSet은 데이터의 중복을 허락하지 않음은 물론 입력 순대로 데이터를 관리한다.

 

그렇기 때문에 만일 내가 초기에 오해했던 대로라면 배열을 LinkedHashSet으로 바꾸고 다시 배열로 돌려 제출하는것 만으로 1.순서대로 2. 중복된 데이터만 빼고 값을 출력할 수 있다!

 

 

 

 

 

 

 

그 외 2번째 방법은 코드를 작성하면서도 너무 비효율적인가 라는 의문을 계속 갖게 했는데 아니나 다를까 효율성에서 틀려버렸다...

 

3번째 방법은 List를 사용하고, 마지막에 stream을 이용해 배열 형태로 돌려 답은 출력하였다.

 

 

반응형

댓글