개발/코딩테스트

[백준 | JavaScript] 1152 단어의 개수

prpn97 2023. 5. 19. 17:36

<문제 설명>

영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열에는 몇 개의 단어가 있을까? 

이를 구하는 프로그램을 작성하시오. 단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다.

 

첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 

이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 공백 한 개로 구분되며, 

공백이 연속해서 나오는 경우는 없다. 또한 문자열은 공백으로 시작하거나 끝날 수 있다.

 

<입출력>

 

틀린 풀이

const fs = require("fs");
let input = fs.readFileSync(0).toString().trim()
let result = input.split(' ')
console.log(result.length)

공백을 기준으로 split해서 개수를 셌는데 틀렸다. 예제 입력2를 보니 맨 앞에 공백이 있어서

문제를 다시 살펴보니까 공백으로 시작, 끝날 수 있다고 한다. 

 

input에 처음에 trim을 해서 공백으로 끝나는 경우는 상관이 없고, 공백으로 시작하는 경우도

어차피 공백을 기준으로 나누었으니까 상관이 없지 않나? 하는 생각이 들었다. 

예제2번에서 공백으로 시작한다고 해도 공백을 기준으로 단어를 나누면 단어만 6개가 출력된다.

그런데 틀렸다고 한다. 왜일까?

 

공백을 기준으로 나눴을 때 공백만 있으면 어떻게 될까?

공백만 있으면 0이 출력되어야 하는데, 공백이 몇개가 있든, 1이 출력된다. 

그렇기 때문에 공백을 기준으로 split하되, split한 값 중 공백인 값은 카운트하지 말아야 한다. 

 

<맞은 풀이>

const fs = require("fs");
let input = fs.readFileSync("./input.txt").toString().trim()
let result = input.split(' ')
let answer = 0
for(let i = 0; i < result.length; i++){
  if(result[i]!==''){
    answer++
  }
}
console.log(answer)

 

<코멘트>

쉬운 문제인데, 정답률이 비교적 낮았다. 그냥 split하면 끝날거라고 생각해서 쉽다고 생각했는데,

결과적으로도 쉽긴 했지만 문제의 니즈를 파악해야 함을 곱씹을 수 있는 문제였다.

728x90