프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제풀이 의식의 흐름

문젠느 아주 간단하다

if, else if 쓰면 될 것 같은데?

const angle = i 라 하자,

만약에, 0 < i < 90 이면 1 (true)

그게 아니면 (false), i = 90 일 때 2 (true)

그게 아니면 (false), 90 < i <180 일 때 3 (true)

그게 아니면 (false), i = 180 일 때 4 (true)

 

거진 3시간 동안 삽질한 결과, 논리는 맞는거 같은데 자꾸 레퍼런스오류가 났다

다른 풀이들은 전부 변수를 angle 그대로 넣었더라;

알파벳 몇개 좀 안쓰려고 꼼수?부리다 되려 시간낭비만 했다

다음엔 고민하는 시간 리소스 분배에 신경써야겠다

  • 변수명을 따로 주지 않고 정정한 내 풀이
function solution(angle) {    
    if (angle < 90) {
        return 1;
    } else if(angle === 90) {
        return 2;
    } else if(angle <180) {
        return 3;
    } else {
        return 4;
    }
}
  • 더 좋아보이는 풀이 1.filter 활용
function solution(angle) {
    return [0, 90, 91, 180].filter(x => angle>=x).length;
}

한줄로 깔끔해보여서 가져왔는데, 가만보니 이해가 안가는 것이었다?!

각각 1,2,3,4 값을 리턴해야하는 문제인데 리턴값이 안 보이고, 왜 90 다음이 91인지? 모르겠더라

 

감사하게도, 알고리즘 스터디원 윤정님이 해석을 해주셨다

 

filter

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

 

Array.prototype.filter() - JavaScript | MDN

filter() 메서드는 주어진 함수의 테스트를 통과하는 모든 요소를 모아 새로운 배열로 반환합니다.

developer.mozilla.org

filter 는 함수를 만족하는 모든 요소들로 새로운 배열을 만들어 내는 메서드이다

.filter(x => angle>=x)


filter에 주어진 함수를 해석해보면

x (매개변수) 보다 angle (변수)가 크거나 같으면 새로운 배열로 걸러진다

 

return [0, 90, 91, 180].filter(x => angle>=x).length;

뒤에 .length가 붙으므로 새로운 배열의 길이를 나타내고 이 값이 곧 리턴값이 된다

 

예시로 90도 이하의 값인 30도가 변수, angle로 주어진다면?

앞의 배열에서부터 하나씩 x값으로 넣어보자

 

30 >=0 이므로 0은 새로운 배열의 요소가 된다

그러나 90, 91, 180은 성립하지 않는다

고로 생성된 배열의 길이는 [0], 1개가 된다

 

마찬가지로 angle 값을 90도인 직각이라면

새로운 배열은 [0,90]

배열의 길이는 2 가 된다

 

angle 값이 90도와 180도의 사이인 100도 라면?

새로운 배열은 [0,90,91]

배열의 길이는 3 가 된다

 

180도 라면?

새로운 배열은 [0,90,91,180]

배열의 길이는 4 가 된다

 

여기서, 잠깐!! 90과 91사이의 숫자가 변수로 온다면? 이를테면 90.5라면..??

이거 헛점이네~ 라고 생각한 순간 문제가 다시 보였다

응, 그렇구나!

  • 더 좋아보이는 풀이 2.삼항연산자 활용
function solution(angle) {
    return angle < 90 ? 1 : angle === 90 ? 2 : angle < 180 ? 3 : 4;
}

삼항연산자가 아직 익숙치 않아서 마치 다 한문장인 언어처럼 보이지만

angle < 90 ? true 일때 1
				false라면 다음 식으로
: angle === 90 ? true 일때 2
				false라면 다음 식으로
: angle < 180 ? true 일때 3
				false라면 다음 식으로
: 4;

뜯어보면 달리 설명할 필요도 없이 직관적이고 간결하다

+ Recent posts