Light Blue Pointer
본문 바로가기
Coding Test

[프로그래머스] 카펫

by Greedy 2024. 1. 8.

문제 주소

https://school.programmers.co.kr/learn/courses/30/lessons/42842

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 설명

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

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

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

제한사항

  • 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
  • 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
  • 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.

입출력 예

brown yellow return

10 2 [4, 3]
8 1 [3, 3]
24 24 [8, 6]

출처

※ 공지 - 2020년 2월 3일 테스트케이스가 추가되었습니다.

※ 공지 - 2020년 5월 11일 웹접근성을 고려하여 빨간색을 노란색으로 수정하였습니다.

입출력 예 1이랑 2는 한줄로 둘러싼걸 알겠음

brown 24 yellow 24인 경우는 뭐임

bbbbbbbb

byyyyyyyb

byyyyyyyb

byyyyyyyb

byyyyyyyb

bbbbbbbb

8 + 4 + 4 + 8 = 24

6*4 = 24

bw + yh + yh + bw = brown

yw*yh = yellow

돌아가야하는게 bw이랑 bh임

bw + bh-2 + bh-2 + bw = brown

(bw-2)*(bh-2) = yellow

이지만 계산은 yh yb가 편할거같다

yw+2 + yh + yh +yw+2 = brown

yw*yh = yellow

2yw + 2yh + 4 = brown

yw*yh = yellow

2yw = brown - 2yh -4

( brown - 2yh -4)*yh = yellow

brown*yh -2(yh)^2 -4yh = yellow

음 제곱이 나오는데 이거 되나…??

이거 수학처럼은 못 풀듯

for문 돌리면서 약수 개수대로 찾아가지고 가로에 +2 세로에 +0한거 두배로 해서 더하면 brown이 되는지 봐야할듯

정수인지 판별을 하자 일단

import java.lang.Math;
class Solution {
    public int[] solution(int brown, int yellow) {
        
        int width = 0;
        int height = 0;
        
        for(int i=1;i<=Math.sqrt(yellow);i++){
            
            double divDouble = (double)yellow/i;
            int divInt = yellow/i;
            double difference = divDouble - divInt;
            
            if(difference!=0){//약수가 아니면
                continue;
            }
            width = i;
            height = divInt;
            
            int count = 2*(width+2) + height;
            
            if(count == brown){
                break;
            }
        }
        
        int []  answer = {height+2, width+2};
        return answer;
    }
}

테스트 1 〉 통과 (0.02ms, 75.6MB)

테스트 2 〉 통과 (0.05ms, 70.9MB)
테스트 3 〉 통과 (0.10ms, 81.8MB)
테스트 4 〉 실패 (0.04ms, 75.9MB)
테스트 5 〉 통과 (0.04ms, 75.7MB)
테스트 6 〉 실패 (0.05ms, 72.9MB)
테스트 7 〉 실패 (0.11ms, 78MB)
테스트 8 〉 통과 (0.07ms, 78.5MB)
테스트 9 〉 실패 (0.11ms, 67.1MB)
테스트 10 〉 통과 (0.07ms, 73.9MB)
테스트 11 〉 통과 (0.03ms, 80.7MB)
테스트 12 〉 통과 (0.02ms, 73.3MB)
테스트 13 〉 통과 (0.02ms, 71.7MB)

• 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.

이 항목을 안 한 거 같음

import java.lang.Math;
class Solution {
    public int[] solution(int brown, int yellow) {
        
        int width = 0;
        int height = 0;
        
        for(int i=1;i<=Math.sqrt(yellow);i++){
            
            double divDouble = (double)yellow/i;
            int divInt = yellow/i;
            double difference = divDouble - divInt;
            
            if(difference!=0){//약수가 아니면
                continue;
            }
            width = i;
            height = divInt;
            
            int count = 2*(width+2) + height;
            
            if(count == brown){
                break;
            }
        }
        
        int []  answer = {Math.max(height+2, width+2),Math.min(height+2, width+2)};
        return answer;
    }
}

테스트 1 〉 통과 (0.04ms, 74MB)

테스트 2 〉 통과 (0.03ms, 77.9MB)
테스트 3 〉 통과 (0.09ms, 85.5MB)
테스트 4 〉 실패 (0.03ms, 81.2MB)
테스트 5 〉 통과 (0.05ms, 73.9MB)
테스트 6 〉 실패 (0.05ms, 74.7MB)
테스트 7 〉 실패 (0.12ms, 76.4MB)
테스트 8 〉 통과 (0.09ms, 79.8MB)
테스트 9 〉 실패 (0.11ms, 73.6MB)
테스트 10 〉 통과 (0.07ms, 82.9MB)
테스트 11 〉 통과 (0.04ms, 86.3MB)
테스트 12 〉 통과 (0.03ms, 75.1MB)
테스트 13 〉 통과 (0.04ms, 86.2MB)

오 지금보니 식을 잘못써둠

int count = 2*(width+2) + height;

int count = 2*(width+2) + 2*height;

로 고침

통과함

제출 코드

import java.lang.Math;
class Solution {
    public int[] solution(int brown, int yellow) {
        
        int width = 0;
        int height = 0;
        
        for(int i=1;i<=Math.sqrt(yellow);i++){
            
            double divDouble = (double)yellow/i;
            int divInt = yellow/i;
            double difference = divDouble - divInt;
            
            if(difference!=0){//약수가 아니면
                continue;
            }
            width = i;
            height = divInt;
            
            int count = 2*(width+2) + 2*height;
            
            if(count == brown){
                break;
            }
        }
        
        int []  answer = {Math.max(height+2, width+2),Math.min(height+2, width+2)};
        return answer;
    }
}