문제 주소
https://school.programmers.co.kr/learn/courses/30/lessons/42842
문제 설명
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;
}
}
'Coding Test' 카테고리의 다른 글
[프로그래머스] 괄호 회전하기 (0) | 2024.02.29 |
---|---|
[프로그래머스]귤 고르기 (1) | 2024.01.08 |
[프로그래머스]피보나치 수 (1) | 2024.01.08 |
[프로그래머스] JadenCase 문자열 만들기 (0) | 2024.01.08 |
[프로그래머스] 최댓값과 최솟값 (0) | 2024.01.08 |