BOJ[10820] - 문자열 분석 by JavaScript
문자열 분석
문제
언어
- JavaScript
순서도
- 각 문자열에 대해서 소문자, 대문자, 숫자, 공백의 개수를 세서 출력
문제 풀이 step 1
- 주어진 N 개의 문자열에 대해서 소문자, 대문자, 숫자, 공백의 개수를 세서 출력하는 문제로 크게 복잡한 것은 없습니다.
- 개수를 세는 방법에는
- charCodeAt() 메서드를 사용해서 추출한 code 값을 비교해서 세는 방법
"a".charCodeAt(0) <= ch && ch <= "z".charCodeAt(0)
- 바로 문자열 비교를 통해서 세는 방법
=
"a" <= ch && ch <= "z"
- charCodeAt() 메서드를 사용해서 추출한 code 값을 비교해서 세는 방법
- 위와 같이 기본적인 두 가지 방법과 추가적으로 더 있을 것입니다.
- 편한 방법을 사용해서 개수를 세서 출력 형식에 맞게 출력하면 정답입니다.
문제 풀이 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));