문자열 분석

문제

언어

  • JavaScript

순서도

  • 각 문자열에 대해서 소문자, 대문자, 숫자, 공백의 개수를 세서 출력

문제 풀이 step 1

  • 주어진 N 개의 문자열에 대해서 소문자, 대문자, 숫자, 공백의 개수를 세서 출력하는 문제로 크게 복잡한 것은 없습니다.
  • 개수를 세는 방법에는
    • charCodeAt() 메서드를 사용해서 추출한 code 값을 비교해서 세는 방법
      • "a".charCodeAt(0) <= ch && ch <= "z".charCodeAt(0)
    • 바로 문자열 비교를 통해서 세는 방법 = "a" <= ch && ch <= "z"
  • 위와 같이 기본적인 두 가지 방법과 추가적으로 더 있을 것입니다.
  • 편한 방법을 사용해서 개수를 세서 출력 형식에 맞게 출력하면 정답입니다.

문제 풀이 step 2

  • 문제의 풀이는 간단한데 저는 실수로 인해서 조금 시행착오를 많이 겪었습니다.
  • 저는 백준에서 문제를 풀 때, 맨 위에
    • 아래와 같이 입력부분을 적어놓고 재사용하면서 풀고 있습니다.
      const input = require("fs")
        .readFileSync("/dev/stdin")
        .toString()
        .trim()
        .split("\n");
      
    • 하지만 이번 문제에서는 공백도 의미를 갖기 때문에 아래와 같이 수정해야합니다.
      const input = require("fs").readFileSync("/dev/stdin").toString().split("\n");
      
    • 차이가 보이시나요??
    • trim() 메서드를 제거했습니다.
  • 이번 문제에서는 공백도 의미를 갖습니다.
  • 그래서 다른 문제를 풀 때처럼 trim() 메서드를 기본적으로 적어놓고 푸시면 어디서 문제가 발생하는 것인지 도통 감이 안 오실 수 있습니다.
  • 저와 같은 실수를 안 하셨으면 하는 바램에서 이 문제를 포스트하게 되었습니다.

후기

  • 로직은 문제 없고, 분명히 입력 부분에 문제가 있을 것이라고 생각하고, 계속 시행착오를 겪었습니다.
  • 하지만 본 문제에서 공백이 의미가 있다는 것을 생각해내기까지 참 오래 걸린 것 같습니다.
  • 이래서 무지성은 위험합니다.

소스 코드

const input = require("fs").readFileSync("/dev/stdin").toString().split("\n");

const checkString = (str) => {
	const arr = [0, 0, 0, 0];

	for (let i = 0; i < str.length; i++) {
		let ch = str[i].charCodeAt(0);

		if ("a".charCodeAt(0) <= ch && ch <= "z".charCodeAt(0)) {
			arr[0]++;
		} else if ("A".charCodeAt(0) <= ch && ch <= "Z".charCodeAt(0)) {
			arr[1]++;
		} else if ("0".charCodeAt(0) <= ch && ch <= "9".charCodeAt(0)) {
			arr[2]++;
		} else if (ch === " ".charCodeAt(0)) {
			arr[3]++;
		}
	}

	return arr.join(" ") + "\n";
};

const solution = (input) => {
	let res = "";
	for (let i = 0; i < input.length; i++) {
		if (input[i].length === 0) break;

		res += checkString(input[i]);
	}

	return res;
};

console.log(solution(input));