프론트엔드 개발자가 될거야./js

[TIL] Today I Learned : 수학표현식, 논리연산자, 가위 바위 보 게임 함수 만들기(rockPaperScissors 함수)

정니정은니 2022. 6. 23. 15:25

공부하다가 헷갈리는 개념들이 있어서 정리해보려고 한다.

간단하지만 헷갈리는......

컴퓨터 언어에서 사용되는 수학 표현식

let num = 1;
num++;

console.log(num); // 2

num++는 풀어서 쓰면

num = num + 1; 이다.


let num = 1;
let newNum = num++;

console.log(num); // 2
console.log(newNum); // 1

잠시 여기서 의문!

num도 2고 newNum도 2 일 줄 알았는데.....

 

왜 저런 답이 나왔을까?

let newNum = num++;을 풀어서 써보면

let newNum = num = num + 1 이다.

 

 newNum = num ---> newNum = 1 이고

그 다음에 num + 1 을 해주어서 num은 2가 된 것이다.


논리연산자

또는에 해당하는 논리연산자 ||

그리고에 해당하는 논리연산자 &&

 

헷갈릴 수 있는 예시를 가져왔다.

if (age > 65 || age < 21 && res === "한국")

컴퓨터 언어는 왼쪽부터 해석하기 때문에 왼쪽부터 해석해야한다.

즉, 위의 예시는  || 기준으로 나누어서 해석해야한다.

'65가 넘거나 / 21보다 어리고 한국에 산다. ' 이렇게! 

이런 해석이라면 아래와 같은 경우 참이다. (예)

  • 66세이다.
  • 20이면서 한국에 산다

'65가 넘거나 21보다 아래이고 / 한국에 산다.' 이렇게 해석하면 안된다!

이런 해석이라면 아래와 같은 경우 참이다.(예)

  • 66세 한국에 산다.
  • 20세 한국에 산다.

코드를 가독성 있게 바꾼다면

if (age > 65 || (age < 21 && res === "한국"))

이렇게 해주어야 한다.

 

👀 문제 👀

가위 바위 보 게임 함수를 아래 조건에 맞게 구현해주세요.

- rockPaperScissors 함수를 구현해서 가위 바위 보 게임을 구현해주세요.
- 가능하면 || 와 && 연산자 둘다 사용해주세요.
- player1과 player2 중 이긴 사람이 누군지 리턴해주세요.
- 예를 들어, player1이 이겼으면 "player1" 이 리턴 되고
   그 반대의 경우라면 "player2"가 리턴이 되어야 합니다.
- 만일 비기는 경우에는 무조건 "player1"이 리턴 되어야 합니다.
- player1 과 player2 의 값은 다음 셋 중 하나 입니다.
  "가위" "바위" "보"
- 예를 들어, player1은 "가위" 이고 player2는 "보" 이면
  "player1" 이 리턴 되어야 합니다.

처음에 문제 자체를 이해못했다..😂

그러니까 

player1과 player2 중 이긴 사람이 누군지 리턴해줘야하는데

player1이 이겼으면 "player1" 이 리턴,

player2가 이겼으면 "player2" 이 리턴,

player1 과 player2가 비겼으면 "player1"이 리턴

즉,

console.log(rockPaperScissors("가위", "보")); //player1
console.log(rockPaperScissors("가위", "바위")); //player2
console.log(rockPaperScissors("가위", "가위")); //player1

이렇게 이해하고 문제를 풀면 된다.

 

💖 정답 💖

function rockPaperScissors(player1, player2) {
  if (
    // 무승부일 때 -> 리턴 player1
    (player1 === "가위" && player2 === "가위") ||
    (player1 === "바위" && player2 === "바위") ||
    (player1 === "보" && player2 === "보")
  ) {
    return "player1"; 
  } else if (
    // player1이 이겼을 때 -> 리턴 player1
    (player1 === "가위" && player2 === "보") ||
    (player1 === "바위" && player2 === "가위") ||
    (player1 === "보" && player2 === "바위")
  ) {
    return "player1";
  } else if ( 
    // player2가 이겼을 때 -> 리턴 player2
    (player1 === "가위" && player2 === "바위") ||
    (player1 === "바위" && player2 === "보") ||
    (player1 === "보" && player2 === "가위")
  ) {
    return "player2"
  }
}
console.log(rockPaperScissors("가위", "보")); //player1
console.log(rockPaperScissors("가위", "바위")); //player2
console.log(rockPaperScissors("가위", "가위")); //player1

 

와앙.. 머리 터져어 🤯🤯🤯🤯🤯🤯🤯🤯🤯🤯