[백준] JavaScript 8958번 OX퀴즈

Noma·2021년 8월 31일
0

Question

[백준] JavaScript 8958번 OX퀴즈

input

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

output

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

example

5
OOXXOXXOOO
OOXXOOXXOO
OXOXOXOXOXOXOX
OOOOOOOOOO
OOOOXOOOOXOOOOX


10
9
7
55
30


Solution 1

입력값을 정제해서 ['OOXXOXXOOO','OOXXOOXXOO','OXOXOXOXOXOXOX','OOOOOOOOOO','OOOOXOOOOXOOOOX']와 같이 만든 후 map을 이용해서 각 요소의 점수로 이루어진 새로운 배열을 만들어 \n으로 join하여 한번에 출력한다.

console.log(require('fs').readFileSync('/dev/stdin').toString().trim().split('\n').slice(1)
     .map(e=>{ //e='OOXXOXXOOO'
        let count=0;
        return e.split('') //['O','O','X','X',...]
          .map(e=>{ //e='O',e='O',e='X',..
            count=(e==='O'?count+1:0);//'X'를 만나면 점수 누적 초기화
            return count; 
        }) //[1,2,0,0,1,0,0,1,2,3]
        .reduce((prev,curr)=>prev+curr); //10
     }).join('\n')
);

Solution 2

for문을 중첩하여 sum에 count를 누적해 하나의 'OOXXOXXOOO' 요소의 점수가 계산되면 바로 바로 출력한다.

const [n,...arr]=require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');
for(let i=0;i<n;i++){
    let count=0;
    let sum=0;
    for(let j=0;j<arr[i].length;j++){
        arr[i][j]==="O"?count++:count=0;
        sum+=count;
    }
    console.log(sum);
}

What I learned

  • n과 요소들이 입력값으로 들어올 때 굳이 n이 필요 없으면 slice(1)로 잘라내자.
  • 같은 단어를 만날때 점수가 점점 커지는 경우(여기선 'O') count를 누적시키고, 다른 단어를 만났을 때(여기선 'X') count를 0으로 초기화 시켜주면 된다.
profile
오히려 좋아

0개의 댓글