이번 글은 연습문제 풀이입니다. 이전 글에서 연습문제를 풀어 보신 분들만 아래 내용을 확인하시길 바랍니다.






10-1 풀이

function dice(smallNumber, bigNumber){
  var possibilities = bigNumber-smallNumber+1;
  return Math.floor(Math.random()*possibilities)+smallNumber;
}

우선 작은 수부터 큰 수까지는 몇가지 경우의 수가 있을 까요? 예를 들어 4와 9이 입력되었다면, 결과로 나올 수 있는 값은 4, 5, 6, 7, 8, 9의 6가지입니다. 이렇게 주어진 두 숫자와, 그 사이의 숫자의 갯수를 구하려면 큰 수 - 작은 수 + 1을 하면 됩니다. 이 값을 possiibliities 변수에 넣어 줍시다.

return Math.floor(Math.random()*possibilities)를 하면 0 부터 possibilities-1까지의 수 중에 하나를 만들 수 있습니다.

여기에 가장 작은 수인 smallNumber를 더해주면 입력받은 작은 수부터 입력받은 큰 수까지 중 하나의 정수를 구하는 함수가 완성됩니다.

10-2 풀이

//컴퓨터 가위 바위 보 값 구하는 함수
function getComputerValue(){
  var randomNumber = Math.floor(Math.random()*3); // 0, 1, 2 중 하나의 값을 랜덤으로 생성
  if(randomNumber == 0){
    return "가위";
  }
  else if(randomNumber == 1){
    return "바위";
  }
  else {
    return "보";
  }
}

//가위 바위 보 값 출력하는 함수
function printValues(yourName, yourValue, computerName, computerValue){
  console.log(yourName + ": " + yourValue + ", " + computerName + ": " + computerValue);
}

// 승자를 출력하는 함수
function printWinner(name){
  console.log(name+"의 승리입니다.");
}

// 비겼음을 출력하는 함수
function printDraw(){
  console.log("비겼습니다.");
}

//메인 게임 함수
function rockScissorPaper(yourValue){
  if(yourValue != "가위" && yourValue != "바위" && yourValue != "보"){
    console.log("잘못 입력하셨습니다.");
    return;
  }

  var computerName = "컴퓨터";
  var yourName = "당신";

  var computerValue =  getComputerValue();

  printValues(yourName, yourValue, computerName, computerValue);

  if(computerValue=="가위" && yourValue=="보" || computerValue=="바위" && yourValue=="가위" || computerValue=="보" && yourValue=="바위"){
    printWinner(computerName);
  }
  else if(computerValue=="가위" && yourValue=="바위" || computerValue=="바위" && yourValue=="보" || computerValue=="보" && yourValue=="가위"){
    printWinner(yourName);
  }
  else {
    printDraw();
  }
}

유의해서 봐야할 부분은 1. 컴퓨터의 가위 바위 보 값을 생성하는 부분과 2. 승, 패, 비김을 판단하는 부분입니다.

1. 컴퓨터의 값은 바로 생성하지 못하고 숫자 0, 1, 2중에서 랜덤한 수를 생성한 후 그 수에 따라 가위, 바위 보 값을 return하는 함수를 만들었습니다.

2. 플레이어가 승리하는 경우의 값들을 모두 모아 if의 조건으로 만들었고, 컴퓨터가 승리하는 경우의 값들을 모두 모아 else if의 조건으로 만들었고, 그 외의 경우는 비기는 것으로 하였습니다.

위 코드는 정답의 한 예시이며 반드시 위와 같이 코딩해야하는 것은 아닙니다. 문제에서 주어진 조건만 모두 만족한다면 정답입니다.


연습문제(10-1)

앞의 강의에서 숫자를 하나 입력받아 1 이상 입력받은 값 이하의 랜덤한 정수를 반환(return)하는 함수를 만들어 보았습니다.

이 함수를 바탕으로 두가지 숫자를 받아 그 사이의 랜덤한 정수를 반환하는 함수를 만들어 봅시다.

  • 함수는 두가지 정수를 파라메터로 받습니다.
  • 파라메터에 들어오는 첫번째 수는 두번째 수보다 작습니다.
  • 첫번째 수부터 두번째 수까지의 수 중 랜덤한 하나의 값을 return합니다.

연습문제(10-2)

아래 조건을 만족하는 가위 바위 보 코드를 만들어 봅시다.

  • 메인 함수는 하나의 문자열을 파라메터로 받습니다.
  • 입력받은 문자열이 "가위", "바위", "보" 중 하나가 아니라면 "잘못 입력하셨습니다."라는 문구를 출력하고 함수를 종료합니다.
  • 컴퓨터 역시 "가위", "바위", "보" 중 하나의 값을 랜덤하게 가집니다.
  • "당신: x, 컴퓨터: y"를 콘솔에 출력합니다. x에는 입력받은 문자열을, y에는 컴퓨터의 값이 들어갑니다.
  • 가위 바위 보의 승자를 구한 후 "x의 승리입니다."를 콘솔에 출력합니다. x에는 "당신" 혹은 "컴퓨터"가 들어갑니다.
  • 비긴 경우 "비겼습니다."를 콘솔에 출력합니다.

랜덤한 수 생성

자바스크립트에서는 Math.random() 함수로 0 이상 1 미만인 랜덤한 수를 만들 수 있습니다. (0은 나올 수도 있지만 1은 절대 나오지 않습니다.)

Math.random();

이런식으로 소수점이 있는 수가 생성됩니다.

이 함수를 이용해서 0 이상 10 미만인 랜덤한 수를 만들려면? 결과에 10을 곱해주면 되겠죠.

Math.random()*10;

소수점 없이 0, 1, 2, 3, 4, 5, 6, 7, 8, 9의 10가지 수 중에 하나를 얻고 싶다면 소수점 이하의 값을 버리면 됩니다.

Math.floor()함수로 소수점 이하의 값을 버릴 수 있습니다. 반올림이 아니라 소수점 이하의 값을 무조건 버리는 함수입니다.

Math.floor(Math.random()*10);

위 내용을 바탕으로 눈금이 1부터 6까지 있는 주사위 함수를 만들 수 있습니다.

function dice6(){
  return Math.floor(Math.random()*6)+1;
}

Math.floor(Math.random()*6)는 0부터 5까지의 정수가 나오므로 여기에 1을 더해주면 1부터 6까지의 값이 나오게되는 것이죠.

일반화

만약 어떤 게임을 개발하는데, 눈금이 1에서 6까지 있는 주사위와 1에서 10까지 있는 주사위 두 개를 사용한다면 함수를 어떻게 만들어야 할까요?

function dice6(){
  return Math.floor(Math.random()*6)+1;
}

function dice10(){
  return Math.floor(Math.random()*10)+1;
}

이렇게 두가지 함수를 만들어서 사용할 수도 있겠지만, 위 두가지 기능을 모두 할 수 있는 하나의 함수만 만들 수도 있습니다.

function dice(maxNumber){
  return Math.floor(Math.random()*maxNumber)+1;
}

dice(6), dice(10)로 dice6과 dice10의 기능을 할 수 있습니다. 이때 dice 함수를 dice6, dice10함수에 비해 더 일반화가 되었다라고 표현합니다.

일반화된 코드는 여러 장점이 있습니다.

  • 우선 작성해야 할 코드의 전체 길이가 줄어듭니다.
  • 확장성이 좋습니다. 만약 1에서 12까지의 눈금이 있는 새 주사위가 필요하다고 하면 dice12 함수를 새로 만들 필요 없이 dice(12)를 사용할 수 있습니다.
  • 유지보수가 간편합니다. 만약에 그럴일은 없겠지만 어떠한 이유로 Math.random함수를 사용하지 말고 다른 코드로 변경해야하는 일이 있다고 하면, 주사위 함수가 여러가지인 경우 모든 함수를 각각 수정해 주어야 합니다. 일반화된 주사위 함수 하나뿐이라면 그곳만 수정하면 됩니다.

주사위 게임

위에서 만든 dice함수를 사용해 주사위 게임 함수를 만들어 봅시다.

- 주사위는 눈금이 1에서 6까지입니다.
- 컴퓨터의 주사위 값을 구하여 "컴퓨터의 주사위는 x입니다."라고 콘솔에 출력합니다. x는 주사위 눈금의 값입니다.
- 사용자의 주사위 값을 구하여 "당신의 주사위는 x입니다."라고 콘솔에 출력합니다. x는 주사위 눈금의 값입니다.
- 컴퓨터의 주사위 값과 사용자의 주사위 값을 비교하여 "x의 승리입니다."를 출력합니다. 컴퓨터의 주사위 값이 높으면 x에 "컴퓨터", 아니라면 "당신" 이 들어갑니다.
- 비긴 경우 "비겼습니다."를 콘솔에 출력합니다.

// 주사위 값을 생성하는 함수
function dice(maxNumber){
  return Math.floor(Math.random()*maxNumber)+1;
}

// 주사위 값을 출력하는 함수
function printDice(name, num){
  console.log(name+"의 주사위는 "+num+"입니다.");
}

// 승자를 출력하는 함수
function printWinner(name){
  console.log(name+"의 승리입니다.");
}

// 비겼음을 출력하는 함수
function printDraw(){
  console.log("비겼습니다.");
}

/*
   위의 함수들은 게임의 각 부분을 담당하는 함수들이며,
   아래 게임 메인 함수는 전체적인 프로그램의 진행을 담당합니다.
*/

// 게임 메인 함수
function diceGame(){
  var computerName = "컴퓨터";
  var yourName = "당신";

  var computerDice = dice(6); // 컴퓨터의 주사위 값 을 구함
  printDice(computerName, computerDice); // 컴퓨터 주사위 값 출력

  var yourDice = dice(6); // 사용자의 주사위 값을 구함
  printDice(yourName, yourDice); // 사용자 주사위 값 출력

  if(computerDice > yourDice){ // 만약 컴퓨터의 주사위 값이 더 크면,
    printWinner(computerName); // 컴퓨터 승리 문구 출력
  }
  else if(computerDice < yourDice){ // 그렇지 않고 만약 사용자의 주사위 값이 더 크면,
    printWinner(yourName); // 사용자 승리 문구 출력
  }
  else { // 다 아니라면,
    printDraw(); // 비겼음을 출력
  }
}

위 코드에서 //, /*, */라고 표시된 부분을 주석(comment)이라고 합니다. 코드를 읽는 사람에게 도움을 주기 위해 작성한 글로 프로그램에 아무런 영향을 끼치지 않습니다.

//는 한 줄에서 // 뒷부분에 입력된 내용을 코드에 포함시키지 않는 역할을 하고, /*는 */가 나올 때까지 그 사이의 모든 내용을 무시합니다.

이번 글은 연습문제 풀이입니다. 이전 글에서 연습문제를 풀어 보신 분들만 아래 내용을 확인하시길 바랍니다.











9-1 풀이

function supplementaryClass(koreanScore, englishScore, mathScore){
  if(koreanScore <= 50 && englishScore <= 50 && mathScore <= 50){
    return "종합반";
  } 
  else if(koreanScore <= 50 || englishScore <= 50 || mathScore <= 50){
    return "단과반";
  }
  else {
    return "보충 수업 없음";
  }
}

if, if else, else와 and 연산자, or 연산자를 사용하여 조건에 맞는 함수를 만들 수 있습니다.

9-2 풀이

주어진 조건을 다시 한번 살펴봅시다.

  • 연수가 4로 나누어떨어지는 해는 윤년으로 한다.
  • 이 중에서 100으로 나누어떨어지는 해는 평년으로 한다.
  • 그중에 400으로 나누어떨어지는 해는 윤년으로 둔다.

이 중 첫번째 조건만 if문으로 나타내면 다음과 같습니다. 윤년은 영어로 leap year이므로 isLeapYear를 윤년인지 아닌지를 담는 변수명으로 하였습니다.

var isLeapYear;

if(year%4 == 0){
  isLeapYear = true;
} 
else {
  isLeapYear = false;
}

첫번째 조건을 만족하는 년도들은 두번째 조건에 따라 다시 윤년인지 아닌지가 갈립니다. 두번째 조건을 첫번째 if 코드에 다시 적용해 봅시다.

var isLeapYear;

if(year%4 == 0){
  if(year%100 == 0){
    isLeapYear = false;
  } 
  else {
    isLeapYear = true;
  }
} 
else {
  isLeapYear = false;
}

두번째 조건을 만족하는 년도들은 다시 세번째 조건에 따라 윤년인지 아닌지가 갈립니다. 세번째 조건을 다시 두번째 if 코드에 적용해 봅시다.

var isLeapYear;

if(year%4 == 0){
  if(year%100 == 0){
    if(year%400 == 0) {
      isLeapYear = true;
    }
    else {
      isLeapYear = false;
    }
  } 
  else {
    isLeapYear = true;
  }
} 
else {
  isLeapYear = false;
}

이 코드를 함수로 감싸면 아래와 같이 함수가 완성됩니다. (정답예제 1)

function checkLeapYear(year){
  var isLeapYear;

  if(year%4 == 0){
    if(year%100 == 0){
      if(year%400 == 0) {
        isLeapYear = true;
      }
      else {
        isLeapYear = false;
      }
    } 
    else {
      isLeapYear = true;
    }
  } 
  else {
    isLeapYear = false;
  }

  return isLeapYear;
}

수학시간에 배운 '명제의 대우은 사실이다'라는 것 생각나시나요? 만약 생각이 나지 않는 다면 인터넷으로 명제의 역, 이 대우를 다시 한번 알아보고 오세요.

주어진 조건에 대우를 구하면 다음과 같이 변경할 수 있습니다.

  • 조건1: 연수가 4로 나누어떨어지지 않는 해는 평년이다.
  • 조건2: 조건1에 해당하지 않지만 100으로 나누어떨어지지 않는 해는 윤년이다.
  • 조건3: 조건 1, 조건 2에 해당하지 않지만 400으로 나누어떨어지는 해는 평년이다.

이 조건으로 함수를 만들면 다음과 같이 좀 더 간단하게 만들 수 있습니다. (정답예제 2)

function checkLeapYear(year){
  var isLeapYear;

  if(year%4 != 0){
    isLeapYear = false;
  }
  else if(year%100 != 0){
    isLeapYear = true;
  }
  else if(year%400 != 0) {
    isLeapYear = false;
  }
  else {
    isLeapYear = true;
  }

  return isLeapYear;
}


+ Recent posts