문자열에 따라 다음과 같이 두 수의 크기를 비교하려고 합니다.
- 두 수가 n과 m이라면
- ">", "=" : n >= m
- "<", "=" : n <= m
- ">", "!" : n > m
- "<", "!" : n < m두 문자열 ineq와 eq가 주어집니다. ineq는 "<"와 ">"중 하나고, eq는 "="와 "!"중 하나입니다. 그리고 두 정수 n과 m이 주어질 때, n과 m이 ineq와 eq의 조건에 맞으면 1을 아니면 0을 return하도록 solution 함수를 완성해주세요.
제한 사항
function solution(ineq, eq, n, m) {
n = parseInt(n);
m = parseInt(m);
const condition = ineq + eq;
switch (condition) {
case '>!':
return n > m ? 1 : 0;
case '<=':
return n <= m ? 1 : 0;
case '>=':
return n >= m ? 1 : 0;
case '<!':
return n < m ? 1 : 0;
default:
return 0;
}
}
최대한 중복되는 조건을 제외하는 것이 중요한 문제라고 생각했다. 그거 생각하는게 조금 어려웠다...
n
, m
을 숫자로 바꾸고, 연산자를 더한 다음 switch문으로 케이스를 돌렸다.
그렇게 해서 각각의 조건에서 1이 나올 수 있는 경우만 크게 뽑아내고, 나머지는 다 0이 나올테니 삼항 연산자를 사용해서 풀었다.
코드만 보면 간단하게 푼 것 같은데 졸려서 더 그런가 조건 소거해나가는 것이 조금 헷갈리고 어려웠다.
const operations = {
'>=': (n, m) => n >= m,
'<=': (n, m) => n <= m,
'>!': (n, m) => n > m,
'<!': (n, m) => n < m,
};
function solution(ineq, eq, n, m) {
const op = operations[ineq + eq];
return Number(op(n, m));
}
천잰가?
operations
라는 상수는 비교연산자를 키로 가지며, 비교 함수를 값으로 갖는 객체다.
→ '>=' 연산자에 대한 함수는 두 개의 숫자를 받아서 첫 번째 숫자가 두 번째 숫자보다 크거나 같은지 반환한다. (반복)
solution
함수에서는 네 개의 인자를 받는다. 여기에서 ineq
와 eq
를 조합하여 적절한 비교 함수를 선택하고, 이 함수를 사용해 n
과 m
을 비교한 결과를 숫자로 반환한다.
아예 비교 연산자를 상수로 만들어 값을 비교하고 반환하는 방식은 상상도 못했다! ㄴㅇㄱ
function solution(ineq, eq, n, m) {
if (eq === '=' && n === m) return 1
if (ineq === '<' && n < m) return 1
if (ineq === '>' && n > m) return 1
return 0
}
여기도 천잰가?
eq 값에 = 가 들어가고 n===m일 경우 무조건 참이다.
이런 식으로 조건을 소거해 가는데 오... 훨씬 더 효율적인 사고방식이라는 느낌이 들었다. 접근 방식이 비슷한데 결국 나는 이런 식으로 더 효율적인 방식을 찾지 못한 것... 천재다 ㄷㄷ