[백준 | Javascript] 8958

박기영·2022년 5월 17일
0

백준

목록 보기
40/127

1차원 배열 6단계
8968번. OX퀴즈

문제

"OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수는 3이 된다.
"OOXXOXXOOO"의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다.
OX퀴즈의 결과가 주어졌을 때, 점수를 구하는 프로그램을 작성하시오.

입력

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

출력

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

예제 입출력

예제 입력

5
OOXXOXXOOO
OOXXOOXXOO
OXOXOXOXOXOXOX
OOOOOOOOOO
OOOOXOOOOXOOOOX

예제 출력

10
9
7
55
30

solution 1

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

const iter = Number(input[0]);

for(let i = 1; i <= iter; i++){
  	let sum = 0;
	let onlyO = input[i].split('X'); // ['OO', 'O', 'OOO']
  
	for(let j = 1; j <= onlyO.length; j++){
		let grade = onlyO[j-1].split('').length; // 2 -> 1 -> 3
      
      	for(let k = 1; k <= grade; k++){
        	sum += k;
        }
    }
	console.log(sum);
}

solution 2

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

let iter = Number(input[0]);

for (let i = 1; i <= iter; i++) {
  let count = 0;
  let sum = 0;

  for (let j = 0; j < input[i].length; j++) {
    if (input[i][j] === "O") {
      count++;
    } else {
      count = 0;
    }
    
    sum += count;
  }
  
  console.log(sum);
}

해설

  1. 입력된 배열을 split('X')한다. 그 배열을 또 다시 split('')한다. 그러면 O가 몇 개 연속되는지 길이를 알 수 있다. 연속되는 횟수만큼 1씩 증가시켜 sum에 넣어주면 된다.
  2. 구글링 결과 가장 많이 보이는 해답이다. 아무래도 2차원 배열을 사용하는 것 같은데...input[i][j]는 배열을 i개만큼 큰 덩어리를 조깨고, 큰 덩어리 안에는 j개의 원소를 가지는 것을 의미한다.
    첫 실행 시, "OOXXOXXOOO"는 i가 1이므로 1개로 조깨진다.(즉, 변화없음)
    j는 0~9까지 증가하면서 각각의 요소들을 체크하고, 요소가 O와 일치하면 count를 증가시키고 sum에 더한다.이를 O가 연속되는 횟수만큼 반복하며, 연속이 끊길 시 count는 0으로 초기화된다.
    이렇게 문제 횟수만큼 반복하면 끝!
    생각해보니 2차원 배열이라기에는 조금 이상한데, 문제를 푸는데는 전혀 문제가 없다..큰 덩어리로 나눈다는 것이 그렇게 비중있는 키워드는 아닌 듯하다.
profile
나를 믿는 사람들을, 실망시키지 않도록

0개의 댓글