본문 바로가기

Algorithm/String

(C++) - 백준(BOJ) 5555 : 반지

반응형

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

 

5555번: 반지

당신은 N개의 반지를 가지고 있다. 각각의 반지는 대문자 10 문자로 이루어진 문자열이 새겨져 있다. 반지는 문자열의 시작과 끝이 연결된 형태로 문자가 새겨져 있다. 반지에 각인된 문자열을

www.acmicpc.net

특정 문자열을 찾는 find함수를 사용해 푼 문제였습니다.

📕 풀이방법

📔 입력 및 초기화

찾을 문자열 stringToFind, 반지에 써있는 문구 ringString, 반지 개수 n, 정답 출력할 변수 cnt를 선언한 후 적절히 입력받습니다.

📔 풀이과정

제한이 적으므로 다양한 풀이가 있습니다. brute force로도 풀 수 있지만 std::find함수를 사용하면 간단히 특정 문자열이 있는지 O(N)으로 검사할 수 있습니다. 문자열을 찾지 못했다면 string::npos를 반환하는 함수입니다.

for loop를 수행하며 매 반지 문자열을 입력받습니다.

1. 반지는 둥글기 때문에 한쪽방향으로 계속 돌리며 읽을 수 있습니다. 따라서 입력받은 ringString += ringString을 해준다면 한 바퀴의 문자열이 됩니다.

2. find함수 결과가 string::npos가 아니라면 stringToFind를 찾은 경우이므로 cnt++해줍니다.

📔 정답출력

cnt를 출력해줍니다.


📕 Code

#include <bits/stdc++.h>
using namespace std;
string stringToFind, ringString;
int n, cnt;
int main(){
    cin >> stringToFind;
    cin >> n;
    for(int i = 0; i < n; i++) {
        cin >> ringString;
        ringString += ringString;
        if(ringString.find(stringToFind) != string::npos) cnt++;
    }
    cout << cnt;
}