C# 카펫

sh·2023년 11월 30일

문제 설명

Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.

Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.

Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.

첫번째 로직

  1. brown과 yellow의 합의 약수들을 구한다
  2. 가장 가운데에 있는 약수 2개를 가져온다

손으로 일일이 경우의 수를 계산해봤을때 가운데 있는 2개의 숫자들이 답에 근접한다고 생각하여 이렇게 짰었는데, 몇가지 케이스에서 오류가 났다.

대표적인 케이스가 brown : 18 & yellow :6 이 주어졌을때.
위의 첫번째 로직대로 하면 18+6= 24
약수를 구하면 [1, 2, 3, 4, 6 ,8 ,12, 24]. 이 중에 가장 가운데 있는 값은 4와 6이다.
그러나 실제로 이대로 카펫을 그려보면 총 yellow 타일이 8개가 필요한데 주어진 yellow 타일은 6개로 에러가 발생한다.

그래서 조건을 하나 더 추가해주었다.

  1. 두 약수에서 각각 2를 뺀 값의 합이 yellow 타일 수와 같을때 return

brown타일이 yellow를 감싸는 형태로 그리기 때문에 가장자리의 값을 하나씩 빼서 정말 yellow 타일 갯수도 일치하는지 확인하는 조건.

전체코드

using System;
using System.Collections.Generic;

public class Solution {
    public int[] solution(int brown, int yellow) {
        int[] answer = new int[] {};
        List<int> l = new List<int>();
        List<int> ans = new List<int>();
        int sum = brown + yellow;
        for(int i = 1; i <= sum; i++ ){
            if(sum%i ==0){
                l.Add(i);
      
            }
        }
     
        if(l.Count%2 == 0){
            int a = (l.Count)/2;
            int b= ((l.Count)/2)-1;
            while((l[a]-2)*(l[b]-2) != yellow){
                a-=1;
                b+=1;
                
            }
            if(l[a]>l[b]){
                        
            ans.Add(l[a]);
            ans.Add(l[b]);    
            }else{
                ans.Add(l[b]);   
                ans.Add(l[a]);
            }
        }else{
            int a = (l.Count)/2;
            int b = (l.Count)/2;
            while((l[a]-2)*(l[b]-2) != yellow){
                a-=1;
                b+=1;
                
            }
            
            if(l[a]>l[b]){
                        
            ans.Add(l[a]);
            ans.Add(l[b]);    
            }else{
                ans.Add(l[b]);   
                ans.Add(l[a]);
            }

        }
        return ans.ToArray();
    }
}

보완할 점

중복되는 코드들이 많다.
특히 if와 else 문 안에 있는 while문은 완전히 똑같은 형태이기 때문에
이걸 하나로 합칠 방법을 찾아봐야겠다.

0개의 댓글