프로그래머스 문제풀이/알고리즘 (JAVA)

[JAVA] 프로그래머스 알고리즘 문제풀이 - Level 2 (19~20번 문제풀이) / Level 0 (224/224) / Level 1 (77/77)

남건욱 2023. 12. 29. 10:09

목차

    반응형
    19. 괄호 회전하기

    문제

    import java.util.*;
    
    class Solution {
        public int solution(String s) {
            int answer = 0;
            
            List<Character> list = new ArrayList<>();
            for(char c : s.toCharArray()){
                list.add(c);
            }
            
            for(int i=0; i<list.size(); i++){
                Collections.rotate(list, -1);
                
                if(isTrue(list)){
                    answer++;
                }
            }
            
            return answer;
        }
        
        private boolean isTrue(List<Character> list){
            Stack<Character> stack = new Stack<>();
            
            for(char i : list){
                if(i == '(' || i == '[' || i == '{'){
                    stack.push(i);
                } else{
                    if(stack.isEmpty()){
                        return false;
                    }
                    
                    char j = stack.pop();
                    if((i == ')' && j != '(') ||
                        (i == ']' && j != '[') ||
                        (i == '}' && j != '{')){
                        return false;
                    }
                }
            }
            
            return stack.isEmpty();
        }
        
    }

    <작성한 코드>

    메서드 두 개를 작성했다. 첫 번째 메서드에서는 String 형식의 s를 char형으로 변환해서 list에 담아줬다. 그 뒤 forEach문을 사용해 list의 길이만큼 반복시켰고 내부에서는 Collections.rotate(list, -1)을 사용해서 리스트를 왼쪽으로 한 칸씩 이동시켰다. 그 뒤 isTrue(list)를 사용해서 list를 isTrue에 넘긴 뒤 그 값이 true라면 answer에 1을 증가하도록 했다.

     

    ifTrue 메서드에서는 list를 매개변수로 받은뒤 스택 하나를 만들어줬다. 그 뒤 forEach문을 사용해서 i가 (, [, {중 하나이면 stack에 넣었다. 만약 이 셋 중 하나가 아닌데 스택이 비어있다면 바로 false를 반환했다. 비어있지 않다면 변수 j에 stack의 제일 위의 값을 가져온다. 그 뒤 if문으로 조건을 체크했을 때 꺼내온 값이 맞는 짝이 아니라면 false를 반환했다. 마지막에는 stack에 값이 남아있는지 체크하고 남아있다면 false, 비어있다면 true를 반환해 줬다.

     

     

     

     

    20. n^2 배열 자르기

    문제

    import java.util.*;
    
    class Solution {
        public int[] solution(int n, long left, long right) {
            int[] answer = new int[(int)(right-left)+1];
            List<Integer> list = new ArrayList<>();
            
            for(long i=left; i<=right; i++){
                list.add((int)Math.max(i/n, i%n) + 1);
            }
            
            for(int i=0; i<answer.length; i++){
                answer[i] = list.get(i);
            }
            
            return answer;
        }
    }

    <작성한 코드>

    answer의 길이는 right-left를 해준 뒤 1을 더해줬다. left, right가 long형이기 때문에 (int)를 사용해서 정수형으로 변환해 사용했다. 그 뒤 list하나를 만들어주고 for문을 통해서 i는 left부터 right까지 반복시켰다. 내부에서는 list에 값을 추가한다. Math.max를 사용해 i/n, i% n 중 큰 값을 찾아 +1을 해서 넣어준다. 행과 열중 큰 값을 넣어주면 되기 때문에 i/n, i% n을 사용했다. 그 뒤 list의 값을 answer에 넣어주고 반환해 줬다.

    반응형
    프로필사진

    남건욱's 공부기록