본문 바로가기
Blog/Study

2회 테코테코

by 코젼 2024. 9. 22.
728x90
반응형

 

[2024.09.22] 10:00 ~ 12:00


목차


    요약

    - stack 자료 구조의 push, pop 메서드를 이용해서 문제를 해결할 수 있다.

    - deque 자료 구조를 이용해서 stack, queue 를 구현할 수 있다.


    스택

    첫 번째 문제

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

     

    프로그래머스

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

    programmers.co.kr

    접근 방법

    1. 열린 괄호일 경우, stack 에 push 한다.

    2. 닫힌 괄호일 경우, stack 에 있는 마지막 값을(peek) pop 해서 올바른 괄호로 판단한다.

    3. stack 이 최종적으로 비어있을 경우 올바른 괄호고, 비어있지 않을 경우 올바르지 않은 괄호다.

    고민 포인트

    - 괄호를 짝지어서 올바른 괄호임을 확인하는 것이 키 포인트

    최종 코드 및 회고

    - stack 문제의 가장 기초적인 문제라고 생각하고, 쉽게 접근할 수 있는 문제였다고 생각한다.

    import java.util.*;
    
    class Solution {
        boolean solution(String s) {
            
            Stack<Character> stack = new Stack<>();
            
            for (char b : s.toCharArray()) {
                if (b == '(') {
                    stack.push(b);
                } else {
                    //비어있는 경우 pop 할 수 없다.
                    if (stack.isEmpty()) return false;
                    stack.pop();
                }
            }
            return stack.isEmpty();
        }
    }

    두 번째 문제

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

     

    프로그래머스

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

    programmers.co.kr

    접근 방법

    1. deque 를 사용해서 괄호 데이터를 저장한다.

    2. 주어진 괄호 데이터 길이만큼(s.length()) 반복문으로 접근해서 올바른 괄호인지 확인한다.

    3. deque 에 있는 데이터를 토대로, stack 을 이용해서 짝지어지지 않는 괄호인 경우 push 하고, 짝지어지는 경우 pop 한다.

    3-1. 마지막으로 stack 이 비어있는 경우, 최종 count(올바른 괄호 개수) 를 증가 시킨다.

    4. 주어진 괄호를 회전 시킨다. (계속 반복하면서 올바른 괄호 개수를 확인함...)

    고민 포인트

    - 어떤 자료 구조를 사용해서 각 괄호 데이터에 접근할 것인가?

    - 얼마나 반복하면서 확인할 것인가?

    - 회전은 언제 진행해야 하고, count 개수는 언제 증가 시켜야 하는가?

    최종 코드 및 회고

    - Map 으로도 데이터를 저장해 보고, deque + stack 조합으로 문제를 풀고자 했으나 일부만 정답되는 문제가 발생했다.

    - 내가 생각했던 접근 방법과 가장 유사한 답안을 참고하여 코드를 개선하였다.

    - '}]()[{' 데이터의 경우 회전했을 때, '()[{}]', '[{}]()' 데이터로 총 2개의 올바른 괄호 개수를 얻을 수 있다.

    import java.util.*;
    
    class Solution {
        public int solution(String s) {
            //deque 초기 값 세팅
            Deque<Character> deque = new LinkedList<>();
            for (char c : s.toCharArray()) deque.add(c);
            
            int count = 0;
            for (int i = 0; i < s.length(); i++) {
                //stack이 비어있는 경우 올바른 괄호 문자열 개수 추가
                if (isCorrect(deque)) count++;
                deque.addLast(deque.removeFirst());
            }
            return count;
        }
        
        private boolean isCorrect(Deque<Character> deque) {
            
            Stack<Character> stack = new Stack<>();    
            for (char d : deque) {
                //stack이 비어있는 경우, 값을 넣는다.
                if (stack.isEmpty()) stack.push(d);
                //stack에 값이 있는 경우
                else {
                    //올바른 괄호 문자열인지 확인한다.
                    if (stack.peek() == '(' && d == ')') stack.pop();
                    else if (stack.peek() == '[' && d == ']') stack.pop();
                    else if (stack.peek() == '{' && d == '}') stack.pop();
                    //일치하지 않으면 stack에 값을 넣는다.
                    else stack.push(d);
                }
            }
            return stack.isEmpty();
        }
    }
    728x90
    반응형

    'Blog > Study' 카테고리의 다른 글

    4회 테코테코  (0) 2024.10.06
    DDD 스터디 + a  (5) 2024.10.01
    3회 테코테코  (0) 2024.09.29
    1회 테코테코  (4) 2024.09.15

    댓글