minghxx.blog
  • [프로그래머스 / 자바] 빈 배열에 추가, 삭제하기
    2023년 11월 22일 09시 45분 57초에 업로드 된 글입니다.
    작성자: 민발자
    728x90

    문제

    아무 원소도 들어있지 않은 빈 배열 X가 있습니다. 길이가 같은 정수 배열 arr과 boolean 배열 flag가 매개변수로 주어질 때, flag를 차례대로 순회하며 flag[i]가 true라면 X의 뒤에 arr[i]를 arr[i] × 2 번 추가하고, flag[i]가 false라면 X에서 마지막 arr[i]개의 원소를 제거한 뒤 X를 return 하는 solution 함수를 작성해 주세요.

    풀이

    import java.util.*;
    class Solution {
        public int[] solution(int[] arr, boolean[] flag) {
            int idx = 0;
            List<Integer> array = new ArrayList<>();
            for(boolean f : flag){
                if(f) {
                    for (int i = 0; i < arr[idx]*2; i++) {
                        array.add(arr[idx]);
                    }
                } else {
                    for (int i = 0; i < arr[idx]; i++) {
                        array.remove(array.size()-1);
                    }
                }
                idx++;
            }
            int[] answer = new int[array.size()];
            for(int i = 0; i < array.size(); i++){
                answer[i] = array.get(i);
            }
            return answer;
        }
    }

    flag가 true면 arr[i]를 단순히 *2번 추가하는 문제로 해석해서 헛짓 좀 했다🥹

    false인 경우 arr[i]번 만큼 원소를 삭제해야 하기 때문에 else 넣어줌

    import java.util.*;
    class Solution {
        public int[] solution(int[] arr, boolean[] flag) {
            ArrayList<Integer> list = new ArrayList<>();
            for (int i = 0; i < arr.length; i++) {
                if (flag[i]) {
                    for (int j = 0; j < arr[i] * 2; j++) {
                        list.add(arr[i]);
                    }
                } else {
                    for (int j = 0; j < arr[i]; j++) {
                        list.remove(list.size()- 1);
                    }
                }
            }
    
            int[] answer = new int[list.size()];
    
            for (int i = 0; i < list.size(); i++) {
                answer[i] = list.get(i);
            }
            return answer;
        }
    }

    나는 flag를 하나씩 가져와서 arr를 다루기 위한 idx 변수가 따로 필요했는데 이것도 그냥 단순 for문으로 가져오면 속도도 빠르고 메모리도 덜 쓴다

     

    참고할만한 다른 사람 풀이

    import java.util.*;
    
    class Solution {
        public int[] solution(int[] arr, boolean[] flag) {
            Stack<Integer> stack = new Stack<>();
    
            for (int i = 0; i < flag.length; i++) {
                if (flag[i]) {
                    for (int j = 0; j < arr[i] * 2; j++) stack.push(arr[i]);
                } else {
                    for (int j = 0; j < arr[i]; j++) stack.pop();
                }
            }
    
            return stack.stream().mapToInt(Integer::intValue).toArray();
        }
    }

    리스트 대신 스택으로 푸는 방법

     

     

     

     

     

    728x90
    댓글