[BAEKJOON] 백준 5555: 반지 (C#)

2024. 9. 26. 12:58IT/BaekJoon

문제 링크

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

 

 

문제

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

찾고자하는 문자열이 주어졌을 때 그 문자열을 포함하는 반지가 몇 개인지를 발견하는 프로그램을 작성하라.

 

 

입력

입력은 총 2 + N 줄 이다.

첫 번째 줄에는 1 자 이상 10 자 이하의 대문자로 구성된 찾고자 하는 문자열이 적혀있다.

두 번째 줄에는 반지의 개수 N (1 ≦ N ≦ 100)이 적혀있다.

2+i 줄(1 ≦ i ≦ N)엔 i개의 반지에 새겨져있고, 10 문자로 이루어진 문자열이 적혀있다.

 

 

출력

찾고자하는 문자열을 포함 반지의 개수를 나타내는 정수를 한 줄로 출력하라.

 

 

 

통과한 답안

namespace _5555
{
    internal class Program
    {
        static void Main(string[] args)
        {
            string target = Console.ReadLine();
            int N = int.Parse(Console.ReadLine());
            int cnt = 0;

            for (int i = 0; i < N; i++)
            {
                string input = Console.ReadLine();
                input = input + input;
                if (input.Contains(target)) cnt++;  
            }

            Console.WriteLine(cnt);
        }
    }
}

 

찾고자하는 문자열 target과 반지의 개수 N, 각 반지에 적힌 문자열이 주어졌을 때,

target이 적혀있는 반지의 개수를 찾는 문제이다.

 

반지의 특성으로 문자열이 원형으로 이어진 형태를 갖고 있는 것이 특징인데,

반지의 문자가 abcde로 적혀있다면, 아래의 그림과 같이 나타낼 수 있다

 

문자열을 거꾸로 읽는 걱정은 없으므로, abcde로 적혀있는 반지는

abcde, bcdea, cdeab, deabc, eabcd의 5개로 문자열을 읽을 수 있다.

 

이를 구현하기 위해서 입력받은 input 값을 두 개 합치는 방법으로 구현하였는데,

이 문제에서 모든 반지에 적혀있는 문자의 수는 10개로

input 값을 두 개 합치더라도 문제를 해결하는데는 오류가 발생하지 않는다.

 

만약 각 반지에 적혀있는 문자의 수가 다르다면 단순히 합치는 것이 아니라,

합친 후에도 타겟 문자열을 찾는 과정에서

반지에 원래 적혀있던 문자열의 길이를 초과하지 않게 조절하는 과정이 추가되어야 한다.