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

Park·2023년 9월 20일
0

코딩테스트 - Week1

목록 보기
5/15

1. 문제 접근

  • 문자열 패턴 (ex. c*a)는 * 앞뒤로 한 글자가 아님에 유의하자.
    • aa*bb 이런 꼴이 될 수도 있다는 것!
  • 또한 문자열 패턴보다 길이가 작은 글자가 들어오는 경우 예외처리를 잘 해줘야 한다.
    • 패턴은 aa*aa인데, aa가 들어올 수도 있는데, 예외처리를 안하게 되면 오답이 날 수 있음

2. 시행착오

  1. 처음에는 단순히 *앞 문자열(이하 prefix) 먼저 찾아서 지우고, 지운 문자열에 *뒤 문자열(이하 suffix)이 끝에 있나 비교하는 방식으로 복잡하게 진행했음
void solve(string s){
    int first_pos, second_pos;
    first_pos = s.find(first);
    
    if(first_pos != string::npos && first_pos == 0) {
        s.erase(0, first_pos+first.length());
        second_pos = s.find(second);
        if(second_pos != string::npos && second_pos == s.size() - second.length()) {
            
            cout << "DA" << "\n";
            return;
        }
    }
    cout << "NE" << "\n";
    return;
    
    
}
  1. 패턴보다 입력이 들어오는 문자열의 길이가 작은 경우를 고려하지 못했음
  2. substr()의 인자로 position만 들어와도 된다는 점을 간과
  • 즉, 지금 pos부터 모든 문자열을 포함하고 싶으면, position만 넣어도 된다.
  • c++의 text.substr(3)이 python의 text\[3:]과 비슷한 느낌

3. 코드 및 풀이

3.1 풀이

  • 우선 prefix와 suffix의 사이즈가 주어진 text의 사이즈보다 크면 무조건 "NE"출력
  • 그 후 substr()을 활용해 문자열의 맨 앞과 문자열의 맨 끝부분을 prefix와 suffix 비교할 수 있음
#include <bits/stdc++.h>
using namespace std;

int n, pos;
string s, pre, suf, text;
int main(){

    cin >> n;
    cin >> s;

    pos = s.find("*");
    pre = s.substr(0, pos);
    suf = s.substr(pos+1);

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

}

Reference

profile
안녕하세요!

0개의 댓글