[C++] 백준 9996 | 한국이 그리울 땐 서버에 접속하지

heige·2024년 6월 26일
0

BOJ

목록 보기
45/46
post-thumbnail

문제

https://www.acmicpc.net/problem/9996

풀이

//틀린 코드
#include <bits/stdc++.h>
using namespace std;

int n;
string pat, file;

int main(){ 
  cin >> n;
  cin >> pat;

  for (int i = 0; i < n; i++) {
    cin >> file;
    for (int i = 0; i < size.file())
    if (file[0] == pat[0] && file[file.length()-1] == pat[pat.length()-1])
      cout << "DA\n";
    else 
      cout << "NE\n";
  }
  return 0;
}

처음엔 코드를 위와 같이 짰다. '실버 문젠데 쉽네?' 하면서 ..머쓱.

패턴이 알파벳 소문자 하나와 *으로 이뤄져있는 것으로 착각했다.

패턴은 알파벳 소문자 여러 개와 별표(*) 하나로 이뤄진 문자열이다.

소문자는 여러개로 이뤄질 수 있다. ab*cde 같이!
별표를 중심으로 문자열을 분리해야 한다.
별표의 위치를 찾아서, 문자를 분리한다.

힌트를 얻고 다시 풀어보았다.

//틀린 코드(런타임에러)

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

int n;
string pat, file;
string pat_l, pat_r;

int main(){ 
  cin >> n;
  cin >> pat;
  int pos = pat.find("*");
  pat_l = pat.substr(0, pos);
  pat_r = pat.substr(pos+1);

  for (int i = 0; i < n; i++) {
    cin >> file;
    if (pat_l == file.substr(0, pat_l.size()) && pat_r == file.substr(file.size() - pat_r.size())) cout << "DA\n";
    else cout << "NE\n";
  }
  
  return 0;
}

이렇게 했는데 런타임에러(Out of range)가 발생했다...하아
이유를 모르겠다. 어디서 범위 초과한다는겨.

➡️ 풀이강의를 듣다가 반례 알게 됨.

만약 ab*ab의 패턴일 때
ab를 입력하면 정답이라고 뜬다.
접두사+접미사 더한 사이즈보다 입력 값의 사이즈가 같거나 커야된다.

개선된 코드가 아래 있다.

개선

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

int n;
string pat, file;
string pat_l, pat_r;

int main(){ 
  cin >> n;
  cin >> pat;
  int pos = pat.find("*");
  pat_l = pat.substr(0, pos);
  pat_r = pat.substr(pos+1);

  for (int i = 0; i < n; i++) {
    cin >> file;
    if (pat_l.size() + pat_r.size() > file.size()){
      cout << "NE\n";
    } else {
      if (pat_l == file.substr(0, pat_l.size()) && pat_r == file.substr(file.size() - pat_r.size())) cout << "DA\n";
      else cout << "NE\n";
    }
  }
  return 0;
}
  • 문자열 자르는 substr 개념은 필수!
  • 문제 조건을 보고, 가능성 여러 개 생각하기
profile
웹 백엔드와 클라우드 정복을 위해 탄탄한 기반을 쌓아가고 있는 예비개발자입니다. 'IT You Up'은 'Eat You Up'이라는 표현에서 비롯되어, IT 지식을 끝까지 먹어치운다는 담고 있습니다.

0개의 댓글