카테고리 없음

오늘의 코드. 2.7일차 (백준/2566번 최댓값)

오늘의 코드 2024. 2. 6. 13:13
이번 문제는 보자마자 아이디어가 떠올라 신나는 마음으로 눌렀다. 

 

Baekjoon / Problem No. 2566  (최댓값)

 

Problem

<그림 1>과 같이 9×9 격자판에 쓰여진 81개의 자연수 또는 0이 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 행 몇 열에 위치한 수인지 구하는 프로그램을 작성하시오. 예를 들어, 다음과 같이 81개의 수가 주어지면

  1열 2열 3열 4열 5열 6열 7열 8열 9열
1행 1 41 48 47 68 12 54 69 70
2행 40 86 42 67 8 23 88 22 55
3행 30 66 29 9 46 87 53 10 71
4행 16 5 13 24 65 11 86 56 28
5행 78 21 59 3 57 45 90 27 72
6행 4 60 20 58 25 6 84 26 52
7행 61 43 44 49 19 83 64 17 85
8행 77 15 75 2 74 50 82 18 73
9행 15 76 62 79 63 80 7 81 51

 

이들 중 최댓값은 90이고, 이 값은 5행 7열에 위치한다.

Input

첫째 줄부터 아홉 번째 줄까지 한 줄에 아홉 개씩 수가 주어진다. 주어지는 수는 100보다 작은 자연수 또는 0이다.

Output

첫째 줄에 최댓값을 출력하고, 둘째 줄에 최댓값이 위치한 행 번호와 열 번호를 빈칸을 사이에 두고 차례로 출력한다. 최댓값이 두 개 이상인 경우 그 중 한 곳의 위치를 출력한다.


Solution 1

이때까지 수많은 시간초과의 뒤통수를 맞아온 나이기에, 이번에는 본능적으로 2차원 배열 따위를 써서는 안된다는 걸 감지했다. 

이 문제에서 바라는건 최댓값, 그리고 행과 열 뿐이다. 그말은 배열에 넣고 벡터에 넣고 자시고 할 필요도 없이 입력받을 때마다 이전에 입력받은 값과 지금 입력받은 값을 비교하여서 더 큰 값을 최댓값으로 저장하고, 그 행과 열 번호도 역시 저장하면 된다. 

 

이 방식으로 하면 무려 실행시간이 0ms가 나온다.

 

이번엔 나의 승리다. 백준. 자세한 내용은 주석을 참고하라구.

#include <cstdio>

int main()
{
    int i,j;
    int mx, my = 1;  // 최댓값이 있는 행, 열
    int now, max = 0;  // 각각 현재 입력되는 값, 최댓값을 저장하는 변수

    for(i=0;i<9;i++)
    {
        for(j=0;j<9;j++)
        {
            scanf(" %d", &now);
            if(max<=now)  // 같은 값이 들어오는 경우를 위해 등호를 포함시킨다. 
            {
                max = now;
                mx = i+1;  
                my = j+1;  // i가 0부터 시작하므로 +1을 하여 문제조건과 맞춰준다.
            }
        }
    }
    printf("%d\n", max);
    printf("%d %d", mx, my);
}

 

 


Code

위 코드에 대한 사진이다.


Review

그래도 나름 며칠동안 백준한테 당하기만했는데 아이디어가 한눈에 보이는 걸 보면 며칠사이에 조금씩 나아지고 있는게 아닐까? 라고 생각해본다. 뿌듯하다.

코딩 고수들 입장에서는 "뭐 이런걸 가지고" 겠지만, 지금의 나에게는 "이만큼 씩이나?" 니까.