99클럽 코테스터디 6기 02일차 TIL

glory_young·2025년 4월 1일

문제접근

문제 : 백준 10820 (https://www.acmicpc.net/problem/10820)
유형 : 문자열 구현

n (1 <= n <= 100)줄의 문자열을 받아 각 문자열에 대해 소문자, 대문자, 숫자, 공백의 개수를 구분하여 출력.

1) 공백을 포함한 문자열을 입력받기에 cin이 아닌 getline을 이용.
1-1) 몇 줄의 문자열이 입력될지 모르기에 while문으로 루프를 돌리고 break 조건을 생각함.
2) string으로 문자열을 받아 앞에서부터 하나씩 접근하여 문자를 구분.
3) low_c, up_c, num, space 변수에 개수 저장
4) 결과 출력

제출코드

#include <iostream>
#include <string>
#include <vector>
#include <cctype>

using namespace std;

int main() {
	string str;
	vector<int> low_v, up_v, num_v, space_v;

	char c;
	int count=0;
	int low_c, up_c, num, space; 
	
	
	while(1){
		getline(cin, str);
		if (cin.eof()) break;
		low_c = 0;
		up_c = 0;
		num = 0;
		space = 0;
		
		count++;
		for (int i=0;;i++) {
			c = str[i];
			if (islower(c) != 0) low_c++;
			else if(isupper(c) != 0) up_c++;
			else if (isdigit(c) != 0) num++;
			else if (isspace(c) != 0) space++;
			else break;
		}
		low_v.push_back(low_c);
		up_v.push_back(up_c);
		num_v.push_back(num);
		space_v.push_back(space);
		
	
	}
	for (int i =0; i < count; i++) {
		cout << low_v[i] << " " << up_v[i] << " " << num_v[i] << " " << space_v[i] << endl;
	}
	
	return 0;
}

구현과정 문제 해결

1. 입력 종료 시점(?)의 문제

처음 구현할 당시에는 while문 루프 상황에서 break포인트로
getline(cin, str);
if(str.empry()) break;
로 구현하였다.

이렇게 구현하면 생기는 문제는 (1) 사용자 입력이 '\n'로 끝난 후에 한번 더 엔터를 입력해야 된다. (2) (이건 회고하는 과정에서 생각한건데) 말그대로 빈 문자열을 무시하게 된다. 라는 두가지 문제가 생긴다.
백준에서 제공하는 입력 예시에서 모든 문장의 마지막이 '\n'로 끝나기에 무엇으로 break 조건을 설정할지 고민했다.

결론은 질문게시판을 통해 EOF로 문자열의 종료를 알려주는 방법으로 구현하였다. EOF를 알고있었지만 파일과 문자열을 동일 선상에서 생각하고 있지 않아서 (크기를 알지 못한 채) 연속으로 입력되는 문자열을 처리하는 다른 방법이 있을거라 생각하느라 시간이 많이 지체되고 헤맸다.
이번 경험으로 알게 되었으니 이게 코딩테스트 스터디의 좋은점이 아닐까싶다. 알던 것도 더 열심히 생각하고 고민하게 된다.

최종적으로는
if(cin.eof()) break;
로 구현하였다. 참고로 cin.eof()는 eof일 때 true(1)을 반환하고 나머지 상황에는 false를 반환한다. 콘솔에서 eof를 나타내고 싶다면 'Ctrl+x'를 통해 입력할 수 있다.

2. 입출력 방식
이건 문제는 아니지만 구현하다보니 억울했던 부분이다.
백준 예시입력과 예시출력이 여러줄로 묶여있어서 입력을 모두 받은 후에 한번에 출력을 해야된다고 이해했다.

그래서 개수를 저장한 변수 값들을 바로 출력하지 않고 한 번 더 저장할 공간이 필요했다. 이는 vector를 통해 각 문자별 벡터를 만들어 첫번째 문자열부터 개수를 하나씩 저장하여 while문이 종료된 후에 for문으로 순서대로 돌며 출력하게 하였다.
다른 사람들의 결과를 보니 (입력-출력)을 함께 반복시켜도 문제가 없더라... 굳이 vector까지 사용을 안해도 됐었는데 아쉽다.


오늘의 회고

아직 모르는 내용과 함수가 많다. 초반에는 문제를 푸는 것과 다른 사람들의 답안을 보면서 비교하며 공부하는 것이 도움될 것 같다.

0개의 댓글