• 티스토리 홈
  • 프로필사진
    유니얼
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
유니얼
  • 프로필사진
    유니얼
    • 분류 전체보기 (295)
      • Unity (17)
        • 게임 개발 (5)
      • Unreal (24)
        • 게임 개발 (20)
      • DirectX (36)
      • 코딩테스트 (91)
        • 프로그래머스 (25)
        • 백준 (66)
      • Google Workspace (1)
      • Programing (102)
        • C# (68)
        • C++ (24)
        • JavaScript (10)
      • 게임 서버 프로그래밍 (17)
      • Web (6)
        • 슈퍼코딩 (6)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
    등록된 댓글이 없습니다.
  • 최근 공지
    등록된 공지가 없습니다.
# Home
# 공지사항
#
# 태그
# 검색결과
# 방명록
  • [Baekjoon(백준)][9996번] 한국이 그리울 땐 서버에 접속하지(C++)
    2024년 01월 25일
    • 유니얼
    • 작성자
    • 2024.01.25.:51
    728x90

    안녕하세요! 오늘은 코딩테스트 문제 중 하나인 "한국이 그리울 땐 서버에 접속하지" 문제를 해결하는 방법에 대해 설명하려고 합니다. "한국이 그리울 땐 서버에 접속하지" 문제는 주어진 패턴에 일치하는 파일 이름을 찾아내는 것입니다. 문제를 해결하는 과정과 코드를 자세히 알아보겠습니다.

    문제링크:

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

     

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

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

    www.acmicpc.net

    Question_1
    Question_2
    Question_3

    문제 개요

    해외에서 생활하는 동안 서버에 저장된 파일 이름을 통해 한국을 떠올리려는 이야기에서 출발한 이 문제는, 주어진 패턴과 일치하는 파일 이름을 찾는 과제입니다. 패턴은 알파벳 소문자와 단 하나의 별표(*)로 구성되며, 별표는 임의의 문자열(빈 문자열 포함)로 대체될 수 있습니다.

    해결 방법

    다. 별표 앞뒤의 문자열로 파일 이름이 시작하고 끝나는지를 검사하여 패턴에 일치하는지 여부를 판단합니다. 별표는 파일 이름 중간에 위치할 수 있는 어떤 문자열로도 대응될 수 있습니다.

    코드 구현

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    // 문자열을 주어진 구분자(del)로 분할하는 함수
    vector<string> Split(string input, string del) {
        vector<string> ret;
        string token = "";
        int pos = 0;
        while ((pos = input.find(del)) != string::npos) {
            token = input.substr(0, pos); // 구분자 이전까지의 문자열을 추출
            ret.push_back(token); // 추출된 문자열을 벡터에 저장
            input.erase(0, pos + del.size()); // 처리된 부분을 입력 문자열에서 제거
        }
        ret.push_back(input); // 마지막 남은 문자열을 벡터에 추가
        return ret;
    }
    
    int main() {
        ios_base::sync_with_stdio(false);
        cin.tie(NULL);
        cout.tie(NULL);
    
        int count = 0; // 파일의 개수
        cin >> count;
        string pattern = ""; // 패턴 문자열
        cin >> pattern;
        vector<string> inputs(count, ""); // 파일 이름을 저장할 벡터
        for (int i = 0; i < count; i++) {
            cin >> inputs[i]; // 파일 이름 입력
        }
    
        // 패턴을 '*' 기준으로 분할하여 패턴의 시작 부분과 끝 부분을 추출
        vector<string> ret = Split(pattern, "*");
        vector<string> answer; // 각 파일 이름이 패턴과 일치하는지 여부를 저장할 벡터
        for (int i = 0; i < inputs.size(); i++) {
            // 파일 이름의 길이가 패턴의 시작 부분과 끝 부분의 길이 합보다 작으면 일치하지 않음
            if (ret[0].size() + ret[1].size() > inputs[i].size()) {
                answer.push_back("NE");
            }
            else {
                // 파일 이름의 시작 부분이 패턴의 시작 부분과 일치하고
                // 파일 이름의 끝 부분이 패턴의 끝 부분과 일치하면 패턴과 일치함
                if (ret[0] == inputs[i].substr(0, ret[0].size()) && 
                    ret[1] == inputs[i].substr(inputs[i].size() - ret[1].size())) {
                    answer.push_back("DA");
                }
                else {
                    answer.push_back("NE");
                }
            }
        }
    
        // 결과 출력
        for (auto str : answer) {
            cout << str << "\n";
        }
    }

    코드 설명

    이 코드는 주어진 패턴을 '*' 기준으로 분할하여 시작 부분과 끝 부분을 추출합니다. 각 파일 이름에 대해 시작 부분과 끝 부분이 일치하는지 검사하여 패턴과의 일치 여부를 판단합니다. 패턴이 일치하면 "DA"를, 그렇지 않으면 "NE"를 출력합니다.

    결론

    이 문제는 문자열 처리와 조건 판단을 통해 해결할 수 있으며, 복잡한 알고리즘보다는 기본적인 프로그래밍 능력을 평가합니다. 별표(*)를 포함한 패턴 매칭은 다양한 프로그래밍 문제에서 자주 접할 수 있는 주제이므로, 이러한 유형의 문제에 익숙해지는 것이 중요합니다.

    반응형
    다음글
    다음 글이 없습니다.
    이전글
    이전 글이 없습니다.
    댓글
조회된 결과가 없습니다.
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
목차
표시할 목차가 없습니다.
    • 안녕하세요
    • 감사해요
    • 잘있어요

    티스토리툴바