Computer Engineering/알고리즘 테스트
프로그래머스 코딩테스트 문제: 카펫
말하는호구마
2020. 4. 14. 03:48
프로그래머스 level2의 문제이다.
level2문제치고 쉬운편이었던 것 같다
고등학교때 정말 자주 봤었던 유형의 문제이다...!
그래서인지 너무 처음에 너무 수학적으로 접근했었던 것 같다.
다른 사람들의 답안을 보니까 다들 간결하게 쓴 것 같다.
나같이 푼사람은 ....못본 것 같다....
import java.util.*;
class Solution {
public int[] solution(int brown, int red) {
int[] answer = new int[2];
boolean flag=true;
ArrayList<Integer> arr=new ArrayList<>();
for(int i=red;i>0;i--){
if(red%i==0){
for(int j=0;j<arr.size();j++){
if(i==arr.get(j)){
flag=false;
break;
}
}
if(flag==false){
flag=true;
break;
}
arr.add(i);
arr.add(red/i);
}
}
for(int i=0;i<arr.size();i+=2){
if((arr.get(i)+2)*2+(arr.get(i+1)+2)*2-4==brown){
answer[0]=arr.get(i)+2;
answer[1]=arr.get(i+1)+2;
break;
}
}
return answer;
}
}
for문을 돌면서 red의 숫자의 곱셈쌍을 찾는다.
(예를 들어, red가 12라면 (12,1),(6,2),(4,3)의 쌍으로 구성되어 있다).
이때 중요한 것은 가로의 길이가 세로의 길이보다 같거나 길기 때문에, 숫자의 끝부터 시작해야한다.(가로의 길이를 먼저 넣고 싶어서)
for문을 돌며 red의 약수인 수를 만났을 때 (red%i==0) 이 숫자가 숫자쌍 배열에 들어가있는지 검사를 하기 위해 for문을 한번 더 돌린다
( (4,3)와 (3,4)는 어처피 똑같다. 하지만 애초에 걸러야한다. 가로의 길이가 더 길기 때문에)
만약 i가 이미 배열에 들어가 있는 수라면 가로의 길이가 세로의 길이보다 작아지는 순간이기 때문에 flag를 이용해 for문을 모두 멈춘다.
마지막으로 고등학교 때 배웠던 수학식을 적용시켜본다!!
(red의 가로 길이+2)*2 + (red의 세로 길이+2)*2 -4= brown
위의 식이 성립되어야 한다.
이 조건이 만족하는 i를 찾으면 더이상 반복문이 도는 것을 방지하기 위해 break하고 끝내준다.