알고리즘/항해99

99클럽 코테 스터디 4일차 TIL + 스택/큐(올바른 괄호)

IamBD 2024. 5. 23. 21:09

오늘의 과제

프로그래머스 Lv.2 스택/큐로 분류된 올바른 괄호 문제 입니다.

 

오늘도 이미 푼 기초적인 자료구조 문제입니다.

 

문제

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

 

프로그래머스

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

programmers.co.kr

 

 

중요한 만큼 이번에도 문제의 분류는 스택/큐입니다.

 

자료구조의 간단한 설명은 전날 문제 해설에 있으니 참고바랍니다.

 

전날 문제처럼 뭔가 상황이 있는것이 아닌 그저 괄호만 나오기 때문에 스택, 큐 중 어떤 것을

써야하는지 헷갈릴 수 있습니다.

 

이 부분은 그저 문제를 풀어보며 외워야 하는 유형이며 키워드는 "짝"입니다.

 

추후에는 오늘의 문제처럼 스택/큐와 같이 분류를 주지 않고 그저 문제만 나올텐데

지문에 짝을 짓는다 라는 말이 나오면 바로 스택을 떠올리셔야 합니다.

 

간단한 원리로는 스택은 후입선출의 구조이므로 자신의 짝을 만나기 전까지는 계속 쌓고,

자신의 짝을 만날때만 하나씩 내부를 비워주면 되기 때문입니다.

 

문제를 살펴보겠습니다.

 

 

이미 문제의 분류로 스택/큐가 주어지긴 했으나 지문에도 "짝지어졌다", "짝지어서"라는 말이 언급되고 있습니다.

 

위에 간단히 언급했으나 이 문제는 스택을 이용해 풀면 매우 간단하게 풀어낼 수 있습니다.

 

(의 짝을 만나려면 )를 찾아야 하고, )의 짝을 만나려면 반드시 앞에 (가 있어야 합니다.

 

(의 짝을 마나려면 )를 찾아야 하고

)를 찾을 때 까지 스택에 쌓는다.

 

 

)의 짝을 만나려면 반드시 앞에 (가 있어야 합니다.

)를 찾았으나 스택이 비어있거나 앞의 값이 (가 아니라면 짝이 아니다.

 

이전 문제에 비해 스택의 특성만 알면 간단히 해결할 수 있는 문제로

추가적인 설명은 코드 내 주석을 확인해주세요.

 

import java.util.*;

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

        // 1. (를 만나면 스택에 쌓는다
        // 2. )를 만나면 스택 내부는 무조건 (이다. 비어있따면 false를 return 한다.
        // 3. 남아있는게 있다면 짝을 찾지 못했다.
        Stack<Character> st = new Stack<>();
        for (char c : s.toCharArray()) {
            if (c == '(') {
                st.add(c);
                continue;
            }
            // 짝이 맞지 않는다.
            if (st.isEmpty()) return false;
            st.pop();
        }
        
        // 모두 꺼내지 못했다.
        return st.isEmpty();
    }
}

 

 

물론 워낙 간단해 스택 없이도 쉽게 풀 수 있습니다 :)

import java.util.*;

class Solution {
    boolean solution(String s) {
        int cnt = 0;
        for (char c : s.toCharArray()) {
            cnt += c == '(' ? 1 : -1;
            if (cnt < 0) return false;
        }
        return cnt == 0;
    }
}

 

배운점

사실 스택에 대한 아주 간단한 이해와 문제 유형에 대한 정보만 있으면 아주 간단하게 풀 수 있는 문제였습니다.

 

따라서 문제에 대한 풀이는 간략하게 남기고 업무상의 회고를 남기고자 합니다.

 

저는 3년차 개발자로 여지껏 업무 수행시 팀으로 업무를 수행하더라도 전형적인 실무자의 입장이었습니다.

"이해시키고, 지시하고, 확인하는 등 스트레스 받을 바엔 내가 하지 뭐"

 

말단 사원임에도 불구하고 평소엔 군대처럼 깍듯하되, 업무엔 직급이 없다는 마인드로 모든 업무에 오너쉽을

가지고 일을 하다보니 긍정적인 방향으로는 사내 인정과 파격적인 연봉 협상도 하게 되었습니다.

 

하지만 치명적인 단점이 있으니...

 

지칩니다.

 

업무 시간 내내 유튜브만 보고, 휴대폰만 보고 있는 선배들을 보며 가슴 한 편에 점점 열정이 식어갔고

"나만 일하나?"라는 생각이 마음을 뒤덮기 시작했습니다.

 

그 누구도 프로젝트 성공을 위해 주도적, 능동적으로 생각하지 않고 행동하지 않습니다.

 

데드라인이 다가올수록 혼자만 초조하고 어깨에 짐은 무거워지며 사람들에게는

스스로도 모르는 사이 예민한 사람이 되어 있었습니다.

 

이러한 상황이 팀장님의 눈에는 보였는지 올해 초부터는 직접 하지말고 지시하고, 확인해라라는 미션이 주어졌습니다.

 

처음엔 어색하기도 하고 상위 직급에게 지시하는건 사실 군에서 오래 있던 제게는 쉽지 않은 일이었습니다.

 

어찌저찌 사내 작은 프로젝트를 진행하며 예행 연습을 마친 후 팀원 두 명을 데리고 실제 프로젝트에 투입되습니다.

 

주어진 역할은 현장 대리인 + PL로 분석 및 설계, 일정 조율, 의사소통 등 개발과 무관한 업무를 하게 되었습니다.

 

물론 복잡하거나, 난이도가 있어 보이는 일은 빠르게 개발하고 쉬워 보이는 일 위주로 지시하기 시작했는데

이전의 원맨쇼와는 차원이 다른 스트레스가 다가오기 시작합니다.

 

A를 하라는 지시에는 B에 대한 질문이 오고, 불명확한 지시로 인한 커뮤니케이션 오류라 생각해

하나하나 이해했는지 여부를 확인하며 마이크로 매니징을 했음에도 팀원의 오출력은 반복되었습니다.

 

그러던 와중 오늘 개발과 관련없는 그저 문맥 자체를 읽지 못하는 팀원을 보며 참을성은 한계에 이르렀고,

결국 관리자의 역할이 서툴다는 것을 증명하듯 감정 섞어 화냈습니다.

 

사람마다 그릇은 다르겠으나 나는 안그래야지 하던 행동을 스스로 한 순간 제 그릇이 너무나도 작다고 느껴졌습니다.

 

잠시 자리를 이탈하여 감정을 추스른 뒤 팀원에게 가 사과하고 다시 이어서 설명하며 상황은 일단락 되었습니다.

 

저 같은 주니어도 직급을 떠나 언젠간 정식으로 팀장과 같이 관리자의 직책이 주어지게 됩니다.

 

대다수의 개발자는 개발만 하다 은퇴하고 싶어 하겠지만 현실은 그렇지 못하니까요.

 

당장은 이직에 대한 마음이 커서 그런지 오직 하드 스킬에만 목 메달고 있었는데

오늘의 일을 통해 많은 IT 회사들이 왜 하드 스킬만큼 소프트 스킬에 대한 검증도 진행하는지 알 수 있었습니다.

 

소 잃고 외양간이라도 고치는 마음으로 다시 한 번 다짐합니다.

 

 

오늘의 한줄평

나는 돈 받고 일하는 프로다. 기쁨, 감사, 행복 외 감정을 드러내지 말자.