티스토리 뷰
오늘도 1일1-3알고리즘을 풀어보기위해 등장한 감자코딩에 감자개발자입니다. 이번에 살펴볼 문제는 10820 문자열 분석 문제입니다.
문제 링크
https://www.acmicpc.net/problem/10820
문제
문자열 N개가 주어진다. 이때, 문자열에 포함되어 있는 소문자, 대문자, 숫자, 공백의 개수를 구하는 프로그램을 작성하시오.
각 문자열은 알파벳 소문자, 대문자, 숫자, 공백으로만 이루어져 있다.
입력
첫째 줄부터 N번째 줄까지 문자열이 주어진다. (1 ≤ N ≤ 100) 문자열의 길이는 100을 넘지 않는다.
출력
첫째 줄부터 N번째 줄까지 각각의 문자열에 대해서 소문자, 대문자, 숫자, 공백의 개수를 공백으로 구분해 출력한다.
예제 입력 1
This is String
SPACE 1 SPACE
S a M p L e I n P u T
0L1A2S3T4L5I6N7E8
예제 출력 1
10 2 0 2
0 10 1 8
5 6 0 16
0 8 9 0
저저번 알고리즘 문제부터 계속 문자열관련된 문제를 풀어보고있습니다. 문자열 알고리즘에 대해서 아직 정확한 이해(ASCII Code)에 대한 개념이 부족하신분들은
10808 알파벳개수
에 대한 글을 한번 읽고 오시면 도움이 되실것 같습니다
문제 해결 방법
1) 문자열 string을 입력을 받습니다.
2)입력받은 string문자열 중에 소문자 / 대문자 / 숫자 /공백으로 이루어진것들의 각각의 개수를 찾아 출력하는 문제입니다.
3) 여기서 사용할 개념은 ASCII 코드에 대한 기본적인 개념을 활용해보려고합니다.
문자열에 대한 아스키코드값에 대한 범위를 사용할것입니다.
기본적인 개념
알파벳 대문자 'A' ~ 'Z' 까지는 아스키 코드로 65 ~ 90까지로 , 소문자는 'a' ~ 'z', 97 ~ 122 까지로 정의되어 있습니다.
4) 여기 테스트 케이스에서는 몇개의 문자열을 입력받을지에 대한 수가 나와있지 않습니다. 이것은 과연 무엇을 뜻하는것일까요?
-> 바로 그것은, 각각 문자열을 입력할때마다 계속해서 실행하겠다는것입니다. 간단한 예로는, 사용자 자동 문자열 시스템을 생각하시면 될것같습니다. 문자열에 대한 입력을 사용자에게 맡겨서 시스템을 계속 이용하게 하려고하는 것입니다.
5) 간략히 말씀드리면, 문자열을 몇줄을 입력하겠다는것이 아니라 사용자에 필요에 의해서 계속 동작하게 만들어야 합니다.
따라서, 반복문을 돌릴때 저희가 임의적으로 문자열의 개수를 정해주는것이 아닙니다. 입력을 그러면 어떻게 받아야할까요?
C++에서는 getline()이라는 함수를 사용하면 하나의 반복문이 끝날때마다 사용자에게 입력을 할 수 있게 만들 수 있습니다.
저의 코드에서는 getline(cin,str)형식을 사용하였습니다.
cin은 C++에서의 입력을 받기위한 하나의 입력의 개요라고 할 수 있습니다.
처음에는 제가 임의로 문자열의 줄수를 입력을 받았는데, 케스트케이스를 복사해서 결과를 보았는데, 너무 이상한값들이 출력되었습니다.
코드 리뷰
//
// 10820(문자열분석).cpp
// Algorigm_Study
//
// Created by kgh on 20/12/2018.
// Copyright © 2018 kgh. All rights reserved.
//
#include <stdio.h>
#include <string>
#include <iostream>
using namespace std;
int main(void){
// 1. 총 몇개의 문자열을 입력할것인지
string str;
// 2.문자열 탐색
while(getline(cin,str)){
// 3. 문자열 입력
int num[4] ={0,};
for(char c : str){
if(c >= 'a' && c <= 'z'){
num[0] += 1;
}else if(c >='A' && c <= 'Z'){
num[1] += 1;
}else if(c >='0' && c <='9'){
num[2] += 1;
}else if(c ==' '){
num[3] += 1;
}
}
cout << num[0] <<' '<<num[1] << ' '<< num[2] << ' ' <<num[3] <<endl;
}
cout <<endl;
return 0;
}
저는 소문자/대문자/숫자/공백에 따라 4가지의 경우를 조건을 생각하여 코드를 작성하였습니다. 4개의 변수를 선언하기 귀찮기도해서 하나의 배열에 값들을 저장하여 한번씩 출력해주었고, int num[4] = {0,};으로 하나의 문자열을 입력받으면 초기화를 시켜주었습니다.
참고로 모르시는 분들을 위해서 하나 말씀드리면, {0,}을 사용하면 모든 배열의 값들을 0으로 초기화 시키겠다는 말입니다. 간혹 이것을 모르시는분들은 {0,0,0,0}이런식으로 값을 넣는분들이 계시는데, 알고계시면 상당히 유용하고 쓰일일이 많으실겁니다. 간단하게 해결되는 문제였으나, 이해안되시는 분들을 위해 상세히 설명하느라 말이 길어졌습니다.
이상 백준 알고리즘 10820 문자열 분석 문제 풀이 및 코드 리뷰를 마치겠습니다.
감자 코딩 & 감자개발자 였습니다. 감사합니다 :)
'Algorithm' 카테고리의 다른 글
[알고리즘] 백준 알고리즘 11655번 ROT13 (0) | 2018.12.22 |
---|---|
[알고리즘] 백준 알고리즘 2743 단어 길이 재기 (0) | 2018.12.22 |
[알고리즘] 백준알고리즘 10809 알파벳찾기 (0) | 2018.12.19 |
[알고리즘] 백준알고리즘 10808 알파벳개수 (0) | 2018.12.18 |
[알고리즘] 백준알고리즘 10866 Deque 문제 (0) | 2018.12.18 |
- Total
- Today
- Yesterday
- 머신러닝
- node.js
- programming
- Spring
- TensorFlow
- 복습
- 스프링
- 백준알고리즘
- 감자코딩
- C언어
- 텐서플로우
- 안드로이드
- node
- 프로그래밍
- 감자개발자
- 개발하는 관광이
- 리버싱
- Android
- 초보자를 위한 C언어 300제
- 노드
- BFS
- Algorigm
- MVC
- 학교
- db
- Controller
- 알고리즘
- 백준
- 코드엔진
- C langauge
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |