본문 바로가기
경일/Javascript

[문제풀이] 짱구의 마스크 소분

by dev_kong 2022. 1. 3.
728x90
728x90

문제설명.

짱구가 마스크를 소분 하는 작업을 한다.

마스크를 담을수 있는 봉투에는 두가지 종류가 있는데,

하나는 5개의 마스크를, 나머지 하나는 3개의 마스크를 담을 수 있다.

총 마스크 갯수 n개가 주어졌을 때,

최소한으로 사용하는 봉투의 갯수를 return 하는 함수를 작성하라.

 

단, 봉투에 딱 떨어지게 담겨지지 않는 경우는 -1을 return 한다.

 

접근방법.

쉬울줄 알았는데 어려웠다.

우선 얼리리턴을 할 수 있는 경우를 생각해봤다.

1. n이 5의 배수인 경우 에는 n/5를 리턴하면 되고

2. n이 3보다 작거나, 4인경우에는 -1을 리턴하면 된다.

 

나머지의 경우는 for 문으로 5씩 빼면서 answer 에 1을 더하고,

남은 수가 3으로 나눠지면 n/3으로 나눈 값을 answer에 더해주면 되지 않을까...?

 

function solution(n) {
  let answer = 0;
  if (!(n % 5)) return n / 5;
  if (n < 3 || n === 4) return -1;

  for (let i = 1; i <= n / 5; i++) {
    let remainMask = n;
    remainMask -= 5 * i;
    answer += 1;

    if (!(remainMask % 3)) return answer + remainMask / 3;

    if (remainMask < 5 && remainMask % 3) return -1;
  }
}

 

맞춘 줄 알았다.

맞는지 확인하려고 숫자 이것저것 넣어보면서 확인을 했는데,

 

function solution(n) {
  let answer = 0;
  if (!(n % 5)) return n / 5;
  if (n < 3 || n === 4) return -1;

  for (let i = 1; i <= n / 5; i++) {
    let remainMask = n;
    remainMask -= 5 * i;
    answer += 1;

    if (!(remainMask % 3)) return answer + remainMask / 3;

    if (remainMask < 5 && remainMask % 3) return -1;
  }
}

console.log(solution(41)); // 13

41을 넣으니까 13이 나온다.

원래 출력 되어야 하는 수는 5*7 + 3*2 =41 즉, 9가 출력되어야 한다.

이 풀이법으로 걸러내지 못하면 다른 풀이법을 생각했어야 됐는데,

여기에 매몰돼버려서 다른 풀이법을 찾을 생각을 하지 못했다.

이걸 넣으면 되나? 이걸 추가하면 되나 하면서 시간만 계속 보내고 결국 주어진 시간내에 답을 찾지 못했다.

 

여러가지 해답들이 있었지만 가장 기억에 남는코드를 적어보자면,

 

function solution(n) {
  for (let i = 0; i < 1000; i++) {
    if (!(n % 5)) {
      return n / 5 + i;
    } else if (n > 0) {
      n -= 3;
    } else return -1;
  }
}

보고 천잰가 싶었다.

비록 이제 막 문법을 배우는 단계라 완벽한 문법은 아니어서 문법은 내가 수정 했다지만, 

저렇게 계산을 했다는게 너무 놀라웠다.

항상 느끼는 거지만, 나는 이런식으로 논리적인 연산을 하는 부분이 많이 약하다고 다시한번 느꼈다.

하루에 하나 이상씩 코테 풀어야지....

 

728x90
728x90

댓글