백준 웹사이트 "8958번 - OX퀴즈" 문제풀이입니다.
언어는 C언어입니다. (제출 언어: C99)
문제
소스 코드
#include <stdio.h>
#include <string.h> // strlen의 이용을 위해
int main(void){
int N;
scanf("%d\n", &N);
for(int i=0; i<N; i++){
char quiz[80]; // 0보다 크고 80보다 작은 문자열
scanf("%s", quiz); // array names are pointers
int test_len = strlen(quiz); // sizeof quiz : 80, strlen(quiz) : 문자열의 실제 길이
int score[test_len];
for (int j=0; j<test_len; j++){
if(quiz[j]=='O'){ // 'O'일 경우, 앞의 것을 확인
if(j>=1 && quiz[j-1]=='O'){
score[j]=score[j-1]+1;
}
else{
score[j]=1;
}
}
else{ //'X'일 경우, score에 0 저장
score[j]=0;
}
//printf("%d\n", score[j]);
}
int sum=0;
for(int k=0; k<test_len; k++){
sum=sum+score[k];
}
printf("%d\n", sum);
}
}
문제 풀이
문자열을 입력받는 첫 문제입니다. C언어에서 문자열(string)은 곧 char의 배열입니다. 한 글자, 한 글자가 하나의 char이므로 만약 10글자짜리 input이라면 크기가 10인 char 배열에 저장할 수 있습니다. 이 문제에서는 Line 9에서 quiz라는 이름의 크기 80인 char 배열을 선언합니다. 그 후, Line 10에서 quiz에 저장할 문자열을 입력받습니다. 이때 특이하게도 quiz에 &가 붙지 않는 것을 확인할 수 있을텐데, 이것은 배열에 입력받을 때의 특징입니다. C언어에서는 '배열의 이름은 포인터이다'라는 규칙이 있는데, 평소에 &를 변수 앞에 붙였던 것은 그 변수의 포인터를 의미하였습니다. 배열의 경우는 이름 자체가 포인터이기에, &를 붙일 필요가 없는 셈이죠. 포인터의 개념은 매우 복잡하기에 이에 관해서는 추후에 더 다루겠습니다ㅎㅎ.
Line 10에서는 입력된 문자열의 길이를 확인하기 위해 'strlen'이라는 함수를 이용합니다. 이때 'sizeof quiz'를 이용하지 않는데, 그 이유는 Line 9에서 quiz를 크기 80의 배열로 이미 선언하였기에, sizeof를 이용하면 그 값이 80으로 뜹니다. 하지만 저희가 입력한 string이 크기 80의 배열을 모두 차지하지 않을 확률이 크죠? 예를 들어 입력 문자열이 'OOXXOXXOOO'이라면 80개의 배열 요소 중 앞의 10개만 사용하게 됩니다. 따라서 '10'이라는 문자열의 실제 길이를 구하기 위해 'strlen'의 함수를 <string.h>에서 가져와 이용합니다.
Line 13 ~ 27은 맞춘 문제의 점수를 계산하는 과정입니다. for문을 이용해 가장 앞 문제부터 하나씩 확인을 하며, 'O'일 경우와 'X'일 경우를 나누어 점수를 계산하고 저장합니다. 예를 들어 입력값이 'OOXXOXXOOO'일 경우, score[0]=1, score[1]=2, score[2]=0, ... score[9]=3이 저장됩니다.
마지막 Line 29 ~ 33에서는 전체 점수를 계산, 출력합니다. score이란 배열에 저장된 점수들을 각각 확인하고 'sum'이란 변수에 더함으로써 전체 합을 계산하죠.
'코딩 > 백준 BOJ' 카테고리의 다른 글
[백준/C언어] 15596번 - 정수 N개의 합 (0) | 2022.01.04 |
---|---|
[백준/C언어] 4344번 - 평균은 넘겠지 (2) | 2022.01.03 |
[백준/C언어] 1546번 - 평균 (0) | 2022.01.02 |
[백준/C언어] 3052번 - 나머지 (0) | 2022.01.01 |
[백준/C언어] 2577번 - 숫자의 개수 (0) | 2021.12.31 |