함수에서 return의 역할은?

jinew·2024년 12월 20일

🍎 Javascript

목록 보기
4/22
post-thumbnail

이번 알고리즘 코드카타는 일단 문제부터 이해가 안 가서 문제만 5분 넘게 읽은 것 같다 😥 간신히 이해하고 밍기적 밍기적 한 줄씩 써가다.. 얼떨결에 완성..! 을 했는데???????
vscode에서 작업했을 땐 멀쩡히 잘 찍히는 값들이 프로그래머스로 옮겨서 실행하면 undefined가 뜨는 거다☠️
계속 눈만 꿈뻑거리면서 뭐가 문제인지를 한참 고민하다 허무하게 해결하고 남기는 오늘의 삽질 기록... 🙄
오늘의 허당짓을 찾아준 GPT에게 무한한 감사를 남기며,. 샤라웃투지피티



[오늘의 문제 / 약수의 개수와 덧셈]

두 정수 leftright가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.



  • 뭔 소리야 이게.. 하고 한참 읽다 ① left 이상 right 이하의 모든 숫자(num)의 약수를 찾고 ② 그 약수의 개수가 몇 개인지 따져서 ③ num을 더하거나 빼라
    로 파악 완료

  • 나의 풀이 ① (문제의 코드)

  function solution(left, right) {
    let answer = 0;
    let rangeNum = [];

    for (let i=left; i<=right; i++){
      rangeNum.push(i);
    }

    rangeNum.forEach(function(val,index){
      const divisorCount = findDivisor(val);

      // 약수의 개수가 짝수면 더하고 홀수면 뺌
      if(divisorCount % 2 === 0) { 
        answer += val;
      } else {
        answer -= val;
      }
    });

    console.log(answer);
  }

  function findDivisor(num){
    let count = 0

    for (let j=0; j<=num; j++){

      if(num % j === 0) count ++;
    }

    return count;
  }

  solution(13, 17); // console ==> 43, 
					//프로그래머스 ==> undefined
  solution(24, 27); // console ==> 52
					//프로그래머스 ==> undefined

1. left 이상 right 이하의 모든 숫자 찾기

  • 반복문을 사용해 범위의 숫자를 찾고 rangeNum 배열에 넣어줬다. 굳이 배열에 넣은 이유가 있냐고 물을 수 있지만 뭔가 각 함수나 구문별 역할을 확실하게 하고 싶었달까? 가독성 측면에서 이렇게 짜봤다.
  • 배열을 만들지 않고 바로 그 안에서 반복문을 돌려 약수를 찾을 수도 있지만 그렇게 되면 반복문 안에 반복문 안에 반복문 ‥ 이런 화려하고 가독성 후진 방식으로 짜고 싶진 않았다..... 늘 말하듯 나의 목표는 유지보수가 쉬운 코드를 짜는 개발자가 되는 것이기 때문 ..
  • 이렇게 하지 않고도 가독성 좋은 방법이 있다면 배워보고 싶다!

2. 약수의 개수가 몇 개인지 찾기

  • findDivisor() 함수를 만들어 약수의 개수를 찾아줬다. count라는 변수를 만들어서 약수에 해당할 때마다 count를 ++ 해주어 return한다.

3. 약수의 개수를 판별하여 합산하기

  • rangeNum 배열에 있는 요소들을 forEach를 돌려 약수 개수를 찾는 함수 findDivisor()를 각각 먹여준다. findDivisor()에서 returncount 값이 홀수이면 누적값에서 빼고, 짝수이면 누적값에 더한다.

암만 봐도 잘 작동된다. 콘솔에 정답인 '43'과 '52'가 멀쩡히 찍히는데..! 왜 프로그래머스에 복붙만 하면 undefined가 뜨는지 도무지 알 수 없음 진짜진짜로 왜지..? 하면서 일단 console.log(answer) 부분을 지웠다. 콘솔은 일단 프로그래머스에 안 뜨니까.. 근데 이걸 지우면서도 결국 return 되는 answer 값이 없다는 걸 깨닫지 못함 😒


한참 고민하다 '근데 잠깐만,, 다 계산된 answer값이 어디서 출력되지?..' 라고 의아해하면서 GPT한테 도움을 구했더니 return값이 없어서 그런거랜다. 이 때 진짜 콧방귀 뀜 바본가? 아니다 말을 말자 ,... 이참에 return 공부나 더 해..

  • 나의 풀이 ② (개선된 코드)
  function solution(left, right) {
    let answer = 0;
    let rangeNum = [];

    for (let i=left; i<=right; i++){
      rangeNum.push(i);
    }

    rangeNum.forEach(function(val,index){
      const divisorCount = findDivisor(val);

      // 약수의 개수가 짝수면 더하고 홀수면 뺌
      if(divisorCount % 2 === 0) { 
        answer += val;
      } else {
        answer -= val;
      }
    });

    return answer;
  }

  function findDivisor(num){
    let count = 0

    for (let j=0; j<=num; j++){

      if(num % j === 0) count ++;
    }

    return count;
  }

  solution(13, 17); // console ==> 43
					//프로그래머스 ==> 43
  solution(24, 27); // console ==> 52
					//프로그래머스 ==> 52
  • 달라진 건 하나 뿐이다.. solution() 함수에 return 값으로 answer를 내려준 것 뿐.. 허무해.. 허무하다.. 근데 탓 할 곳이 없지 내 탓이지 뭐 어쩌겠습니까..



return


  • 함수가 호출될 때 결과값을 반환한다.
  • return을 사용하면 함수 실행이 종료되고, 호출한 곳으로 값을 반환한다.

1. 기본 사용법

  function add(a, b) {
      return a + b;
  }

  const result = add(3, 5); // result는 8
  console.log(result); // 8

: return 키워드는 값을 반환하고, 반환된 값은 함수 호출의 결과로 사용할 수 있다.


2. return이 없는 함수

  function sayHello() {
      console.log("Hello!");
  }

  const result = sayHello(); // 함수 호출은 "Hello!"를 출력하지만 반환값은 undefined
  console.log(result); // undefined

: 함수에서 return을 명시적으로 사용하지 않으면, 함수는 undefined를 반환한다.


3. return으로 함수 실행 종료

  function checkNumber(num) {
      if (num > 0) {
          return "Positive";
      }
      return "Non-positive";
  }

  console.log(checkNumber(5)); // "Positive"
  console.log(checkNumber(-3)); // "Non-positive"

: return이 호출되면 함수의 나머지 부분은 실행되지 않고 종료된다.

  • 일반적이라면 console.log(checkNumber(5)); 의 경우 if문에서 숫자의 크기를 확인하고 "Positive"를 출력한 뒤 if문 밖에 있는 "Non-positive" 가 함께 출력되어야 할 것이라 생각할 수 있지만, return "Positive" 에서 return 에 의해 함수가 종료된다.

4. 다양한 데이터 반환

  function getUser() {
      return { name: "Alice", age: 25 };
  }

  const user = getUser();
  console.log(user.name); // "Alice"

: return은 숫자, 문자열, 객체, 배열, 함수 등 모든 JavaScript 값을 반환할 수 있다.


5. 중첩 함수와 return

  function outerFunction() {
      function innerFunction() {
          return "Inner value";
      }
      return innerFunction(); // 내부 함수의 반환값을 외부 함수에서 반환
  }

  console.log(outerFunction()); // "Inner value"

: 중첩된 함수에서 return은 각각의 함수 범위에 영향을 미친다.



하나하면 기초를 둘하면 탄탄하게
기초를!!!!!! 탄탄하게!!!!!!! 기초를!!!!!! 탄탄하게!!!!!!! .. 끝

profile
멈추지만 않으면 도착해 🛫

0개의 댓글