프로그래밍/백준

#1[못품]백준 풀기 8958 : 문자열이 싫어요 (feat. 엔터) - c 언어

량아이 2022. 7. 7. 16:04

이제 대학교에 입학하고 프로그래밍을 배우기 시작한지 어엇 반년째, 벌써 1학기라는 시간이 지났고 학점은 잘 받았지만 방학이 된 나에게는 아직 걸음마만 뗀 나의 코딩 실력만이 남아있었다.

 

일단 나의 목표는 개발자로 취업하는 것이었기에, 방학동안 백준문제 단계별로 풀어보기를 해보기로 했다.

 

이번에 풀어볼 백준문제는 3052번 패배를 맛보고 그 이후 번호의 8958 ox퀴즈 문제를 풀어보기로 하였다.

이 문제는 예전에 한번 풀어봤던 문제와 비슷했으나 그 문제는 0과 1로 이루어졌던 것이었고 이번엔 문자인 O와 X로 이루어져있다.

또한 그때 어떻게 풀었는지 지금은 전혀 생각이 나지 않는다

 

그래서 일단 처음부터 다시 생각해 보기로 했다.

 

 

전체적인 문제의 틀은 이렇다.

#include <stdio.h>
int main(){
    int a,i,hap;
    char ox;
    scanf("%d",&a);
    for(i=0;i<a;i++){ //a회 반복
        hap =0;
        for(int j=0;j<10;j++){
            scanf("%c", &ox); //이거 외않됌??ㅠㅠ
            
            if(ox=='o' || ox=='O'){ //대문자만 들어오겠지만 본인이 편하기 위해 소문자도 등록
                printf("1\n"); //우선 잘 작동하는지 확인
            }
            else if(ox=='x' || ox=='X'){
                printf("2\n");
            }
            hap++;
        }
        printf("%d끝",hap);
    }

나는 코드에 전혀 문제가 없다고 생각했었으나 실행해보면 정상적으로 작동하지 않았고

x를 5번만 입력했음에도 불구하고 그대로 프로그램이 종료되었다.

왜.....ㅠㅠㅠ

원인을 찾아내고자 여기저기 검색해본 결과 강의시간에 교수님께서 어렴풋이 말씀하셨던 문자열 scanf() 에서는 엔터도 문자로 인식한다고 했던것을 기억해냈고 scanf("(한칸 띄고)%d") 를 입력해 드디어 기본적인 틀이 잘 돌아가기 시작했다.

나는 프로그래밍 처음 배웠을때무터 문자와 문자열이 제일 싫었다.

 

자 지금부터는 본격적인 시스템을 만들어볼 차례

우선 cnt를 넣어준후 이전 문자와 같은 문자가 나왔을 경우 cnt++을 해주기로 했다

 

#include <stdio.h>
int main(){
    int a,i,hap,cnt=0;
    char ox, zen='x';//첫 문자 혼선방지 x미리 넣어주기
    scanf("%d",&a);
    for(i=0;i<a;i++){ //a회 반복
        hap =0;
        for(int j=0;j<10;j++){
            scanf(" %c", &ox); //o와 x입력받기
            if(ox=='o' || ox=='O'){ //대문자만 들어오겠지만 본인이 편하기 위해 소문자도 등록
                if(ox==zen){
                    cnt++;
                }
                else{
                    cnt=0; //연속된 o가 아닐경우 초기화
                }
                hap+=1+cnt; //hap에 누적
                zen=ox; //현재 문자와 이후 문자의 대조를 위해 zen에 입력
            }
        }
        printf("%d끝",hap);
    }
}

일단 대충 다시 짜보았으나 현재 제대로된 답이 나오지 않았다

뭐가 문제였던걸까

 

10이 나와야 정답

분석해본 결과

zen=ox; 를 if 안에 넣어서 오류났던거고 이후에도 여러가지 고쳐본 결과 프로그램은 원활히 돌아가게 되었지만,

#include <stdio.h>
int main(){
    int a,i,hap,cnt=0;
    char ox, zen='x';//첫 문자 혼선방지 x미리 넣어주기
    scanf("%d",&a);
    for(i=0;i<a;i++){ //a회 반복
        hap =0;
        for(int j=0;j<10;j++){
            scanf(" %c", &ox); //o와 x입력받기
            if(ox=='o' || ox=='O'){ //대문자만 들어오겠지만 본인이 편하기 위해 소문자도 등록
                if(ox==zen){
                    cnt++;
                }
                else{
                    cnt=0; //연속된 o가 아닐경우 초기화
                }
                hap +=1+cnt; //hap에 누적
            }
            printf("%d %d\n", hap, cnt);
            zen=ox; //현재 문자와 이후 문자의 대조를 위해 zen에 입력
        }
        printf("%d끝",hap);
    }
}

전혀 생각하지 못한 문제가 생겼다

바로 한줄에 ox가 총 10줄밖에 없는줄알았는데 문제를 잘 읽어보니 80이하란다....하.....

 

 

몇주전 설명 못알아먹었다가 욕 오지게 쳐먹었던 내 아픈 손가락을 되새겨보기로 했다.

while문에 scanf()를 넣을 수 있다는 거였는데 ==-1의 의미와 ==2의 의미를 이해하지 못했었다.

아니 근데 솔직히 걔가 설명 아리쏭하게 한거라고

 

그래서 반복문의 조건을 저 식을 이용해서 scanf에 문자가 들어왔을때로 바꾸기로 하였다

#include <stdio.h>
int main(){
    int a,i,hap,cnt=0;
    char ox, zen='x';//첫 문자 혼선방지 x미리 넣어주기
    scanf("%d",&a);
    for(i=0;i<a;i++){ //a회 반복
        hap =0;
        while(scanf(" %c", &ox) ==1){ //문자가 들어올때 트루
            if(ox=='o' || ox=='O'){ //대문자만 들어오겠지만 본인이 편하기 위해 소문자도 등록
                if(ox==zen){
                    cnt++;
                }
                else{
                    cnt=0; //연속된 o가 아닐경우 초기화
                }
                hap +=1+cnt; //hap에 누적
            }
            zen=ox; //현재 문자와 이후 문자의 대조를 위해 zen에 입력
        }
        printf("%d",hap);
    }
}

그리고 틀렸다

왜!!!!!!!!!!!

while(scanf(" %c", &ox) ==1) 이런걸 쓸때 정말 애매한게 xcode에서는 그냥 작동이 멈추기 때문에 어떻게 고쳐야할지 막막하다

printf("%d %d\n", hap, cnt);로 돌려본 결과 답은 잘 나온다

xcode terminal

비추얼 코드에 돌려본 결과 그저 에러만 뜨기에 이제까지 그냥 뻘짓을 한 것일지도 모른다

언젠간 풀겠지

 

일단 오늘 꼭 알아야 할 정의

1.문자입력에 엔터를 넣고싶지 않다면 %c 앞에 한칸 띄어주면 된다

2.while(scanf(" %c", &ox) ==1) 처럼 와일문에 scanf를 넣을 수 있다. 

3.문자열 보다 더 싫은게 나타났다