본문 바로가기
2. 우당탕탕 개발자/2-1. 공부기록

2021.7.30 TIL (보이는 학생, 가위바위보, 점수구하기, 등수구하기)

by Little Monkey 2021. 7. 30.
반응형

문제) 보이는 학생

선생님이 학생을 일렬로 세웠을 때, 맨 앞에 서있는 선생님이 볼 수 있는 학생의 수를 구하기. 키의 숫자 배열이 주어진다.

[100, 120, 110, 120, 130, 105] => 1+ 1+ 0 + 0 + 1 + 0 = 3

 

function solution(numbers) {
  let answer;
  // code here;
  return answer;
}

 

 

해답)

 

function solution(numbers) {
  let answer = 0,
      max = Number.MIN_SAFE_INTEGER;
  for (let num of numbers) {
    if (max < num) {
       answer++;
       max = num;
    }
  }

  return answer;
}

 


 

문제) 가위바위보

두 배열이 주어졌을 때, 경기의 승자를 담은 배열을 출력하기. 가위는 1, 바위는 2 보는 3이다. 각 경기의 승자(A or B)를 출력한다. 비길 경우 D를 출력한다.

A = [1, 2, 3], B = [2, 2, 2] => ['B', 'D', 'A']

 

function solution(arrA, arrB) {
  let answer;
  // code here;
  return answer;
}

 

 

선생님 해답) A를 기준으로 A가 비기는 경우, A가 이기는 경우, 그 외엔 B가 이기는 것으로 풀이

 

function solution(arrA, arrB) {
  let answer = [];
  for(let i = 0; i< arrA.length; i++) {
    if(arrA[i] === arrB[i]){
      answer.push('D')
    }
    else if(arrA[i] === 1 && arrB[i] === 3) {
      answer.push('A')
    }
    else if(arrA[i] === 2 && arrB[i] === 1) {
      answer.push('A')
    }
    else if(arrA[i] === 3 && arrB[i] === 2) {
      answer.push('A')
    } else {
      answer.push('B')
    }
  };
  return answer;
}

 

 

 

나의 해답) 조잡ㅋ

 

function solution(arrA, arrB) {
  function winner(a, b) {
    if (a === b) {
      return 'D'
    } else if (a > b) {
      if (a === 2) {
        return 'A'
      } else {
        return b === 1 ? 'B' : 'A';
      }
    } else {
      if (b === 2) {
        return 'B';
      } else {
        return a === 1 ? 'A' : 'B';
      }
    }
  };
  
  let answer = []

  for (let i = 0; i < arrA.length; i++) {
    let mid = winner(arrA[i], arrB[i]);
    answer.push(mid);
  }

  return answer;
}

 


 

문제) 점수계산

0 :못맞춤, 1: 맞춤 으로 이뤄진 채점 결과가 주어졌을 때, 연속으로 맞으면 가산되는 채점 프로그램이 있다고 하자.

[1, 0, 1, 1, 0] => 1+ 0 + 1 + 2+ 0 = 4

 

function solution(results) {
  let answer;
  // code here;
  return answer;
}

 

 

선생님 해답)

function solution(results) {
  let answer = 0, cnt = 0;
  for(let x of results) {
    if(x) {
      cnt ++;
      answer += cnt;
    } else {
      cnt = 0;
    }
  };

  return answer;
}

 

 

나의 해답) 조잡

function solution(results) {
  let answer = results[0];
  let grades = [results[0]]

  for (let i = 1; i < results.length; i++) {
    if (results[i]) {
      if (results[i - 1]) {
        grades.push(grades[i - 1] + 1);
        answer += grades[i - 1] + 1
      } else {
        grades.push(1)
        answer++;
      }
    } else {
      grades.push(0);
    }
  };

  return answer;
}

 


문제 ) 등수구하기

점수가 같을 경우 같은 등으로 처리한다. 1등이 3명일 경우, 그 다음 등수는 4등이다.

[10, 40, 20, 20 ] => [4, 1, 2, 2]

 

function solution (arr) {
  let answer;
  // code here;
  return answer;
}

 

 

해답) sort() 매소드를 사용할 수 있는 경우

 

function solution (arr) {
  let answer = [], bin = [...arr];
  bin = bin.sort((a, b) => -(a - b));
  
  for(let i = 0; i < arr.length; i++) {
    let index = bin.indexOf(arr[i]);
    answer.push(index);
  };
  
  return answer;
}

 

 

해답 2) sort() 매소드를 사용할 수 없을 때

 

function solution (arr) {
  let answer = Array.from({length: arr.length}, () => 1);
  // 만약 length가 5이라면, answer = [1, 1, 1, 1, 1]
  for (let i = 0; i < arr.length; i++) {
    for (let j = 0 j < arr.length; j++) {
      if(arr[j]> arr[i]) answer[i]++;
    } 
  }
  return answer;
}

 

 

다른 방법) 정렬된 배열과 1:1로 비교한다

 

function solution (arr) {
  let answer = [], bin = [...arr], sorted = [];
  
  while (bin.length) {
    let max = Math.max(...bin) 
    // 배열 자체에서 큰 수를 구하려면 ...이용해주면 된다.
    // Math.max([...bin])은 안된다.
    let index = bin.indexOf(max);
    bin.splice(index, 1);
    sorted.push(max)
  };
  
  for(let i = 0; i < results.length; i++) {
    let rank  = sorted.indexOf(results[i]) + 1;
    // index는 0부터, rank는 1부터 시작하니까
    answer.push(rank);
  }
  return answer;
}

 

반응형

댓글