[백준] 반지 (5555번)
문제
당신은 N개의 반지를 가지고 있다. 각각의 반지는 대문자 10 문자로 이루어진 문자열이 새겨져 있다. 반지는 문자열의 시작과 끝이 연결된 형태로 문자가 새겨져 있다. 반지에 각인된 문자열을 거꾸로 읽는 걱정은 없다.
찾고자하는 문자열이 주어졌을 때 그 문자열을 포함하는 반지가 몇 개인지를 발견하는 프로그램을 작성하라.
입력
입력은 총 2 + N 줄 이다.
첫 번째 줄에는 1 자 이상 10 자 이하의 대문자로 구성된 찾고자 하는 문자열이 적혀있다.
두 번째 줄에는 반지의 개수 N (1 ≦ N ≦ 100)이 적혀있다.
2+i 줄(1 ≦ i ≦ N)엔 i개의 반지에 새겨져있고, 10 문자로 이루어진 문자열이 적혀있다.
출력
찾고자하는 문자열을 포함 반지의 개수를 나타내는 정수를 한 줄로 출력하라.
예제 입력 1 복사
ABCD 3 ABCDXXXXXX YYYYABCDXX DCBAZZZZZZ
예제 출력 1 복사
2
찾고자 하는 문자열을 포함하는 반지의 수를 구하는 문제이다.
문제는 반지는 원형이기때문에 ABC를 찾고자할 때 반지의 문자열이 CXXXXAB 라면 ABC를 포함한다고 생각해야 한다.
해결법은 반지의 문자열을 한번 더 더해 2개를 연결하는 것이다.
CXXXAB에 CXXXAB를 더하면 CXXXABCXXXAB가 되므로 이 문자열에서 ABC를 찾는건 find()함수를 활용하면 되므로 매우 쉽다.
코드 원본 : https://github.com/chosh95/STUDY/blob/master/BaekJoon/2020/%EB%B0%98%EC%A7%80%20(5555%EB%B2%88).cpp
chosh95/STUDY
프로그래밍 문제 및 알고리즘 정리. Contribute to chosh95/STUDY development by creating an account on GitHub.
github.com
C++ 코드
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
string origin;
int N, res = 0;
cin >> origin;
cin >> N;
while (N--) {
string tmp;
cin >> tmp;
tmp += tmp;
if (tmp.find(origin) != string::npos)
res++;
}
cout << res;
}