ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 2562번 : 최댓값 (포인터 풀이)
    Language/C 2021. 6. 10. 17:14

    앞서 배열을 사용하여 풀이해 본 적 있는 문제이다.

    아주 간단하니 코드를 보고 이해해보자, 모르겠다면 배열로 먼저 코드를 짜 보고 포인터로 바꿔보면 좋다.

     

    #include <stdio.h>
    
    int main(void){
    
    	int arr[9];
    	int* p = arr;
    	int max = 0, maxnum = 0;
    
    	for (int i = 0; i < 9; i++) {	
    		scanf_s("%d", (p + i));
    		if (max < *(p + i)) {
    			max = *(p + i);
    			maxnum = i+1;
    		}
    	}
    	printf("%d\n", max);
    	printf("%d\n", maxnum);
    }

    문제는 풀었지만 필자가 매일 보면서 이해가 안 돼 궁금한 부분이 있었으니 한번 적어보겠다. 

    위의 코드에서는 for문 안에 scanf과 if문을 사용하였는데, 이 코드를 실행시키면 scanf를 for문 조건에 맞게 먼저 9개의 숫자를 입력받고 그다음 if문을 수행하게 된다.

    "왜 scanf는 9개의 숫자를 모두 입력받고 그 다음 if문을 수행시키는가?"가 필자가 의문을 가지는 부분이다.

    그래서 실험을 해봤다.

     

    #include <stdio.h>
    
    int main(void){
    
    	int arr[9];
    	int um[9];
    	int* p = arr;
    	int* u = um;
    
    	for (int i = 0; i < 9; i++) {	
    		scanf_s("%d", (p + i));
    		scanf_s("%d", (u + i));
    	}
    
    	for (int i = 0; i < 9; i++) {
    		printf("arr[%d] = %d\n", i, arr[i]);		
    	}
    
    	for (int i = 0; i < 9; i++) {
    		printf("um[%d] = %d\n", i, um[i]);
    	}
    	return 0;
    }
    

    다음과 같은 코드를 짜줬다.

    "for문안에 scanf가 두 개 있다면 위쪽에 위치한 scanf로 9개의 숫자를 입력받고, 다음에 아래쪽에 위치한 scanf로 그다음 9개의 숫자를 입력받는 것인가?"에 대한 답을 보여주는 코드이다.

     

     

    결과는 이렇게 나왔다. 결론은 9개를 연속으로 입력받는것이 아니란 것이다.

    scanf문이 서로 번갈아가면서 입력을 받는다, 그렇다면 scanf 아래 다른 문장을 써준다면 scanf가 하나를 입력받고 다음 문장을 실행시킨 뒤 다시 하나를 입력받는다는 것이다.

     

    이것에 대해 궁금해 google을 통해 검색을 해보았다. "for문 scanf" 라고 검색을 하였으며 답은 다음과 같다.

     

    "처음 scanf에 도달하면, 사용자가 엔터를 치기까지 프로그램은 대기 상태가 됩니다. 사용자가 엔터를 치면, 그때까지 입력한 내용이 입력 버퍼에 쌓이게 되고, 이때부터 프로그램이 실행을 재개해서 입력 버퍼에 있는 내용을 scanf가 읽게 됩니다. scanf는 정수 하나만 읽으라고 지시를 받았으니, 정수 하나만 입력 버퍼에서 빼내고 나머지는 남겨둡니다. 이후 반복문을 돌아 다시 scanf가 실행되었을 때는 입력 버퍼에 아직 내용이 남아있으니 대기 상태로 들어가지 않고 버퍼의 내용을 바로 빼옵니다."라고 한다. Um.....

    'Language > C' 카테고리의 다른 글

    C 재귀호출 (하노이탑)  (0) 2023.07.30
    백준 10809번 : 알파벳 찾기  (0) 2021.06.10
    5주차 문자열과 문자열 처리함수 과제  (0) 2021.06.01
    백준 1152번 : 단어의 개수  (0) 2021.06.01
    백준 2675번: 문자열 반복  (0) 2021.05.23
Designed by Tistory.