문제 풀기/C#

79. 카펫

kagan-draca 2025. 2. 26. 17:16

 

기본 틀 :

using System;

public class Solution {
    public int[] solution(int brown, int yellow) {
        int[] answer = new int[] {};
        return answer;
    }
}

 

약수를 이용하면 쉽게 풀 수 있겠다는 생각을 했지만

 

정작 가로와 세로 길이를 구하는 부분에서 막혀 문제를 풀지 못 했다...

 

 

4, 6, 7 테스트를 케이스로는

 

brown = 18, yellow = 6

 

[18, 6] -> [8, 3] (o)
[18, 6] -> [6, 4] (x)

 

의 경우가 존재했다...

 

어떻게든 해결 방법을 모색했지만 해결 방법이 떠오르지 않아

 

옛날에 JavaScript로 모든 테스트를 통과한 코드를 바탕으로 C# 코드를 작성했다.

(오늘도 과거에 나에게 졌다...)

 

using System;
using System.Collections.Generic;

public class Solution {
    public int[] solution(int brown, int yellow) 
    {
        int sum = brown + yellow;
        
        List<int> div = new List<int>();
        List<int> mod = new List<int>();
        
        for(int i = 2; i <= (int)Math.Sqrt(sum);i++)
        {
            if(sum % i == 0)
            {
                div.Add(sum / i);
                mod.Add(i);
            }
        }
        
        int index;
        for(index = 0; index < div.Count; index++)
        {
            if((div[index] - 2) * (mod[index] - 2) == yellow ) break;
        }
        
        return new int[] { div[index], mod[index] };
    }
}

 

코드에서는 몫과 나누는 숫자를 각각 따로 리스트로 저장하고 있었다.

 

그리고 반복문으로 두 리스트를 조회하면서 

 

(div[index] - 2) * (mod[index] - 2) == yellow

 

인 경우를 찾고자 했다.

 

왜냐하면, yellow의 개수는 brown이 둘러 쌓고 있는 영약을 뺀 개수가 되기 때문에

 

div(가로)와 mod(세로) 각각 2를 빼 yellow의 개수가 같은 경우를 찾고자 했기 때문이다.

 

 

'문제 풀기 > C#' 카테고리의 다른 글

81. N개의 최소공배수  (0) 2025.02.28
80. 예상 대진  (0) 2025.02.28
78. 피보나치  (0) 2025.02.25
77. 이진 변환 반복하기 (Convert.int32, Convert.ToString)  (0) 2025.02.25
76. JadenCase 문자열 만들기  (0) 2025.02.25