프로그래머스 : 카펫

KHW·2021년 3월 9일
0

알고리즘

목록 보기
14/37

문제 : 카펫

100/100

기본적인 내용

테두리색은 갈색, 그 안의 색은 노란색으로 채울때 가로세로의 길이를 리턴

그냥 코드식을 세우면
a x b = brown + yellow
(a-2) * (b-2) = yellow
이 두식을 이용해서
a + b = (brown + 4)/2 를 알 수 있다.

나의 코드

function solution(brown, yellow) {
    const ab = brown+yellow;
    const a_Plus_b = (brown+4)/2;
    
    const valI = Math.ceil(ab**0.5);
    const valJ = a_Plus_b - valI;
    
    for(let i=valI,j=valJ;;i++,j--)
        if(i*j === ab && i+j === a_Plus_b)
            return [i,j]
}

위에서 말했듯이 aba_Plus_b를 찾아내고
해당 값의 valIa*b의 값이 최대일때를 기준으로 조금씩 a*b가 작아지면서 찾아냈다.
ex) valI가 ab가 25라면 valI가 5이므로 5부터 차근차근 찾아본다.

valI가 증가할수록 valJ는 감소시켜서 if문을 만족하는 것을 찾는 순간 리턴한다.

나의 다른 코드

function solution(brown, yellow) {
    const ab = brown+yellow;
    const a_Plus_b = (brown+4)/2;
    
    for(let i=a_Plus_b,j=0;;i--,j++)
        if(i*j === ab && i+j === a_Plus_b)
            return [i,j]
}

이렇게 i를 a+b, j를 0부터 시작해서 해도 문제는없더라
만약 효율성 문제도 고려했으면 위의코드가 좀더 빠르지않을까 그냥 생각해본다.

profile
나의 하루를 가능한 기억하고 즐기고 후회하지말자

0개의 댓글