알고리즘 기초 - 문자열 분석 (백준 10820)

2024. 3. 18. 13:45알고리즘

문제

문자열 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

카운팅 배열을 만들어서 해결하면 된다.

let input = require('fs').readFileSync(0).toString().split('\n');
let count;
function solution() {
  for (let i = 0; i < input.length; i++) {
    count = Array.from({ length: 4 }).fill(0);
    let s = input[i];
    if (!s.length) continue;
    for (let j = 0; j < s.length; j++) {
      if (s[j].charCodeAt() >= 97 && s[j].charCodeAt() <= 122) count[0]++;
      else if (s[j].charCodeAt() >= 65 && s[j].charCodeAt() <= 90) count[1]++;
      else if (s[j] !== '\r' && s[j] !== ' ' && !Number.isNaN(Number(s[j]))) count[2]++;
      else if (s[j] === ' ') count[3]++;
    }
    console.log(count.join(' '));
  }
}

solution();

 

어려운 문제는 아니지만 입력값을 받아오는 부분과 반례가 존재하기에 정리한다.

문제에서는 빈 문자열이 들어오면 출력하라는 말이 없다. 즉, 빈 문자열인 경우에는 아무것도 출력하지 말아야한다.

 

if (!s.length) continue;

따라서 다음의 조건을 추가했다.

 

 

let input = require('fs').readFileSync(0).toString().trim().split('\n');

추가적으로 입력의 마지막 줄도 줄바꿈 문자가 붙기 때문에 줄바꿈으로 split을 하면 맨 마지막에 빈 문자열 하나가 남는다.

원래는 이렇게 앞 뒤 공백을 trim으로 미리 잘라 입력의 마지막에 빈 문자열이 남지 않는다. 하지만 이 문제에서 trim을 사용하게 되면 공백으로 입력된 부분도 잘리기 때문에 테스트에 통과되지 못한다. 따라서 trim을 하지 않아야한다.