상세 컨텐츠

본문 제목

백준 8958번 OX퀴즈 c

알고리즘/C

by 초띠 2023. 4. 9. 14:11

본문

이 문제는 O는 1점, X는 0점이고 연속된 O만큼 점수가 증가하며, 최종 점수를 출력하는 문제입니다.

 

#include <stdio.h>
#include <string.h>

int main() {
  int T;
  int score;
  int total;
  char ox[81];

  scanf("%d", &T);

문자열로 OX퀴즈의 결과를 입력받을 것이기 때문에 <string.h>를 추가해줍니다. T는 테스트 케이스의 수이고 score은 문자열의 각 값을 비교해 점수를 결정할 것입니다. total은 출력할 최종점수, ox는 퀴즈의 결과를 입력받을 문자열입니다. 각 테스트 케이스는 길이가 0보다 크고 80보다 작다고 하여 ox의 최대 길이를 81이라고 했습니다.

 

테스트 케이스의 수를 입력받습니다.

 

for(int i = 1; i <= T; i++){
    scanf("%s", ox);
    total = 0;
    score = 1;

for문을 만들어 테스트케이스 수 만큼 OX퀴즈의 결과를 ox배열에 입력받습니다. 총점은 0점으로 초기화해주고, score은 1점으로 초기화해줍니다. score을 0점이 아니라 1점으로 초기화한 이유는 다음 코드에서 알 수 있습니다.

 

    for(int j = 0; j < strlen(ox); j++){
      if(ox[j] == 'O'){
        total += score;
        score++;
      }
      else if(ox[j] == 'X'){
        score = 1;
      }
    }

i for문 안에 j for문을 만들어서 점수 계산을 해줍니다. 문자열의 길이만큼, 즉 문자열의 끝까지 각 값이 O인지 X인지 비교합니다.

만약 O라면 score를 total에 더해주고 score를 1 증가시킵니다. 만약 X라면 스코어를 다시 1로 초기화하고 반복문의 조건식으로 돌아갑니다.

 

위에서 score를 0으로 설정했다면 배열의 값이 O일 때에 total에 0을 더하게 되기 때문에 1로 초기화했던 것입니다. X일 땐 위에서 증가했던 score의 점수를 다시 1로 초기화만 해주고 total값에는 변화가 없으니 0을 더한 것과 같기 때문에 문제가 없습니다.

 

    printf("%d\n", total);
  }
  
  return 0;
}

테스트케이스 수 만큼 결과의 총점인 total을 출력해주고 줄바꿈해줍니다. total값이 계속 중첩되지 않게 총점을 출력하고 나서 다시 위의 i for문 으로 돌아가서 total을 0으로 초기화해줍니다.

 

출력까지 모두 끝나면 프로그램이 종료됩니다.

 

이 문제는 다른 문제들에 비해서 어려운 편은 아니었지만 점수를 계산하는 방법을 생각해내는데 시간이 꽤 걸렸습니다. total 변수 없이 만들고 싶었지만 힘든 것 같습니다. 위 방법으로 이 문제를 풀 땐 score이나 total처럼 변수들을 초기화하는데 주의해야 합니다. 

관련글 더보기