Machineboy空

9996 : 한국이 그리울 땐 서버에 접속하지 - 문자열 자르기 split, substr 본문

Computer/Coding Test

9996 : 한국이 그리울 땐 서버에 접속하지 - 문자열 자르기 split, substr

안녕도라 2024. 1. 31. 16:36

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

 

9996번: 한국이 그리울 땐 서버에 접속하지

총 N개의 줄에 걸쳐서, 입력으로 주어진 i번째 파일 이름이 패턴과 일치하면 "DA", 일치하지 않으면 "NE"를 출력한다. 참고로, "DA"는 크로아티어어로 "YES"를, "NE"는 "NO"를 의미한다.

www.acmicpc.net

 

문제 요약

접두사, 접미사 확인하여 같은 패턴의 문자열인지 판단

 

난이도

Silver 3


풀이

  • '*' 구분 문자 기준 split
  • 입력값과의 비교

REVIEW

 

1차 시도: 패턴이 3글자로 주어지는 줄 알고 s[0], s[2]와 단순 비교

 

2차 시도: split이용해 앞, 뒤 비교.

ab*ab로 접두사,접미사가 같을 경우를 고려하지 못함.

string.find()로 여러 개가 검출될 시, 가장 먼저 검출된 곳의 위치를 출력한다.

 

3차 시도:  split의 기본 아이디어인 구분 문자를 기준으로 자른다는 것 활용.

c++에서는 split을 제공하지 않으므로 substr을 떠올 릴 것!

 

아이디어 자체가 어려운 것이 아니었음에도 문제를 잘못 읽거나, 문법이 익숙치 않아 틀리게 된다..

열심히 연마하기.


문법정리

  • string.find(string) : 인덱스 반환
    • 여러개 검출 시 가장 먼저 찾은 곳 반환
  • string.substr(size_t pos = 0, size_t count = npos) : string 반환
    • pos: 시작할 위치
    • count: 몇 개 자를 건지 (생략할 경우 npos 끝까지 자름)
  • string.empty() : bool 형 반환
  • string == string 비교 가능
  • string.length(), string.size() 둘 다 사용 가능

CODE

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

int n;
string s, ori_s, pre,suf;

int main(){

    cin >> n;
    cin >> ori_s;

    int pos = ori_s.find('*');

    pre = ori_s.substr(0,pos);
    suf = ori_s.substr(pos+1); // 두 번쨰 인자 안넣으면 끝까지 뽑아줌

    for(int i = 0; i <n; i++){
        cin >> s;

        if(pre.size() + suf.size() > s.size()){
            cout << "NE\n";             //반례도 꼭 !
        }else{
            if(pre==s.substr(0,pre.size()) && suf == s.substr(s.size()-suf.size()))
            cout << "DA\n";
            else cout << "NE\n";
        }
    }

}