[백준 BOJ] 2941번 크로아티아 알파벳 (C++/cpp)

2022. 9. 29. 10:07PS (Program Solving)/BOJ (백준)

문제 설명

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

 

2941번: 크로아티아 알파벳

예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다. 크로아티아 알파벳 변경 č c= ć c- dž dz= đ d- lj lj nj nj š s= ž z=

www.acmicpc.net

백준 BOJ 2941번 크로아티아 알파벳 문제 사진1
백준 BOJ 2941번 크로아티아 알파벳 문제 사진2

 

접근 방법 - 문자열 연산의 응용문제

백준의 2941번 문제는 문자열 연산에 있어 다소 심화적인 부분을 다루고 있는 문제이다.

해당 문제는, 입력받은 문자열에 대하여 문제 설명에 있는 크로아티아 알파벳이 몇 개 포함되어있는지를 출력해야 하는 문제이다.

문제에 있는 크로아티아 알파벳을 보면, 3개의 문자로 이루어진 알파벳 하나와 2개의 문자로 이루어진 알파벳 여러 개가 있다.

때문에 필자의 경우엔, 입력받은 문자열 중 일부를 잘라서 크로아티아 알파벳을 하나씩 탐색해보도록 하였다.

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

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

 

코드의 실행 순서

1) 크로아티아 알파벳을 문자열 배열(arr)에 하나씩 저장하도록 한다.

 

2) 문자열(st)을 입력받는다.

 

3) st에 포함된 크로아티아 알파벳의 개수를 저장할 변수 cnt를 0으로 초기화하여 선언한다.

 

4) st의 길이만큼 반복문을 수행하여 아래의 연산을 취한다.

- 반복문을 한번 수행할 때마다 cnt에 1을 더하도록 한다.

(문제 설명상, 입력받은 문자열은 모두 크로아티아 알파벳으로 이루어져 있기 때문에 이렇게 연산하는 것이다.)

- st의 현재 탐색 위치(i)에 대하여 크기가 3인 부분 문자열을 str에 저장한다.

- 반복문을 통해, arr에서 str과 동일한 크로아티아 알파벳을 찾아본다.

(여기서, ==으로 문자열 비교하면 안 되기 때문에 find() 함수를 사용하여 판별하도록 한다.)

만일 "dz="와 동일하다면, str 전체가 크로아티아 알파벳이기 때문에 이 알파벳 다음의 위치를 가리키도록 i에 2를 더하고 해당 반복문을 탈출한다.

다만 다른 알파벳과 동일하다면, str의 초반 2글자만 크로아티아 알파벳임을 뜻한다. 따라서, 이 알파벳 다음의 위치를 가리키도록 i에 1을 더하고 해당 반복문을 탈출한다.

(다음 반복문 수행할 시, 어차피 i에 1을 추가로 더하기 때문에 이렇게 연산하도록 하였다.)

 

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

반응형

 

성공한 코드

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

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

	string arr[8] = { "dz=","c=","c-","d-","lj","nj","s=","z=" };
	string st;
	cin >> st;

	int cnt = 0;
	for (int i = 0; i < st.length(); i++) {
		cnt++;
		string str = st.substr(i, 3);
		for (int j = 0; j < 8; j++) {
			if (!str.find(arr[j])) {
				if (j == 0) { i += 2; }
				else { i += 1; }
				break;
			}
		}
	}
	cout << cnt << endl;
}

 

제출 결과

백준 BOJ 2941번 크로아티아 알파벳 문제 C++ 제출 결과

(2022.04.02 백준 2941번 문제 제출 결과)

반응형