코딩테스트

"2개 숫자 모두 배수라면 1을 리턴해주세요" 공배수 문제 or연산자 이용한다구???

GABOJOK 2023. 9. 13. 20:34

코테를 풀다 다른분 답안에 신기한게 있어서 뜯어보았다. 

 

문제는 이랬다. 

 

 

자 이제 이 답안을 뜯어보자. 

일단 or 연산자에 대해 다시 살펴보자. 

 

OR 연산자.  (기본이 2항 연산자임.)

  • boolean 값을 반환한다. boolean 형이 아니면 boolean 으로 변환한다.
  • 인수들 중 하나라도 true 이면 true를 반환한다. 
  • 모두 false 이면 false를 반환.

OR 연산자 의 체인. 여러개인 경우.

  • 피연산자가 여러개인 경우, 왼쪽에서 오른쪽으로 실행된다. 값이 true 인게 발견되면 바로 멈추고, 변환 전 원래의 값을 반환한다.
  • 모든 값이 false인 경우 맨 마지막 피연산자를 변환전 원래값으로 반환한다. 

OR 연산자 의 단락평가. 

  • boolean 값을 반환한다. boolean 형이 아니면 boolean 으로 변환한다.
  • 조건이 false일때에만 명령어를 실행하고자 할 때에 주로 쓰인다. 
  •  true를 만나면 나머지 값은 건드리지 않고 평가 멈춤. 
true || alert("not printed");
false || alert("printed");

 

 

 

뜯어보려는 답안은 이랬다.

return +!(number % n || number % m)

지금 저 풀이방법의 경우 이항연산에 해당하기 때문에,  둘중 하나라도 해당하면 의 접근으로 봐야한다. 

나머지 값에 따른 결과값을 봐보자. 

저 괄호 안이 0이거나 혹은 어떠한 숫자가 나오거나 둘중 하나이기 때문에, 일단 아무 숫자나 넣어서 살펴본다. 

 

(0, 3)  __ true

(3, 0)  __ true

(0, 0)  __ false

(3, 3)  __ true

 

n,m둘다 나머지 값이 0일 경우에만  false를 내어준다. 

 

 

 

! 연산자

  • 값이 boolean 이라면 거꾸로 뒤집어 준다 (true 면 false로, false라면  true 로)
  • 값이 boolean 이 아니라면 boolean 값으로 바꿔서 거꾸로 뒤집어 준다. 

 

+ 연산자 ( 단항 연산자)

  • 숫자 타입이 아닌 것들에게만 영향을 미친다.
  • 숫자 타입이 아닐 경우에는 숫자타입으로 변환해서 반환 한다. 

 

 

 

그러니까 () 안에서 false를 가지고 나와서는,

!false  를 함으로  true 가 되고,

+ true는 숫자로 변형되어 1 을 리턴한다. 

 

 

 

엇? 만약에 2항이 아니라 3항이면 뭔가 달라지지 않았을까?

아니다 동일하다. 😆😂

//콘솔창에 테스트 해보았당..
let value1 = 0; 
let value2 = 3; 
let value3 = 7; 

value1 || value2 || value3;

 

콘솔창에 찍히는 값은 3 이다. 

설명대로 마지막 값도 true 이지만, 리턴하지 않았다. 

그런데 처음에 코테 문제로 돌아가서 잘 살펴보면, !!

모든 값이 0일 경우에만 1을 결과적으로 주게 되어있고,

하나라도 true가 될만한 값이 들어있는 경우 모두 0을 리턴하도록 되어있다

 

그러니 2항 이였던, or연산자의 체인이였던 상관이 없었던것..... ㅎ....