출처: 프로그래머스
문제 설명
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] |
풀이과정
주어진 갈색과 노란색 타일 갯수 합을 구하고 중간에 약수만 찾아서 리턴해주면 답인줄 알았으나
제출 시 다른 테스트 케이스 실패 에러
처음에 작성한 코드
import java.util.*;
class Solution {
public int[] solution(int brown, int yellow) {
int[] answer = new int[2];
ArrayList<Integer> arrList = new ArrayList<>();
int sum = brown + yellow;
int half = 0;
for(int i = 1; i <= sum;i++ ){
if(sum %i == 0){
arrList.add(i);
}
}// for 모든 사각형의 수 구하기
half = arrList.size()/2;
if(arrList.size()%2==0){
answer[0]=arrList.get(half);
answer[1]=arrList.get(half-1);
}
else{
answer[0]=arrList.get(half);
answer[1]=arrList.get(half);
}
return answer;
}
}
수정 코드
import java.util.*;
class Solution {
public int[] solution(int brown, int yellow) {
int[] answer = new int[2];
int sum = brown + yellow;
// 세로 a 가로 b
int a, b = 0;
// 세로가 더 짧음
// (갈색타일 갯수 +4)/2 = 전체 가로 + 전체 세로
for(a=1; a<=sum; a++){
// 1.합의 약수 이면 일단 a가 세로길이 일 수 있음
if(sum % a == 0 ){
// 2. a를 이용하여 규칙에 따라 가로길이 구하고
b = (brown+4)/2 - a;
// 3. 구한 a,b(세로,가로)로 곱셈합(전체격자갯수)까지 체크되면 이것이 정답
if(brown + yellow == a*b){
answer[0] = a;
answer[1] = b;
}
}
}
return answer;
}
}
note
return answer 값
2 * (전체 가로 + 전체 세로) -4 = 갈색 타일 갯수
그러면,
(갈색타일 갯수 +4)/2 = 전체 가로 + 전체 세로
->약수 전부 구해서 약수 가운데 값 두개 혹은 하나(약수 갯수가 홀수개일때)가 정답
->전체 가로, 전체 세로인 약수 가운데 2개만 구하여 answer에 등록하면 됨
전체 가로와 세로는 격자 합의 약수는 맞으나
갈색 타일 구하는 과정이 규칙에 따라 구하지 않아서 테스트 케이스 에러난듯...
// 1. 합의 약수 이면 일단 a가 세로길이 일 수 있음
// 2. a를 이용하여 규칙에 따라 가로길이 구하고
// 3. 구한 a,b(세로,가로)로 곱셈합(전체격자갯수)까지 체크되면 이것이 정답
'머리맞대는이야기 > 프로그래머스 (JAVA)' 카테고리의 다른 글
| [연습문제] 약수의 합 (0) | 2020.08.28 |
|---|---|
| [summer/winter coding] 방문 길이 (0) | 2020.08.26 |
| [연습문제] 문자열 내 마음대로 정렬하기 (0) | 2020.08.25 |
| [탐욕법] 체육복 (0) | 2020.08.24 |
| [완전탐색] 소수찾기 (0) | 2020.08.22 |