백준: Silver3① - 1003, 1004, 1051, 1057

1 분 소요


</br> 실버 3 문제들~

단순 구현에서 이제 나름 dp나 이분탐색도 나온다.
</br>

1003: 피보나치 함수

https://www.acmicpc.net/problem/1003

재귀식 피보나치 함수에서 0과 1을 얼마나 호출하는 지 계산하기

int dp[41][2];


    dp[0][0] = 1; dp[0][1] = 0;
    dp[1][0] = 0; dp[1][1] = 1;

    for(int i = 2; i < 42; i++){
        dp[i][0] = dp[i-1][0] + dp[i-2][0];
        dp[i][1] = dp[i-1][1] + dp[i-2][1];
    }

    for(int i = 0; i < n; i++){
        int a;
        cin >> a;

        cout << dp[a][0] << ' ' << dp[a][1] << endl;

    }

간단하게 dp로 구할 수 있다. 앞부분 조금만 적어 보면 이차원으로 가능.

그런데 다른 사람 코드를 보니 0의 출력 횟수와 1의 출력 횟수의 인덱스 차이가 1씩 나고 완전히 같아서 일차원으로 만든 것도 있더라.
</br>

1004: 어린 왕자

https://www.acmicpc.net/problem/1004

제일 적게 원을 통과해서 도착하기

    for(int i = 0; i < t; i++){
        int x1,y1, x2,y2, n, cnt = 0;
        cin >> x1>>y1 >> x2>>y2 >> n;

        for(int j = 0; j < n; j++){
            int x, y, r;
            cin >> x >> y >> r;

            if( dist(x,y, x1,y1) < r && dist(x,y, x2,y2) > r ){
                cnt++;
            }
            else if( dist(x,y, x1,y1) > r && dist(x,y, x2,y2) < r ){
                cnt++;
            }
        }

        cout << cnt << endl;
    }

경로를 다 계산해야 하는 게 아니므로, 그냥 출발지와 도착지가 서로 원 안팎에 있는 지만 확인해 주면 된다.
</br>

1051: 숫자 정사각형

https://www.acmicpc.net/problem/1051

이차원 배열을 입력 받고 가장 큰 정사각형 만들기

    int ans = 0;
    for(int i = 0; i+ans < n; i++){
        for(int j = 0; j+ans < m; j++){
            for(int k = 1; i+k < n && j+k < m; k++){
                if( mmap[i][j] == mmap[i+k][j]
                    && mmap[i][j] == mmap[i][j+k]
                    && mmap[i][j] == mmap[i+k][j+k] ){
                    ans = max(ans, k+1);
                }
            }
        }
    }
    if( ans == 0 ) cout << 1 << endl;
    else cout << ans*ans << endl;

하나씩 검사해 주면 된다. 각 모서리가 모두 같은 지를 확인하고 ans를 업데이트한다.

만약 ans가 업데이트 되지 않았다면 최소 정사각형은 1이다.
생각해보니까 그냥 ans를 처음에 1로 초기화하면 되네
멍청하면 코드가 늘어난다
</br>

1057: 토너먼트

https://www.acmicpc.net/problem/1057

나도 친구도 무조건 이긴다면 친구랑 몇 강에서 붙게 될까?

    int cnt = 0;
    while( kim != im ){
        kim = (kim+1) / 2;
        im = (im+1) / 2;
        cnt++;
    }
    cout << cnt << endl;

선수들의 번호는 (1, 2) -> 1, (3, 4) -> 2, … 식이므로 (번호+1)/2와 같다.
그냥 그대로 세 주면 됨
</br>


딱히 이전 난이도랑 구분은 안 되는 문제들이다.
쉬우니 좋다
</br>

댓글남기기