본문 바로가기

Algorithm/Brute-force

[C++] 백준 2858번 : 기숙사 바닥 (B2)

#문제

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

 

2858번: 기숙사 바닥

문제 상근이는 기숙사 생활을 한다. 상근이의 방의 크기는 L*W 이다. 수업시간에 타일 채우기 경우의 수를 계산하던 상근이는 자신의 방도 1*1크기 타일로 채우려고 한다. 이때, 가장자리는 빨간��

www.acmicpc.net

#풀이

문제를 읽고 문제에서 주어진 조건들을 수식으로 표현해서 적고 살펴보는 것이 중요하다. 그리고 주어진 수식들을 조합하여 얻을 수 있는 식들을 먼저 정리한다. 그리고 코드를 어떻게 구성할지 생각해본다. 이 문제의 경우, 두 가지 수식 WL-(W-2)(L-2)=R, (W-2)(L-2)=B을 통해 WL=B+R, W+L=2+R/2를 얻을 수 있었다.

정답이 유일한 경우만 주어진다고 했으므로 반복문을 통해 하나씩 살펴보며 정답인지 체크해보면 된다. 이 문제의 핵심은 R, B의 관점뿐만 아니라 L, W의 관점으로도 문제를 바라볼 수 있어야 한다는 점이다. 

#소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include<iostream>
using namespace std;
 
int main(void
{
    int L, W;
    int R, B;
    cin >> R >> B;
 
    int sum = B + R;//sum은 총 타일의 수
    int i, j;
 
    /*방정식을 풀면i+j가 2+R/2이고 R이 최대 5000이기 때문에
    i+j는 최대 2502이다. 그리고 i,j가 3보다 작으면 갈색타일이 0이되므로
    i,j는 반드시 3이상의 정수이다.
    */
    for (i = 3; i < 2500; i++) {
        //i는 W 또는 L
        j = (2 + R / 2- i;
        //j는 L 또는 W
        if (i*== sum)//정답일때
            break;
    }
 
    if (i > j) {
        L = i, W = j;
    }
    else {
        L = j, W = i;
    }
 
    cout << L << ' ' << W;
 
    return 0;
}
cs