[백준 BOJ] 7600번 문자가 몇갤까 (C++/cpp)

2022. 10. 13. 13:22PS (Program Solving)/BOJ (백준)

문제 설명

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

 

7600번: 문자가 몇갤까

각 줄마다 출몰한 알파벳의 개수를 출력하면 된다.

www.acmicpc.net

백준 BOJ 7600번 문자가 몇갤까 문제 사진

 

접근 방법 - 문자열 연산의 기초 문제

백준의 7600번 문제는 문자열에 대한 연산에 있어 기초적인 원리를 다루고 있는 문제이다.

해당 문제는, 각 케이스의 문자열에 대해 문자열에서 나타난 영문자 종류의 개수를 구하여 출력해야 하는 문제이다.

필자는 알파벳이 나타난 빈도를 체크하는 데에 사용할 배열을 만들고 이를 통해 정답을 구해보려 하였다.

여기서 대소문자는 따로 구분하지 않고 같은 글자로 취급해야 한다는 조건이 있으니, 이 점은 참고하길 바란다.

또한 입력으로 주어지는 문자열에는 공백을 포함하기도 하기 때문에, cpp로 ps를 하는 경우엔 아래의 구문을 통해 입력을 받아야 할 것이다.

getline(cin, st);
// 공백을 포함한 문자열을 입력받아 st에 저장한다.

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

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

 

코드의 실행 순서

(무한 반복문을 통하여 각 케이스에 대한 연산을 수행하도록 한다.)

1) 공백을 포함한 문자열(st)을 하나씩 입력받는다.

설명에 나온 대로 "#"을 입력받았다면 종료해야 하기 때문에, 이 경우엔 break문을 통해 해당 반복문을 탈출하도록 한다.

 

2) 알파벳이 나타났는지에 대한 여부를 체크하기 위해 cnt 배열을 선언한다.

이때, 배열값들은 모두 0으로 설정해두고, 배열의 크기는 알파벳의 총개수인 26으로 설정한다.

 

3) 뒤이어, 나타난 알파벳의 종류 개수를 저장할 변수 num을 0으로 초기화하여 선언한다.

 

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

- 현재 탐색값이 대문자이며 해당 알파벳이 나타난 적이 지금까지 없었다면, 여기에 'A'(65)를 뺀 값을 인덱스로 갖는 cnt의 배열값에 1을 더하고 num에도 1을 더하도록 한다. 

- 현재 탐색값이 소문자이며 해당 알파벳이 나타난 적이 지금까지 없었다면, 여기에 'a'(97)를 뺀 값을 인덱스로 갖는 cnt의 배열값에 1을 더하고 num에도 1을 더하도록 한다.

(ex) cnt[0]의 값 :: 대문자 A와 소문자 a가 나타난 총 빈도수

   cnt[2]의 값 :: 대문자 C와 소문자 c가 나타난 총 빈도수

(여기서, 우리는 나타난 알파벳의 종류 개수만 구하면 되기 때문에 구체적인 빈도수까지 체크하진 않았다.)

 

5) 위의 연산이 모두 완료되었다면, 최종적으로 저장된 num을 출력한 뒤 다음 케이스에 대한 연산을 수행하도록 한다.

 

6) 모든 테스트 케이스에 대한 연산이 완료되었다면, 실행 종료한다.

반응형

 

성공한 코드

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

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

	while (1) {
		string st;
		getline(cin, st);
		if (st == "#") { break; }

		int cnt[26] = { 0 };
		int num = 0;
		for (int i = 0; i < st.length(); i++) {
			if (st[i] >= 'A' && st[i] <= 'Z' && cnt[st[i] - 'A'] == 0) {
				cnt[st[i] - 'A']++;
				num++;
			}
			if (st[i] >= 'a' && st[i] <= 'z' && cnt[st[i] - 'a'] == 0) {
				cnt[st[i] - 'a']++;
				num++;
			}
		}
		cout << num << endl;
	}
}

 

제출 결과

백준 BOJ 7600번 문자가 몇갤까 문제 C++ 제출 결과

(2022.08.02 백준 7600번 문제 제출 결과)

반응형