인프런 커뮤니티 질문&답변

난나님의 프로필 이미지
난나

작성한 질문수

자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)

4. 졸업선물

이렇게 설정하면 안되는 이유

작성

·

193

0

answer을 선언하고나서 가만히 냅두고 굳이 cnt라는 변수를 줘서 마지막에 math해주는 이유를 잘 모르겠어서 그냥 처음부터 answer에 ++하도록 해줬습니다.
 
근데 저렇게 설정해서 코드 돌리니까 에러가 뜨네요
아래 코드처럼 하면 안되는 이유가 뭔가요?

<html>
  <head>
    <meta charset="UTF-8" />
    <title>출력결과</title>
  </head>
  <body>
    <script>
      function solution(m, product) {
        let n = product.length;
        product.sort((a, b) => a[0] + a[1] - (b[0] + b[1]));

        for (let i = 0; i < n; i++) {
          let money = m - (product[i][0] / 2 + product[i][1]);
          let answer = 1;

          for (let j = 0; j < n; j++) {
            if (j !== i && product[j][0] + product[j][1] > money) break;
            if (j !== i && product[j][0] + product[j][1] <= money) {
              money -= product[j][0] + product[j][1];
              answer++;
            }
          }
        }
        return answer;
      }

      let arr = [
        [6, 6],
        [2, 2],
        [4, 3],
        [4, 5],
        [10, 3],
      ];
      console.log(solution(28, arr));
    </script>
  </body>
</html>
이용해주세요.

답변 2

0

김태원님의 프로필 이미지
김태원
지식공유자

안녕하세요^^

자바스크립트 변수 유효범위를 생각하셔야 합니다. 님처럼 for 블럭 안에서 선언한 변수는 해당 블럭 안에서만 유효합니다. 

let n = product.length;
let answer;

위에 위치 처럼 solution 함수의 지역변수로 선언하시면 에러는 없어집니다.

하지만 에러는 없어지지만 이 코드는 오름차순으로 정렬한 상품중 마지막 상품을 할인받을 때를 무조건 답으로 하는 코드입니다.

아래는 입력은 [12, 1] 상품을 할인받아 5가 답입니다. 하지만 님의 코드는 [8, 6]을 할인받아 4가 나올겁니다.

let arr=[[86], [22], [43], [45], [121]];
  console.log(solution(41, arr));

 

 

0

부족하지만 조금이라도 도움이되셨길 바라며 아는대로 답변드리겠습니다.

우선 let, const 키워드가 block scope인것은 아실겁니다.

 

function solution(m,product){

// 여기서 let이나 const 키워드로 변수선언 및 할당했을 경우는 이 solution 함수 안의 중괄호 영역 안에서만 유효합니다.

}

 

그러나 만약 

function solution(m, product) {

  for(let i = 0; i < n; i++ {

    // 여기의 for문 안에서 let이나 const 키워드로 변수선언 및 할당했을 경우는 여기의 for문 안의 중괄호 영역 안에서만 유효합니다.

  }

}

도움이 되셨길 바랍니다


 

 

난나님의 프로필 이미지
난나

작성한 질문수

질문하기