배운 코드 정리

각도기 함수와 짝수 더하기

fpzmfks 2024. 6. 20. 19:23

오늘 날 고생하게 한 두 개의 함수문제를 가져왔다. 다른 무엇보다도 이런 코드카타 문제가 가장 어려운데, 자바스크립트 언어에 대한 이해가 깊어져 가는 것이 느껴지는 것만큼은 장점이다. 

 

0도부터 180도까지의 각도 명칭(ex)둔각)에 각각의 값을 반환하게 하는 함수를 만드는 문제이다. 

아래는 내가 제출한 답안인데, 문제를 보고 단박에 if문을 사용하는 것까지는 생각했지만 정확히 어떤 변수와 문법을 사용해야 하는지에 대해 오래 헤매었다. 

 

function solution(angle) {
    
    if(0 < angle && angle < 90) {
        answer = 1;
    } else if(angle === 90) {
        answer = 2;
    } else if(90 < angle && angle < 180) {
        answer = 3;
    } else {
        answer = 4;
    }
    return answer;
}

 

이 해답에 있어서 내가 가장 먼저 고려한 것은 return과 answer를 잘못된 문법에 따라 사용하고 있지 않은가 하는 것이었다. 앞에 붙어있는 var answer을 지워보기도 하고, 뒤에 붙어있는 return answer을 지워보기도 하며 그러한 문법이 이 해답 내에서 어떠한 역할을 하고 있는지 계속 검색해보았다. 

 

var answer = 0 은 변수 answer을 초기화하는 것으로, 이 함수 내에서는 큰 역할이 존재하지 않는 것이다. 때문에 지워도 문제가 없다. 

 

return answer는 굉장히 중요하다. 최종적으로 값이 나오지 않으면 기껏 함수를 만들어봤자 아무 소용이 없다. 때문에 이 return 함수를 가지고 온갖 시도를 해보다가 return값이 반환되면서 함수가 멈추기 때문에 사용에 유의해야 한다는 것을 알게 되었다. 더불어 위의 함수속 answer = 1의 부분처럼 return = 1을 사용하는 것은 잘못된 문법이라는 것을 알았다. 때문에 최종적으로 위와 같이 if문의 반환값에는 answer를, 함수의 반환값에는 return을 사용했다. 

 

이후 온갖 것들을 검색해보다 질문란을 통해 알게 된 것은 자바스크립트가 0<angle<90과 같은 사잇값을 인식하지 않는다는 것이었다. 때문에 자바스크립트에 사잇값을 인식하게 하려면 위와 같이 0<angle과 angle <90을 && 연산자를 사용하여야 한다.

 

더불어 if()에서 () 안에 들어가는 값은 true나 false로 반환되어야 하기 때문에 &&과 같은 논리 연산자를 사용하여 true나 false 값을 구해야 한다는 것을 알았다.  때문에 angle = 90 또한 사용할 수 없으므로 논리연산자를 사용한 angle==90이나 angle===90을 넣어야 한다는 것을 알았다.


 

다음은 정수 n이 주어질 때 n이하 짝수의 합을 구하는 함수를 만드는 문제이다. 아래는 내가 제출한 해답이다. 

 

function solution(n) {
    var answer = 0;
    for(i=0; i<=n; i++){
        if(i%2==0){
            answer+=i;
        }
    }
    return answer;
}

 

처음 이 문제를 봤을 때, 이 문제의 해답을 어떻게 구해야 할지 전혀 실마리가 떠오르지 않았다. 그래서 좀 비겁하지만 다른 사람이 질문을 위해 업로드한 코드를 엿보아서 미완성된 코드를 참고해서 해답의 구조를 짰다.  

 

먼저 변수값을 초기화하는 var answer = 0은 answer가 특정한 값을 반환하는 것이 아니라 함수 속에서 변수로 사용될 수 있으므로 이 함수에서는 필요했다. return answer 또한 중요하다. 이 함수에서 반환되어야 하는 값이 무엇인지 잘 정의해야지만 함수가 완성될 수 있다. 

 

그리고 가장 중요한 것이 for문이다. for문은 반복문으로써

 

for([초기문];,[조건문(몇 번 반복할 것인지)];,[증감문(반복할 때 어떤 변화를 줄 것인지)])

 

의 형식으로 루프(반복)한다. 이 for문은 그 자체로는

 

for(i=0;, i<=n;, i++)의 결과로

0, 1, 2, 3, 4, 5...n과 같이 일정한 규칙에 따른 값을 반환할 뿐이다.(참고로 i++는 i를 1씩 증가한다는 의미이다.)

 

때문에 구문으로 덧셈 등의 다른 결과를 반환하고 싶으면 {}를 덧붙여 조건을 덧붙여야 한다. 이 해답에서는 

 

{ if ( i % 2 == 0 ) { answer += i; } }

 

으로 짝수덧셈이라는 조건을 덧붙였다. 

 

먼저 짝수는 

( i % 2 == 0 )

부분인데, %는 i를 2로 나눈 나머지를 구하는 연산자로 짝수를 2로 나누면 나머지는 항상 0이 되므로 여기서 i는 짝수로 정의된다. 

 

그리고 덧셈

{ answer += i; }

부분인데, +=은 왼쪽값에 오른쪽값을 더하는(answer=answer+i) 연산자로 변수 answer은 0이고 i는 짝수로 정의되었으므로 이 덧셈으로 인해 answer은 짝수값만 더한다는 조건으로 완성되었다. 

 

이리하여 완성된 함수의 작동원리를 살펴보자면 만약 n이 11일 경우

 

function solution(11) {
    var answer = 0;
    for(i=0; i<=11; i++){
        if(i%2==0){
            answer+=i;
        }
    }
    return answer;
}

 

for문에 의해 i가 0에서부터 11까지 반복된다. 

->if( i%2==0 )에 의해 짝수가 if문에 들어온다.

->짝수가 { answer += i }에 의해 더해진다. 

->answer은 0이므로 if문에 들어온 짝수인 i = 2,4,6,8,10이

->answer = answer+2+4+6+8+10

->answer = 0+2+4+6+8+10 = 30

->return answer   ->   30  이 된다. 

 

for문+=에 대해 알고 if문의 쓰임에 대해 보다 깊이 이해할 수 있었던 문제였다. 

'배운 코드 정리' 카테고리의 다른 글

indexOf, sort  (0) 2024.07.09
돌아온 정수 제곱근 판별  (0) 2024.07.02
자연수 뒤집기  (0) 2024.07.01
배열의 평균 값  (0) 2024.06.21
왕초보 1주차  (0) 2024.06.18