본문 바로가기
algorithm/Programmers

[JAVA] 같은 숫자는 싫어

by 이쟝 2023. 3. 29.

https://school.programmers.co.kr/learn/courses/30/lessons/12906

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

스택(Stack)

 

알고리즘1-3. 스택(Stack)

스택(Stack) - 데이터를 일시적으로 저장하기 위해 사용하는 자료구조로, 데이터의 입력과 출력 순서는 후입선출(LIFO)이다. - java 프로그램에서 메서드를 호출하고 실행할 때, 프로그램 내부에서는

everysmallstep.tistory.com


  • 인덱스를 비교해가면서 연속되는 숫자를 배열(리스트)에 넣기

1. stack을 활용한 풀이

import java.util.*;

public class Solution {
    public int[] solution(int []arr) {
        Stack<Integer> stack = new Stack<>();
        stack.push(arr[0]);
        
        for(int i=1;i<arr.length;i++) {
            if(arr[i-1] != arr[i]) stack.push(arr[i]);
        }
        
        int[] answer = new int[stack.size()];
        for(int i=0;i<stack.size();i++) {
            answer[i] = stack.get(i).intValue();
        }
        return answer;
    }
}

 

  • stack에 첫 번째 값을 넣고, for문에서는 첫 번째 인덱스와 그 다음 인덱스를 비교하고 같지 않으면 stack에다가 넣기 
  • stack.get(i).intValue()로 stack 형을 int형으로 바꿀 수 있다..!

2.  ArrayList를 이용한 풀이

import java.util.*;

public class Solution {
    public int[] solution(int []arr) {
        ArrayList<Integer> list = new ArrayList<>();
        
        for(int i=0;i<arr.length-1;i++) {
            if(arr[i] != arr[i+1]) list.add(arr[i]);
        }
        list.add(arr[arr.length-1]);
        
        int[] answer = new int[list.size()];
        for(int i=0;i<list.size();i++) {
            answer[i] = list.get(i).intValue();
        }
        return answer;
    }
}

 

  • stack을 이용한 풀이에서 for문의 i가 1로 시작해서 크기는 그대로 하고, if문의 arr[i-1] 와 arr[i]를 비교했다면, arraylist 풀이에서는 약간 다르게 하고 싶어서 for문의 i가 0으로 시작해서 크기는 arr[i]와 arr[i+1] 를 비교했다. 
  • 그래서 이 풀이에서는 마지막 요소가 들어가지지 않기 때문에 list.add(arr[arr.length-1])를 했다.
  • 아래 arraylist => int[ ]로 변환하는 것은 stack과 동일하다!
  • 시간은 stack보다 arraylist가 좀 더 빠르다..! contains 같은 메서드 쓸 거 아니면 arrayList로 해도 상관없을 것 같다.

+ ArrayList와 향상된 for문

import java.util.*;

public class Solution {
    public int[] solution(int []arr) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        
        int preNum = 10;    
        for(int num : arr) {
            if(preNum != num) list.add(num);
            preNum = num;
        }       
        int[] answer = new int[list.size()];
        for(int i=0; i<answer.length; i++) {
            answer[i] = list.get(i).intValue();
        }
        return answer;
    }
}

 

  • 제한 사항에 배열 arr의 원소의 크기가 0보다 크거나 같고 9보다 작거나 작은 정수라고 되어있기 때문에 preNum을 10으로 제한을 두고 할 수 있다..! (제한 사항 잘 읽어보기..!)
  • preNum = num을 안하게 되면 계속 list에 추가 되게 되기 때문에 num을 preNum에 넣어주기!

stack, hashset, arrayList계속 쓰다보니까.. 일반 배열보다 훨씬 편한것 같다..!

'algorithm > Programmers' 카테고리의 다른 글

[JAVA] 올바른 괄호  (0) 2023.03.31
[JAVA] 기능 개발  (0) 2023.03.30
[JAVA] 전화번호 목록  (0) 2023.03.29
[JAVA] 완주하지 못한 선수  (0) 2023.03.28
[JAVA] 폰켓몬  (0) 2023.03.28