코딩테스트

[Programmers] 카펫

728x90

programmers.co.kr/learn/courses/30/lessons/42842

 

코딩테스트 연습 - 카펫

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

programmers.co.kr

약수를 통해서 푸는 건 알았지만, 로직에 오류가 생겼다.

풀이보니까 굉장히 간단하게도 풀 수 있던데 진짜 경외롭다. 

로직 오류 해결 완료


내 풀이 (미완)

public class Carpet0323 {

    public int[] solution(int brown, int yellow) {
      	int[] answer = new int[2];

        //yellow가 1이 아닌 제곱수라면 예) 4, 9 ...
        int square = (int)Math.sqrt(yellow)*10/10;
        if(yellow!=1 && yellow==square*square){
            //정사각형 모양 배치
            if((square*4)+4==brown){
                answer = new int[]{square, square};
                return answer;
            }
        }else{
            int prime = 0;
            List<Integer> innerWidth = new ArrayList<Integer>();

            for(int i=1;i<=yellow;i++){
                //약수 집합 구하기
                if(yellow%i==0){
                    prime++;
                    innerWidth.add(i);
                    //System.out.println("innerWidth"+innerWidth);
                }
            }

            //약수 갯수로 판단
            if(prime>2) {
                //카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.
                //내부 노란색의 최소 가로길이 : prime/2 번째
                for(int i=prime/2;i<prime;i++){
                    int y_Width = innerWidth.get(i);
                    int y_Height = yellow/innerWidth.get(i);

                    // brown => (yellow 가로+세로)*2 +4
                    if(brown==(y_Width+y_Height)*2+4){
                        answer = new int[]{y_Width+2, y_Height+2};
                        return answer;
                    }
                }
            }else{
                // yellow가 소수라면
                // 약수가 1과 자기자신 뿐이라면 예_7 (1*7)
                answer = new int[]{yellow + 2, 3};
                return answer;
            }
        }

        return answer;
    }
}

 

내 풀이 ( 완성 ✅ )

    public int[] solution(int brown, int yellow) {
        int[] answer = new int[2];

        int prime = 0;
        List<Integer> innerWidth = new ArrayList<>();

        for(int i=1;i<=yellow;i++){
            //약수 집합 구하기
            if(yellow%i==0){
                prime++;
                innerWidth.add(i);
            }
        }

        //약수 갯수로 판단
        if(prime>2) {
            for(int i=0;i<prime;i++){
                int y_Width = innerWidth.get(i);
                int y_Height = yellow/innerWidth.get(i);

                //카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.
                // brown => (yellow 가로+세로)*2 +4
                if(y_Width>=y_Height && brown==(y_Width+y_Height)*2+4){
                    return answer = new int[]{y_Width+2, y_Height+2};
                }
            }
        }else{
            // yellow가 소수라면  => 약수가 1과 자기자신 뿐이라면 예:7 (1*7)
            return answer = new int[]{yellow + 2, 3};
        }

        return answer;
    }

미완성 코드에서 카펫 노란색 부분이 정사각형일때를 따로 구분했던 내용을 지우고, 가로 세로 길이 관련 조건을 추가해주었더니 모든 테스트케이스를 통과하였다. 

 

 

 

풀이

import java.util.ArrayList;
import java.util.List;

class Solution {
    public int[] solution(int brown, int yellow) {
        for(int i=1; i<=yellow; i++) {
            if(yellow%i==0 && (yellow/i+i)*2+4==brown) {
                return new int[] {yellow/i+2, i+2};
            }
        }
        return null;
    }
}

아예 for문에서 약수확인이랑 brown 확인을 동시에 해주고 return 한 풀이

return 부분 가로 값을 어떻게 저렇게 생각해 낸 걸까

 

 

728x90