저장을 습관화

프로그래머스 LV.0 조건 문자열 본문

코딩 테스트/프로그래머스 - 자바스크립트

프로그래머스 LV.0 조건 문자열

ctrs 2023. 9. 10. 18:30

프로그래머스 LV.0 조건 문자열

https://school.programmers.co.kr/learn/courses/30/lessons/181934

 

프로그래머스

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

programmers.co.kr

 

1. 문제 명

조건 문자열


2. 문제 설명

문자열에 따라 다음과 같이 두 수의 크기를 비교하려고 합니다.

두 수가 n과 m이라면

- ">", "=" : n >= m

- "<", "=" : n <= m

- ">", "!" : n > m

- "<", "!" : n < m

두 문자열 ineq와 eq가 주어집니다. ineq는 "<"와 ">"중 하나고, eq는 "="와 "!"중 하나입니다. 그리고 두 정수 n과 m이 주어질 때, n과 m이 ineq와 eq의 조건에 맞으면 1을 아니면 0을 return하도록 solution 함수를 완성해주세요.


3. 제한 사항

- 1 ≤ n, m ≤ 100


4. 예시

ineq eq n m result
"<" "=" 20 50 1
">" "!" 41 78 0


5. 기본 제공 코드

function solution(ineq, eq, n, m) {
    var answer = 0;
    return answer;
}


6. 제출한 내 답

const solution = (ineq, eq, n, m) => {
  if (ineq === ">" && eq === "=") return n >= m ? 1 : 0;
  if (ineq === ">" && eq === "!") return n > m ? 1 : 0;
  if (ineq === "<" && eq === "=") return n <= m ? 1 : 0;
  if (ineq === "<" && eq === "!") return n < m ? 1 : 0;
};

 

6-2. VSC에 작성한 내용

const solution = (ineq, eq, n, m) => {
  if (ineq === ">" && eq === "=") return n >= m ? 1 : 0;
  if (ineq === ">" && eq === "!") return n > m ? 1 : 0;
  if (ineq === "<" && eq === "=") return n <= m ? 1 : 0;
  if (ineq === "<" && eq === "!") return n < m ? 1 : 0;
};

// 테스트
console.log(solution("<", "=", 20, 50));
console.log(solution(">", "!", 41, 78));

// console.log(solution());


7. 특이사항

처음엔 이런식으로 작성해봤다.

const solution = (ineq, eq, n, m) => {
  let cal = `${n}${ineq}${eq}${m}`;
  console.log(cal);
  return cal ? 1 : 0;
};

// 테스트
console.log(solution("<", "=", 20, 50));
console.log(solution(">", "!", 41, 78));

그런데 결과가 0이어야 하는 상황에도 1이 나오더라

왜 그런가 뜯어보니까 두번째 테스트 같은 경우

41 >! 78이 되는 경우에는 !가 78에 붙어

41 > !78 

41 > false 가 되어버렸다.

 

나는 !== 같은 효과를 기대했는데 잘못 사용했다.

자바스크립트에 >!, <! 같은 비교 연산자는 없는데

 

 

애초에 let cal = `${n}${ineq}${eq}${m}`; 이 방법부터 잘못됐었다

왜 자꾸 1이 나올까 테스트 해보니까

let a = "41>!78";
console.log(a); // 41>!78
console.log(a ? 1 : 0); // true

삼항연산자에 들어가는 a가 계산식이 아니라

문자열이 존재하는 것으로 인식이 되어서 참이 되는 것이었다.

 


8. 다른 사람이 작성한 답

8-1. 객체지향

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));
}

 

8-2.

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
}