https://www.acmicpc.net/problem/8958
백준 8958번 문제
입력을 80자 안에서 아무렇게나 할 수 있어서
O나 X를 따로 구분하게 만들게 하기는 쉬웠는데 입력한 문자열의 길이가 다 제각각이라 어떻게 풀어야 할지 난감했다.
그래도 어떻게 문제를 풀어내긴 했지만 생각보다 코드가 길게 나왔다.
#include <stdio.h>
int main(void){
int num=0, count=0, result=0, i,j;
char sim[80];
scanf("%d",&num);
for(i=0; i<num; i++){
scanf("%s",&sim);
for(j=0; j<80 ; j++){
if(sim[j]!='O' && sim[j]!='X')
break;
else
if(sim[j]=='O'){
count++;
result+=count;
}
if(sim[j]=='X')
count=0;
}
printf("%d\n",result);
count=0;
result=0;
}
return 0;
}
짜고 나니까 굳이 for문을 두 개나 쓰고 0으로 초기화 하는 부분을 여러 군데 사용할 필요가 없을 것 같아서
다른 사람이 쓴 코드를 열람해 보았다.
main(i,s,t,n){
char a[81];
scanf("%d",&n);
while(n--){
scanf("%s",a);
for(s=t=i=0;a[i]!=0;i++){
if(a[i]=='O')s+=++t;
else t=0;
}
printf("%d\n",s);
}
}
이런 코드는 처음봐서 하나 하나 뜯어봤는데
맨 첫줄에 변수 4개가 int형으로 선언을 하지 않았는데도 그냥 정수형으로 변수가 선언되어 있었다.
그리고 while(n--) 부분이 인상적이었는데
나는 여태껏 while(1)의 경우만 항상 true값을 가지고 계속 반복되는 줄 알았는데 while(0)이 아니면 항상 true값을 가져서 n이 0이 될때까지 계속 반복시킬 수 있더라.
while 부분에서 최초 입력값을 받고
for문 선언 부분에서 s, t, i 변수를 반복을 시작할 때 마다 0으로 초기화를 시키니까 내가 짠 것 처럼 반복이 끝난 후에 result, count를 0으로 초기화 시키는 구문을 굳이 쓸 필요가 없었다.
그리고 어차피 필요한 값은 사실 O뿐이었기 때문에
X나 그 외의 값에 대해서 else처리로 빼면 되었기 때문에 처음 코드처럼 구체적으로 O의 경우, X의 경우를 다 입력해 줄 필요는 없었다.
마지막으로
count++;
result+=count;
내가 만들었던 방식이 틀린 건 아니었는데
s+=++t;
이렇게 s에 더해줄 부분을 전위연산자로 때려버리니까 코드가 한줄로 축약될 수 있었다.
코드를 작성한 후에 한번 더 살펴보면서 어떻게 하면 더 간단하게 짤 수 있을지 고민해보는 시간을 가지도록 하자.