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