inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

2 - O 4949번 문제..

280

단순한 사막여우

작성한 질문수 0

0

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

string s;

string checker(string s) {
  stack<char> st;
  for (char c: s) {
    if (c == '(' || c == '[') st.push(c);
    else {
      if (c == ')' && st.top() == '(' ) st.pop();
      else if (c == ']' && st.top() == '[') st.pop();
    }
  }
  return st.empty() ? "yes" : "no";
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL); cout.tie(NULL);

  while(true) {
    getline(cin, s);
    if (s == ".") break;
    cout << checker(s) << '\n';
  }
  return 0;
}

제가 작성한 코드입니다.

제출해보면 20퍼센트에서 런타임 에러가 발생하고, 테스트케이스로 ][, )( 처럼 반대로된 괄호를 추가하면 아무런 문자열도 출력이 되지 않습니다.

도대체 어디가 잘못된건지 잘 모르겠습니다..

아무리 살펴봐도 작동이 안되는게 이해가 되지않아 질문드립니다!

C++ 코테 준비 같이 해요!

답변 2

1

oort_cloud98

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

string s;

string checker(string s) {
  stack<char> st;
  for (char c: s) {
    if (c == '(' || c == '[') st.push(c);
    else { // )(, ][ 테스트 입력 시 스택에 저장되어있는 값이 없어서 에러
      if (c == ')' && st.top() == '(' ) st.pop();
      else if (c == ']' && st.top() == '[') st.pop();
    }
  }
  return st.empty() ? "yes" : "no";
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL); cout.tie(NULL);

  while(true) {
    getline(cin, s);
    if (s == ".") break;
    cout << checker(s) << '\n'; // getline()메서드는 \n 을 구분자로 문자를 입력받아 늦게 출력됨 endl 로 변경시 제대로 출력 
  }
  return 0;
}

주석에 적어보았습니답.

0

단순한 사막여우

감사합니다! 덕분에 해결했습니다!

0

창신동 장첸

주석 설명중에 endl; 로 변경해야 한다는 설명이 잘 이해되지 않습니다.

좀 더 자세한 설명을 알 수 있을까요?

0

oort_cloud98

다시 보니 설명을 잘못 적었네요.
해당 코드는 사전에 cin.tie(null), cout.tie(null)을 선언해 순서에 관계없이 입출력이 이뤄지게 됐습니다. 해당 구문을 적지 않았다면, 입력, 출력문이 호출 될 때 상대의 버퍼를 비워버려서 구문을 적은 순서대로 실행하게 됩니다.

처음처럼 "\n" 개행 문자를 사용해 출력하는 경우 반복문이 다시 돌아 입력문을 먼저 실행하는 오류가 발생합니다.
endl 키워드를 사용하라는 이유는 endl 은 개행 문자를 넣어준 후 버퍼를 지우라는 기능이 있습니다.
프로그램은 버퍼를 비워야 하기 때문에 앞서 적은 출력문을 먼저 출력 후 다음 구문으로 나아가게 됩니다. 즉, 강제적으로 순서를 정해준 것입니다.
이 출력 먼저하고 다음으로 가 하는 식으로요.
아니 그럼 tie(null) 이거 위험한거 아니냐 사용자가 원할 때 입출력이 안되면 안되지 않냐 하실 수도 있지만, 코딩 테스트는 정확도와 속도가 생명입니다.

반복적인 입출력을 실행 할 때 더욱 효과적입니다.
endl 을 사용하지 않는 방법으로는 cout.flush(); 구문을 반복문 마지막에 적어주시면 될 것입니답

0

큰돌

우와... 환상의 하모니.. ㅎㅎ oort_cloud98님이 잘 답변해주셨네요. ㅎㅎ 감사합니다.

1-E질문입니다!

0

528

2

3-L 틀린 부분 피드백 부탁드립니다.

0

833

2

1-A문제 순열재귀함수 질문입니다.

0

396

1

1-A 일곱난쟁이문제입니다

0

463

1

문제 풀 때 방향성에 대해

0

807

1

맥에서 vs code로 실행 관련 질문입니다

0

528

1

17071번 메모리 초과

0

388

1

1-C질문입니다!

0

427

2

2-B BFS 시간초과질문

0

636

2

1-O 13번 라인

0

445

1

6-J 놀이공원 문제 질문

0

385

1

구현관련 질문

0

486

1

강의 교안

0

321

1

실력을 더 올리고나서 강의를 보는 것이 맞을까요?

0

549

1

안녕하세요! 재귀함수에 관해서 질문드립니다

0

538

1

1-K

0

480

2

3-G번 질문있습니다.

1

478

3

3-C 실행 시간 질문드립니다.

0

498

1

4-A 문제 풀이 질문있습니다.

0

598

2

비트마스킹 연산자 "1의 보수" 영문 표기법

0

441

1

격자탐색 문제에서 BFS 시간복잡도 질문드립니다.

0

343

1

3-O go 함수 질문 드립니다.

1

450

2

4-A 출력 질문

0

306

1

1주차 1-O 질문드립니다

0

261

1