코딩테스트/JAVA

[JAVA/프로그래머스] 배열 만들기 6

할루솔이 2023. 7. 30. 16:58
반응형

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

 

프로그래머스

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

programmers.co.kr

 

문제 설명
0과 1로만 이루어진 정수 배열 arr가 주어집니다. arr를 이용해 새로운 배열 stk을 만드려고 합니다.

i의 초기값을 0으로 설정하고 i가 arr의 길이보다 작으면 다음을 반복합니다.

만약 stk이 빈 배열이라면 arr[i]를 stk에 추가하고 i에 1을 더합니다.
stk에 원소가 있고, stk의 마지막 원소가 arr[i]와 같으면 stk의 마지막 원소를 stk에서 제거하고 i에 1을 더합니다.
stk에 원소가 있는데 stk의 마지막 원소가 arr[i]와 다르면 stk의 맨 마지막에 arr[i]를 추가하고 i에 1을 더합니다.
위 작업을 마친 후 만들어진 stk을 return 하는 solution 함수를 완성해 주세요.

단, 만약 빈 배열을 return 해야한다면 [-1]을 return 합니다.

제한사항
1 ≤ arr의 길이 ≤ 1,000,000
arr의 원소는 0 또는 1 입니다.


입출력 예


입출력 예 설명
입출력 예 #1
각 작업을 마친 후에 배열의 변화를 나타내면 다음 표와 같습니다.
idx  arr[idx]  stk
0     0           []
1     1           [0]
2     1           [0, 1]
3     1           [0]
4     0           [0, 1]
5     -            [0, 1, 0]
따라서 [0, 1, 0]을 return 합니다.


입출력 예 #2
각 작업을 마친 후에 배열의 변화를 나타내면 다음 표와 같습니다.
idx  arr[idx]  stk
0     0           []
1     1           [0]
2     0           [0, 1]
3     1           [0, 1, 0]
4     0           [0, 1, 0, 1]
5     -            [0, 1, 0, 1, 0]
따라서 [0, 1, 0, 1, 0]을 return 합니다.


입출력 예 #3
각 작업을 마친 후에 배열의 변화를 나타내면 다음 표와 같습니다.
idx  arr[idx]  stk
0     0           []
1     1           [0]
2     1           [0, 1]
3     0           [0]
4     -            []
마지막에 빈 배열이 되었으므로 [-1]을 return 합니다.


import java.util.*;

class Solution {
    public int[] solution(int[] arr) {
        int[] answer;
        ArrayList<Integer> stk = new ArrayList<>();

        for (int i = 0; i < arr.length; i++) {
            if (stk.size() == 0) {
                stk.add(arr[i]);
            }else if (stk.get(stk.size() - 1) == arr[i]) {
                stk.remove(stk.size() - 1);
            }else if (stk.get(stk.size() - 1) != arr[i]) {
                stk.add(arr[i]);
            }
        }

        if (stk.size() == 0) {
            answer = new int[]{-1};
            return answer;
        } else {
            answer = new int[stk.size()];
            for (int j = 0; j < stk.size(); j++) {
                answer[j] = stk.get(j);
            }
            
            return answer;
        }
    }
}

 

stk는 값을 추가했다가 삭제했다가 반복해야 하니 ArrayList로 생성해 주었다.

조건은 

1. stk 길이가 0일 때

2. str 마지막 원소와 arr[i]가 같을 때

3. str 마지막 원소와 arr[i]가 다를 때

이 세 가지 조건에 맞춰서 조건문을 작성했다.

 

만약, for문이 아니라 while문을 사용했다면 별도로 int i=0; 이렇게 초기화해주고

각 조건마다 i++; 를 넣어주었을 텐데 for문은 증감식이 있으니 생략했다.

 

모든 작업이 끝나면 다시 answer배열에 넣어주어야 하니 for문을 하나 더 작성했고

길이가 0일 때는 -1을 리턴, 아닐 땐 값을 answer에 하나씩 넣어주어 리턴했다.

 

 

 

반응형