민수님의 면접 결과

30

총점

3

질문 수

0

좋아요

15

조회수

종합 평가

스택 자료구조를 활용한 괄호 매칭 알고리즘의 핵심 로직을 정확히 구현하셨고, map을 사용해 괄호 쌍을 효율적으로 관리하는 아이디어가 좋습니다. 엣지 케이스 처리, 특히 빈 스택에서의 접근을 방지하는 예외 처리 로직을 보완하실 필요가 있습니다. 기본 알고리즘 구현 능력은 우수하시니, 다양한 예외 상황과 경계 조건을 미리 고려하는 방어적 프로그래밍 습관을 기르시면 좋겠습니다.

질문별 상세 분석

커뮤니티 공개
Q1B

Valid Parentheses (유효한 괄호) `(`, `)`, `{`, `}`, `[`, `]` 문자로만 이루어진 문자열 `s` 가 주어집니다. 다음 조건을 **모두** 만족하면 유효한 문자열로 판단합니다. 1. 열린 괄호는 같은 종류의 괄호로 닫혀야 합니다. 2. 열린 괄호는 올바른 순서로 닫혀야 합니다. 3. 모든 닫는 괄호는 대응하는 같은 종류의 여는 괄호를 가져야 합니다. 문자열이 유효한지 판별하는 함수를 작성하세요. 빈 문자열은 유효한 것으로 간주합니다. ## 예시 1 ``` 입력: s = "()" 출력: true ``` ## 예시 2 ``` 입력: s = "()[]{}" 출력: true ``` ## 예시 3 ``` 입력: s = "(]" 출력: false 설명: 여는 괄호 ( 가 다른 종류의 괄호 ] 로 닫혔습니다. ``` ## 예시 4 ``` 입력: s = "([)]" 출력: false 설명: 괄호가 올바른 순서로 닫히지 않았습니다. ``` ## 예시 5 ``` 입력: s = "{[]}" 출력: true ``` ## 제약 조건 - 1 <= s.length <= 10^4 - `s` 는 괄호 문자 `()[]{}` 로만 구성됩니다. ## Follow-up - 어떤 자료구조를 사용했고, 그 자료구조를 선택한 이유는 무엇인가요? - 입력이 닫는 괄호로 시작하거나 여는 괄호가 끝까지 닫히지 않는 경우 등 엣지 케이스는 어떻게 처리했나요?

응답 내용

#include<bits/stdc++.h>
using namespace std;

int main() {
  string s; cin >> s;
  string t;
  map<char,char> mp;
  string z = "(){}[]";
  for (int i=0; i<6; i+=2) {
    mp[z[i+1]] = z[i];
  }
  for (auto x : s) {
    if (x == '(' || x == '{' || x == '[') {
      t += x;
    }
    else {
      if (t.back() == mp[x]) t.pop_back();
      else {
        cout << "false" << endl;
        return 0;
      }
    }
  }
  if (t.empty()) cout << "true" << endl;
  else cout << "false" << endl;
}

AI 피드백

스택을 문자열로 구현하여 괄호 매칭 문제를 정확하게 해결하신 점이 인상적입니다. 맵을 활용해 닫는 괄호와 여는 괄호의 대응 관계를 깔끔하게 처리하셨고, 전체적인 로직도 올바르게 구현되었습니다. 다만 한 가지 중요한 엣지 케이스가 있는데, 스택이 비어있을 때 `t.back()`을 호출하면 런타임 에러가 발생할 수 있습니다. 닫는 괄호를 처리하기 전에 `t.empty()` 체크를 추가하시면 더욱 안전한 코드가 될 것입니다. 또한 실제 함수로 구현하여 반환값을 boolean으로 처리하면 문제 요구사항에 더 부합할 것 같습니다.

Q2B

닫는 괄호로 시작하는 입력에서 t.back()을 호출할 때 어떤 문제가 발생할 수 있나요?

응답 내용

t could be empty(). i should've handle the exception case.

#include<bits/stdc++.h>
using namespace std;

int main() {
  string s; cin >> s;
  string t;
  map<char,char> mp;
  string z = "(){}[]";
  for (int i=0; i<6; i+=2) {
    mp[z[i+1]] = z[i];
  }
  for (auto x : s) {
    if (x == '(' || x == '{' || x == '[') {
      t += x;
    }
    else {
      if (t.back() == mp[x]) t.pop_back();
      else {
        cout << "false" << endl;
        return 0;
      }
    }
  }
  if (t.empty()) cout << "true" << endl;
  else cout << "false" << endl;
}

AI 피드백

문제점을 정확히 파악하셨지만 코드에서는 아직 해결되지 않았습니다. 여전히 `t.back()`을 호출하기 전에 `t.empty()` 체크가 없어서 빈 스택에서 닫는 괄호가 나올 때 런타임 에러가 발생할 수 있습니다. 올바른 해결책은 `else` 블록을 `else if (!t.empty() && t.back() == mp[x])` 형태로 수정하고, 그렇지 않은 경우 false를 반환하는 것입니다. 전체적인 스택 기반 접근법과 매핑 테이블 사용은 매우 적절하며, 이 작은 수정만으로 완벽한 솔루션이 될 것입니다.

Q3B

t가 비어있을 때 t.back() 호출을 방지하려면 코드를 어떻게 수정해야 하나요?

응답 내용

몰라여

AI 피드백

스택을 이용한 괄호 매칭의 핵심 아이디어는 정확히 이해하고 계시고, map을 활용해 닫는 괄호와 여는 괄호를 매핑하는 방식도 깔끔합니다. 하지만 현재 코드에서는 스택(문자열 t)이 비어있을 때 `t.back()`을 호출하면 런타임 에러가 발생합니다. 이를 해결하려면 닫는 괄호를 만났을 때 `if (!t.empty() && t.back() == mp[x])` 처럼 스택이 비어있지 않은지 먼저 확인해야 합니다. 스택이 비어있다면 바로 false를 반환하면 됩니다. 알고리즘의 기본 구조는 훌륭하니 예외 상황 처리만 보완하시면 완벽한 해답이 될 것입니다.

커뮤니티 공유 안내

• 이 결과는 AI가 분석한 내용이며, 학습 목적으로 커뮤니티에 공유됩니다.

• 좋아요를 눌러 유용한 답변에 반응을 남겨보세요.

• 개인정보는 포함되지 않으며, 면접 연습 개선을 위한 참고 자료로 활용됩니다.