프로그래머스 문제풀이/알고리즘 (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 공부기록