[프로그래머스] 레벨2 (level2) 카펫

2020년 05월 11일, 10:20

카펫

문제 설명

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]

처음에 풀었던 방식


brown과 yellow를 더해 brown+yellow의 약수를 구한다. 약수 중에서 가로의 길이가 세로의 길이보다 커질 때, [가로,세로] 배열을 리턴.

처음 코드

for (let i = 1; i < target; i++) {
  if (target % i === 0) {
    let garo = i;
    let sero = target / i;
    if (garo >= sero) {
      answer.push(garo);
      answer.push(sero);
      break;
    }
  }
}

문제점


정말 단순하게 생각했기 때문에 테스트 케이스를 틀렸다. 가로가 세로보다 커질때 리턴하는 것은 맞지만, brown의 개수와 yellow의 개수를 생각해주지 않으면 당연히 틀린 코드였다.

결론


처음에 풀었던 방식에 brown과 yellow의 개수를 체크해줬다.

완성 코드

function solution(brown, yellow) {
  var answer = [];
  let target = brown + yellow;
  let stack = [];

  for (let i = 1; i < target; i++) {
    if (target % i === 0) {
      let garo = i;
      let sero = target / i;
      if (garo >= sero && (garo - 2) * (sero - 2) == yellow) {
        answer.push(garo);
        answer.push(sero);
        break;
      }
    }
  }
  return answer;
}

아쉬운 점 & 느낀 점


처음에 약수를 생각하고 제한 조건을 고려하지 않고 코드를 짜서 처음에 생각한 코드가 나왔다. 코딩 테스트 준비를 하면서 문제들을 풀면서 이러한 경우가 많아서 테스트 케이스는 통과하고 정작 채점은 항상 틀린 경우가 많았다. 근데 이번에 카카오 인턴과 우아한 테크캠프 코딩 테스트 두 개를 다 봤는데, 카카오 인턴은 내가 낸 코드를 채점도 해줬지만 테크캠프는 채점하지 않고 제출만 하면 끝이였다. 최악에 상황에 항상 대비해야하니까 완벽하게 문제를 풀고 제출하는 습관을 길러야 겠다.