[백준 BOJ] 5555번 반지 (C++/cpp)

2022. 9. 20. 12:04PS (Program Solving)/BOJ (백준)

문제 설명

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

 

5555번: 반지

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

www.acmicpc.net

백준 BOJ 5555번 반지 문제 사진1
백준 BOJ 5555번 반지 문제 사진2

 

접근 방법 - 문자열 탐색의 기본 문제

백준의 5555번 문제는 문자열 탐색에 있어 기본적인 원리를 다루고 있는 문제이다.

해당 문제는, 특정 문자열이 새겨진 반지들 중 입력받은 문자열을 포함하고 있는 반지의 개수를 출력해야 하는 문제이다.

이 문제를 풀 때 주의해야 할 점은 반지에 새겨진 문자열은 양 옆으로 이어져있다는 점이다.

따라서, 문자열을 2개 합친 상태에서 입력받은 문자열이 있는지 살펴봐야 한다는 것이다.

아래에는 C++의 문법에 있어 문자열을 탐색하는 데에 사용되는 조건문을 적어보았다.

이를 참고하면서 해결해보는 것이 좋을 것 같다.

arr.find(st) != std::string::npos
// arr 문자열에서 st 문자열을 찾아보았을 때 반환값이 -1이 아닌 경우
// arr 문자열에 st 문자열이 존재하는 경우

혹여나 해당 문제를 해결하는 데에 어려움을 겪고 있다면, 아래의 설명과 코드를 참고해보길 바란다.

필자는 아래의 순서대로 코드를 작성하여 문제를 해결하였다.

 

코드의 실행 순서

1) 찾고자 하는 문자열(st)과 반지의 총 개수(n)를 입력받는다.

 

2) 문자열 st를 포함하고 있는 반지의 개수를 저장할 변수 num을 0으로 초기화하여 선언한다.

 

3) n의 크기만큼 반복문을 실행하여 아래의 연산을 취한다.

- 반지에 있는 문자열(arr)을 하나씩 입력받는다.

- 입력받은 arr를 2개 이어 붙인 값을 arr의 값으로 새로 저장한다.

- arr에 st 문자열이 있는지 찾아본다.

만일 반환값이 -1이 아니라면 존재한다는 것을 뜻한다. 이 경우엔, num에 1을 더한다.

 

4) 모든 연산이 끝났다면, 최종적으로 저장된 num값을 출력한 뒤 실행 종료한다.

반응형

 

성공한 코드

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <iostream>
#include <string>
#define endl '\n'
using namespace std;

//백준 5555번 코드
int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);	cout.tie(NULL);

	string st;	int n;
	cin >> st >> n;

	int num = 0;
	for (int i = 0; i < n; i++) {
		string arr;
		cin >> arr;
		arr = arr + arr;
		if (arr.find(st) != std::string::npos) {
			num++; 
		}
	}
	cout << num << endl;
}

 

제출 결과

백준 BOJ 5555번 반지 문제 C++ 제출 결과

(2022.04.24 백준 5555번 문제 제출 결과)

반응형