

[문제난이도]
브론즈3
[헷갈리는 문법]
------------------------------------------------한 줄에 여러 숫자 입력받기-----------------------------------------------------------
해당 문제는 단계별 문제풀이 - 2차원배열 카테고리 안에 있는 문제이다.
그래서 2차원 배열을 선언하여 해결해야 하는 문제인데, 위의 화면과 같이 9X9로 이미 행렬의 사이즈가 정해져있기 때문에 동적할당을 할 필요도 없이 그냥 int arr[9][9]; 로 선언해주면 된다.
이 문제를 블로그에 기록한 이유는 C나 C++는 python과 달리 공백이 있는 문자열이나 숫자등을 인풋할 때 약간 헷갈려서 기억하기 위해서이다...ㅎㅎ
구글에 검색하다보면 C나 C++ 한 줄에 여러 숫자 공백입력받기 ..등의 질문이 많은 것을 보다 많이들 헷갈리시나보다하고 생각이 들었다. 어쨌거나 여러 방법이 있는데 나는 그중에 가장 간단한 방법을 택했다. (input 관련해서 나중에 포스팅하겠다.)

위는 이 문제의 코드 중 일부인데
백준의 문제를 풀다보면 배열 등의 원소를 한줄에 공백 등으로 나눠 입력받으라는 경우가 많은데,
예를 들어 갯수가 한정적일 때는 (ex. N=5)
Scanf("%d %d %d %d %d" , &a[0], &a[1] ,&a[2], &a[3], &a[4])
노가다?이지만 이런 식으로 입력받으면 된다.하지만 위의 문제와 같이 100개정도가 넘어가면 일일히 다 쓸 수도 없고 , 여러가지 복잡한 문제가 생긴다.
그래서 for문 등의 반복문 안에서 쓸 수 있도록
Scanf(" %d", &arr[i][j])
%d 앞에 공백을 준다. 이렇게 해야 개행을 무시하고 입력받을 수 있기 때문이다!
[자꾸 틀렸던 이유]
나는 이 문제를 계속 반복해서 3번이나 틀렸는데, 이상하게도 dev c++에서 런할 때는 답이 잘 나와서 정말 의아해했었다. 100%까지 갔음에도 마지막에서 틀렸음. 으로 나와서 정말 설렜다가 실망스럽기 그지없었다. 백준 의견게시판에 보니 나와 같은 궁금증을 가진 사람들이 많아보였는데, 한 분의 반례를 보고 깨달았다.

위 코드가 처음 작성했을 때 코드인데, 나중에서야 이 사례에 반례가 존재한다는 것을 깨달았다.예를 들어 모든 인풋값이 0이면 if 문 안이 모두 false 값으로 계산되기 때문에if안의 코드가 실행되지 못하고 넘어가게 된다.
따라서 if(arr[i][j] > max) 가 아니라 if( arr[i][j] >=max ) 로 수정해줬더니드디어 정답이라고 떴다...!
오늘의 교훈...반례를 항상 생각하며 풀자!!비교연산자의 = 도 고려하자...





















