[BAEKJOON] 백준 2858: 기숙사 바닥 (C#)

2024. 6. 4. 16:13IT/BaekJoon

문제 링크

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

 

 

문제

상근이는 기숙사 생활을 한다. 상근이의 방의 크기는 L×W 이다.

수업시간에 타일 채우기 경우의 수를 계산하던 상근이는 자신의 방도 1×1크기 타일로 채우려고 한다. 이때, 가장자리는 빨간색으로, 나머지는 갈색으로 채우려고 한다.

아래 그림은 상근이의 방의 크기가 4×3일 때 이다.

어느 날 상근이네 방에 하근이가 놀러왔다. 하근이는 아름다운 타일 배치에 감동받았다. 다시 방으로 돌아온 하근이는 빨간색과 갈색 타일의 개수는 기억했지만, 방의 크기는 기억해내지 못했다.

빨간색과 갈색 타일의 개수가 주어졌을 때, 상근이 방의 크기를 구하는 프로그램을 작성하시오.

 

 

입력

첫째 줄에 빨간색 타일의 수 R과 갈색 타일의 수 B가 주어진다. (8 ≤ R ≤ 5000, 1 ≤ B ≤ 2,000,000)

 

 

출력

첫째 줄에 상근이네 방의 크기 L과 W을 공백으로 구분하여 출력한다. 만약, 두 수가 다르다면, 큰 수가 L이 되고 작은 수가 W이 된다. 항상 정답이 유일한 경우만 입력으로 주어진다.

 

 

 

통과한 답안

namespace _2858
{
    internal class Program
    {
        static void Main(string[] args)
        {
            string[] inputs = Console.ReadLine().Split(' ');
            int R = int.Parse(inputs[0]);
            int B = int.Parse(inputs[1]);

            List<int> BList = CheckB(B);

            int a = 0;
            int b = 0;

            for (int i = 0; i < BList.Count; i++)
            {
                b = BList[i];
                a = B / BList[i];
                if (4 + 2 * a + 2 * b == R)
                {
                    break;
                }
            }


            Console.WriteLine($"{a + 2} {b + 2}");
        }

        static List<int> CheckB(int B)
        {
            List<int> result = new List<int>();

            for (int i = 1; i <= B; i++)
            {
                if (B % i == 0)
                {
                    result.Add(i);
                }
            }

            return result;
        }
    }
}

 

1x1 타일로 구성된 바닥의 가장자리의 개수와 나머지의 개수를 알 수 있을 때,

해당 바닥의 가로와 세로를 구하는 문제이다.

 

갈색 바닥(가장자리를 제외한 안쪽 바닥)의 가로를 a, 세로를 b라고 하면

B = a * b가 되며

R = 4 + (2 * a) + (2 * b)가 된다.

이들을 이용하여 문제를 해결할 수 있는데,

 

B = a * b라는 부분에서 a와 b가 될 수 있는 숫자들을

CheckB라는 메서드를 이용하여 리스트로 가져온 후에

 

해당 리스트에 존재하는 a와 b 값을 이용하여

R = 4 + (2 * a) + (2 * b)

를 만족하는 a와 b를 구하도록 구현하였다.

이 때, 가로의 길이가 더 길어야되므로

for 문은 증가하는 방식을 취했으므로 b를 BList[i]로 가져오고

a를 B / BList[i]로 가져오도록 구현하였다.

 

이 방법은 B를 소인수분해하여 나오는 값들을 이용하여

B의 가로와 세로를 구하고 이를 가지고 조건에 만족하는지 판단하는 방식으로 작동한다.