[코딩테스트]프로그래머스 - 카펫

Adela·2020년 5월 10일
1

프로그래머스

목록 보기
9/30
post-thumbnail

카펫

문제 설명

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

Leo는 집으로 돌아와서 아까 본 카펫의 빨간색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.
Leo가 본 카펫에서 갈색 격자의 수 brown, 빨간색 격자의 수 red가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한사항

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

입출력 예

brown	red	return
10	2	[4, 3]
8	1	[3, 3]
24	24	[8, 6]

해결한 나의 코드

function solution(brown, red){
	var sum = brown + red
    var answer = []
    
    for(var i=1; i<=red; i++){
    	if(answer.some(e => e[0] == i+2)) continue
        if(Number.isInteger(red/i){
        	answer.push([red/i + 2, i+2].sort((a,b) => b-a))
        }
    }
    
    answer = answer.filter(e => {
    	if(e.reduce((a,b) => a*b) == sum){
        	return e
        }
    })
    return answer.shift()
}

나의 알고리즘

  1. red를 인수분해 한다.
    1-1. 만약 red = 2 라면 --> [1, 2], [2, 1]
    1-2. 만약 red = 24 라면 --> [1, 24], [2, 12], [3, 8], [4, 6], [6, 4], [8, 3], [12, 2], [24, 1]
  2. 가로가 세로보다 같거나 크다고 했으니 x >= y 인 것들만 골라낸다.
    2-1. 만약 red = 2 라면 --> [2, 1]
    2-2. 만약 red = 24 라면 --> [6, 4], [8, 3], [12, 2], [24, 1]
    2-3. 만약 red = 9 라면 --> [3, 3], [9, 1]
    2-4. 나는 처음부터 내림차순으로 sort하며 값을 넣었고, 같은 값이 다음으로 넘어오면 코드를 무시하도록 continue를 해주었다.
  3. 전체 좌표는 red 좌표의 각 x, y를 +2 해준 값과 동일하다.
    3-1. red가 가운데에 위치하기 때문이다. 전체 좌표보다 양 끝에서 1씩 떨어져 있으니 x는 2만큼, y도 2만큼 작은 값이 된다.
    3-2. 만약 red = 24 라면 --> [8, 6], [10, 5], [14, 4], [26, 3]
  4. 각 x, y를 +2 해준 후 이를 곱한 값이 brown+red를 합한 값과 일치하는 것을 골라낸다.
  5. 고른 값은 [[8, 6]] 이런 식으로 되어있기 때문에 shift()로 빼서 return 한다.

물론 더 쉬운 방법도 있겠지만, 나는 이렇게 생각해냈다. 효율성이 좋은 코드인지는 잘 모르겠다 ㅎㅎㅎ 하지만 완전탐색 문제니까.. 그정도는 감안..? ㅎ

첫 코테를 봤는데, 어떤 부분이 부족하고, 어디를 더 중점해서 공부해야 할 지 감이 잡힌 것 같다. 결과는 겸허히 받아들이고, 이젠 작은 프로젝트도 하면서 다양하게 공부해야겠다.

profile
개발 공부하는 심리학도

0개의 댓글