BOJ 8958

 

오늘 풀어볼 문제는 OX퀴즈의 채점표를 보고 최종 점수를 출력해내는 코드를 구현하면 되는 문제입니다. 여기서 특별한 점은 문제를 연속해서 맞출 경우 더해지는 점수가 높아진다는 점입니다. 처음 맞춘 경우 1점이 더해지고, 두번째 연속으로 맞출경우 2점, 세번 연속 맞출 경우에는 3점이 오르는 시스템입니다. 하지만 여기서 중간에 한번 틀릴 경우 초기화가 되어 다시 1점부터 시작하게 됩니다. 제가 처음에 접근했을때는 '이전의 값이 X인지 O인지를 비교해서 풀면 되나?' 생각을 했었지만 그렇게 접근하는 것보다 간단한 방법이 있었습니다. 우선 string type으로 채점표를 입력 받은 뒤에 첫번째 문자부터 탐색해 나갈 것입니다. 여기서 int형 score 변수 하나를 선언해주고 0으로 초기화 해줍시다. 이제 문자열을 하나씩 검사할텐데 여기서 만약에 'O'가 들어왔을때는 score값을 1 증가시켜줍니다. 만약 반대로 'X'가 들어왔을 경우에는 score를 다시 0으로 되돌려줍니다. 그리고 이렇게 판별이 끝난 후에는 score값만큼 정답에 더해주면 됩니다.

아주 간단하게 풀리는 것을 볼 수 있습니다. 이해를 돕기 위해서 하단에 표로 어떻게 알고리즘이 돌아가는지 그리고 플로우차트까지 함께 첨부해 드리겠습니다.

플로우 차트


Example) OOXXOXXOOO

현재 문자

score

answer

O

1

1 (= 0 + 1)

O

2

3 (= 1 + 2)

X

0

3 (= 3 + 0)

X

0

3 (= 3 + 0)

O

1

4 (= 3 + 1)

X

0

4 (= 4 + 0)

X

0

4 (= 4 + 0)

O

1

5 (= 4 + 1)

O

2

7 (= 5 + 2)

O

3

10 (= 7 + 3)


이러한 알고리즘 형태로 돌아가게 됩니다. 요번 문제는 아주 간단하게 풀렸는데, 마지막으로 소스코드와 실행 결과 첨부하고 마치도록 하겠습니다.

#include <iostream>
#include <string>

using namespace std;

int main(){
    int T;

    scanf("%d", &T);

    for(int i = 0;i < T;i++){
        string problem;
        int score = 0;      // 현재 누적된 점수를 저장하는 변수
        int answer = 0;

        cin >> problem;

        for(int j = 0;j < problem.size();j++){
            if(problem[j] == 'O')
                score++;       // 정답을 맞을때마다 누적 점수를 1점씩 증가시킨다
            else
                score = 0;      // 오답일 경우 누적 점수를 0점으로 초기화
            answer += score;    // 현재 누적 점수를 정답에 더해준다
        }

        printf("%d\n", answer);
    }

    return 0;
}

결과창
채점 결과

+ Recent posts