[boj node.js] 백준 8958번 OX퀴즈javascript

V·2021년 7월 8일
0
post-thumbnail

출처 : https://www.acmicpc.net/problem/8958

문제

"OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수는 3이 된다.

"OOXXOXXOOO"의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다.

OX퀴즈의 결과가 주어졌을 때, 점수를 구하는 프로그램을 작성하시오.

입력
첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 길이가 0보다 크고 80보다 작은 문자열이 주어진다. 문자열은 O와 X만으로 이루어져 있다.

출력
각 테스트 케이스마다 점수를 출력한다.

예제 입력 1
5
OOXXOXXOOO
OOXXOOXXOO
OXOXOXOXOXOXOX
OOOOOOOOOO
OOOOXOOOOXOOOOX
예제 출력 1
10
9
7
55
30

풀이

전략

  • 입력받은 케이스 수와 각 케이스를 차례로 배열로 담아서
  • 하나씩 가져와서
  • O이면 n++, X 이면 n=0 을 새로운 배열에 추가.
  • 완성된 배열의 모든 값을 더한다. : reduce
  • 더한 값을 출력
  • 이 과정을 모든 요소에 적용

풀기 전에 적은 의사코드. 아래처럼 코드로 옮기다 보면 디테일은 항상 사전에 예상하지 못하는데 내가 잘 하고 있는건가?
아무튼 아래는 풀이.


const fs = require('fs');
const input = fs.readFileSync('dev/stdin').toString().trim().split('\n');
const caseNum = +input[0];
for(i=1;i<=caseNum;i++){
    let n = 1;
    let arr = [];
    input[i].split('').forEach((el) => {
        if(el === 'O'){
        arr.push(n);
        n++;
        } else {
        n = 1;
        }
    })
    let sum = arr.reduce((pre,cur) => {return pre+cur});
    console.log(sum);
}

연속되면 크리티컬 증가! 아니면 초기화.

const fs = require('fs');
const input = fs.readFileSync('dev/stdin').toString().trim().split('\n');
const caseNum = +input[0];
for(i=1;i<=caseNum;i++){
    let n = 0;
    let sum = 0;
    input[i].split('').forEach((el)=>{
        if(el === 'O'){       
        n++;
        sum += n;
        } else {
        n = 0;
        }
    })
    console.log(sum);
}

배열을 생성하지 않고 계속 더해주는 방식으로 풀이도 가능하다.

profile
블로그 이전중 https://sungbeen.com

0개의 댓글