본문 바로가기

BAEKJOON/문자열

백준 10820번 [문자열 분석](C++) -yes6686- 티스토리

728x90
SMALL

백준 문제 풀이: 10820 (문자열 분석)


문제 링크: https://www.acmicpc.net/problem/10820

문제 설명:

여러 줄의 문자열이 주어졌을 때, 각 줄에 대해 다음을 분석해야 합니다: 1. **소문자** 개수 2. **대문자** 개수 3. **숫자** 개수 4. **공백** 개수 입력은 EOF(End Of File)까지 주어지며, 각 줄에 대한 결과를 출력합니다.


문제 해결 코드


#include <iostream>
#include <string>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    string s;

    // EOF까지 입력을 읽고 처리
    while (getline(cin, s)) {
        int smallLetterCnt = 0; // 소문자 개수
        int bigLetterCnt = 0;   // 대문자 개수
        int numCnt = 0;         // 숫자 개수
        int gapCnt = 0;         // 공백 개수

        // 문자열의 각 문자 검사
        for (int i = 0; i < s.size(); i++) {
            if (s[i] >= 'A' && s[i] <= 'Z') { // 대문자
                bigLetterCnt++;
            }
            else if (s[i] >= 'a' && s[i] <= 'z') { // 소문자
                smallLetterCnt++;
            }
            else if (s[i] >= '0' && s[i] <= '9') { // 숫자
                numCnt++;
            }
            else if (s[i] == ' ') { // 공백
                gapCnt++;
            }
        }

        // 각 줄의 결과 출력
        cout << smallLetterCnt << ' ' << bigLetterCnt << ' ' << numCnt << ' ' << gapCnt << '\n';
    }

    return 0;
}

코드 설명

코드의 주요 로직과 사용된 알고리즘 설명:

  • 입력 처리: - getline(cin, s)를 사용하여 한 줄씩 입력받습니다.
  • 문자열 분석: 각 문자를 순회하며 다음 조건에 따라 개수를 구합니다:
    • 'A' <= s[i] <= 'Z': 대문자
    • 'a' <= s[i] <= 'z': 소문자
    • '0' <= s[i] <= '9': 숫자
    • s[i] == ' ': 공백
  • 출력: - 각 줄에 대해 소문자, 대문자, 숫자, 공백의 개수를 출력합니다.

시간 복잡도 분석

  • 한 줄의 길이를 n이라고 하면, 각 문자를 확인하는 데 **O(n)**의 시간이 걸립니다.
  • 여러 줄에 대해 처리하므로 전체 시간 복잡도는 **O(Total Input Size)**입니다.

결과

각 줄에 대해 소문자, 대문자, 숫자, 공백의 개수를 정확히 출력합니다.

  • 입력 예시:
    This is String  
    SPACE    1    SPACE  
     S a M p L e I n P u T     
    0L1A2S3T4L5I6N7E8
  • 출력 예시:
    10 2 0 2  
    0 10 1 8  
    6 6 0 12  
    0 8 9 0

다른 접근 방식이나 개선 사항이 있다면 댓글로 공유 부탁드립니다!

728x90
LIST