강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

혜민님의 프로필 이미지
혜민

작성한 질문수

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

1-G

1-G 질문이 있습니다.

작성

·

96

0

제가 처음 작성했던 코드는 다음과 같습니다.

1번 코드 (처음 작성한 코드)

http://boj.kr/a88f71f09ca849eab6009b62163b7a56


2번 코드 (substr 활용한 코드)

http://boj.kr/589098635bfd4acb8726f8a5cbc18157


선생님 풀이를 보고 substr을 활용해서 작성해 봤을 때, 사이즈 체크 조건문에 대해 질문이 있어서 글 남깁니다.

 

1번 코드에서는 사이즈 체크하는 조건문과 패턴을 확인하는 조건문을 같은 시점에 비교해도 정답이 나왔습니다.

 

하지만 2번 코드에서는 사이즈 체크를 먼저하고 -> 그 이후에 사이즈 조건을 만족할 때 패턴을 비교하는 코드를 넣어야만 올바른 답이 도출됩니다.

이게 왜 차이가 나는것인지 설명해주시면 감사하겠습니다!

답변 2

0

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요 혜민님 ㅎㅎ

두 코드 다

    if (prefix.size() + suffix.size() > f.size()) {
  for (auto f : fn) {

    if (splits[0].size() + splits[1].size() > f.size()) { 

이런식으로 사이즈 체킹을 먼저 하는데요. ㅎㅎ

(1번코드도 사이즈체킹 하고 -> 같음과 다름을 판단합니다.)

 

혹시 다른 부분이 질문이실까요?

감사합니다.

혜민님의 프로필 이미지
혜민
질문자

질문을 제가 정확하게 작성하지 못한 것 같습니다..!

제가 궁금했던 것은 두번째 코드를 아래와 같이 사이즈 체크를 했을 때는 옳지 않은 답이 나와서 질문드린 것이었습니다.

다시 한번 정리하자면,

  • 첫번째 코드에서는 이렇게 if - else if -else 문으로도 나오는데,

  • 두번째코드에서는 아래와 같이 사이즈를 체크하면 왜 틀린 답을 반환하는지가 궁금합니다.

  for ( auto f : fn ) {
    if (prefix.size() + suffix.size() > f.size()) {
      cout << "NE" << '\n';
    } else if ((f.substr(0, idx) == prefix) && (f.substr(idx + 1) == suffix)) {
      cout << "DA" << '\n';
    } else {
      cout << "NE" << '\n';
    }
  }
큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요 혜민님 ㅎㅎ

if - else if else 이런식으로 해도 됩니다.

다만 저 else if 문에 들어간게 2번째코드와 다른데요.

저 suffix부분은 틀린 코드입니다.

혜민님이 말씀해주신 2번째코드 + else if문으로 해봤는데요. 이렇게 해 보시겠어요?

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

int n;

int main() {
  cin >> n;
  
  string pt;
  cin >> pt;

  vector<string> fn;

  for (int i = 0; i < n; i++) {
    string temp;
    cin >> temp;
    fn.push_back(temp);
  }

  int idx = pt.find("*");
  string prefix = pt.substr(0, idx);
  string suffix = pt.substr(idx + 1);
  for ( auto f : fn ) {
    if (prefix.size() + suffix.size() > f.size()) {
      cout << "NE" << '\n';
    } else if ((f.substr(0, prefix.size()) == prefix) && (f.substr(f.size() - suffix.size()) == suffix)) {
      cout << "DA" << '\n';
    } else {
      cout << "NE" << '\n';
    }
  } 
  return 0;
}


또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.


혜민님의 프로필 이미지
혜민
질문자

아,,,!!! 정말 감사합니다 !

0

안녕하세요, 인프런 AI 인턴입니다. 혜민님!

두 코드에서 발생하고 있는 차이점은, substr 함수와 기타 문자열 비교 로직이 어떻게 배치되어 있는가에 따라 발생하는 것으로 보입니다. 혜민님이 언급하신 대로, 두 코드가 비슷하더라도, 실행 순서와 조건 체크가 중요한 역할을 합니다.

1번 코드:

  • 이 코드에서는 문자열 비교 및 패턴 확인을 사이즈 체크와 함께 즉시 수행하는 로직을 가지고 있습니다.
  • 사이즈 체크와 패턴 비교 조건문이 긴밀하게 연결되어 있어, 문자열의 크기가 일치하는 경우에 대해서만 패턴을 비교합니다.

2번 코드:

  • substr를 사용함으로써 부분 문자열을 다루고, 그 부분 문자열의 길이를 먼저 체크하게 됩니다.
  • 사이즈 체크가 선행되어, 그 크기를 충족하는 경우에만 패턴 비교로 넘어가는 구조입니다.
  • substr 부분이 코드 실행 흐름을 일부 제어하여, 예상치 못한 예외가 처리되는 경우가 있을 수 있습니다.

결론적으로, 이런 차이가 발생하는 이유는:
- 흐름 제어: substr의 사용은 부분 문자열을 생성하고 비교하는 흐름을 갖기 때문에, 원본 문자열의 크기 체크가 먼저 이뤄져야만 합니다.
- 조건 순서: 사이즈를 먼저 검사해야 하는 코드 구조와 그에 따른 안전한 흐름이 보장되기 때문에, 부분 문자열을 제대로 비교하게 됩니다.

질문의 핵심은 코드의 흐름 제어와 조건 검사가 결과에 어떻게 영향을 미치는지를 이해하는 것입니다. 그렇게 함으로써, 코드가 요구사항에 맞게 작동하도록 보장할 수 있습니다.

원본이나 유사한 문제의 해결 방법을 참고하시려면, 다음의 게시물을 확인해 보시기 바랍니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

혜민님의 프로필 이미지
혜민

작성한 질문수

질문하기