23년 5월 4일 [알고리즘 - 자료구조]

sua·2023년 5월 4일
0

알고리즘 가보자고

목록 보기
16/101

프로그래머스 같은 숫자는 싫어

문제

나의 풀이

import java.util.*;

class Solution {
    public int[] solution(int []arr) {
        int[] answer;
        
        Stack<Integer> stack = new Stack<>();
        for(int i = 0; i < arr.length; i++) {
            if(stack.isEmpty()) {
                stack.push(arr[i]);
            } else {
                if(stack.peek() != arr[i]) {
                    stack.push(arr[i]);
                }
            }
        }
        
        answer = new int[stack.size()];
        int index = 0;
        for(int num : stack) {
            answer[index] = num;
            index++;
        }

        return answer;
    }
}

숫자를 저장할 스택을 생성한다. 그런 다음 배열을 for문을 돌려서 스택이 비어있는 경우에는 배열의 원소를 push해주고 비어있지 않는데 스택의 최상단에 있는 값과 배열의 i번째 원소가 같지 않다면 연속되는 숫자가 아니기 때문에 push 해준다.
그런 다음 answer에 stack에 있는 값을 넣어주고 리턴 해주면 된다.

결과



프로그래머스 기능개발

문제

나의 풀이

import java.util.*;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        List<Integer> answer = new ArrayList<Integer>();

        for(int i = 0; i < progresses.length; i++) {
            // 한 개 기능을 개발하는데 필요한 날짜 계산
            double days = (100 - progresses[i]) / (double) speeds[i];
            int day = (int) Math.ceil(days);

            // 함께 배포할 기능 index 찾기
            int j;
            for(j = i + 1; j < progresses.length; j++) {
                if(progresses[j] + day * speeds[j] < 100) { // 배포 불가능한 경우
                    break;
                }
            }

            // 이번에 배포할 기능의 개수 추가
            answer.add(j - i);
            i = j - 1; // 다음 단계에서 i++ 되기 때문에 여기서 -1 해줌 -> i = j로 초기화 되는 것과 같음
        }

        // ArrayList를 array 형태로 변경하여 반환
        return answer.stream().mapToInt(i -> i.intValue()).toArray();
    }
}

작업의 진도를 for문을 돌려서 해당 기능을 개발하는 데 필요한 날짜를 계산해준다. 그런 다음 이 기능이 배포될 때 함께 배포 가능한 기능의 index를 이중for문을 돌려서 진도가 100이 되지 않을 때 까지 j를 증가시켜준다. 그런 다음 answer에 j에서 i를 뺀 값을 추가시킨다. 이것이 이번에 배포할 기능의 개수를 구한 것이다.
마지막에는 answer를 array로 변경시켜서 리턴해주면 된다.

결과



프로그래머스 올바른 괄호

문제

나의 풀이

import java.util.*;

class Solution {
    boolean solution(String s) {
        boolean answer = true;

        Stack<Character> stack = new Stack<>();
        for(char c : s.toCharArray()) {
            if(c == '(') {
                stack.push(c);
            } else {
                if(stack.isEmpty()) {
                    answer = false;
                    break;
                } 
                stack.pop();
            }
        }
        
        if(!stack.isEmpty()) {
            answer = false;
        }

        return answer;
    }
}

여는 괄호를 넣어줄 스택을 생성한다.
문자열에 대해 for문을 돌리면서 문자가 여는 괄호인 경우 스택에 push해주고 닫는 괄호인데 스택이 비어있는 경우는 잘못된 괄호이므로 answer에 false를 할당하고 break 해준다. 그렇지 않은 경우는 그냥 스택을 pop 해서 최상단의 요소를 빼낸다. for문을 모두 돌고나면 정상적인 괄호라면 스택이 비어있어야 하는데 그렇지 않다면 잘못된 괄호이므로 answer에 false를 할당해준다. 마지막에는 answer를 리턴해주면 된다.

결과


profile
가보자고

0개의 댓글