[알고리즘] 가위바위보, 점수 계산, 등수 구하기

Perfume·2022년 5월 1일
0

Algorithm

목록 보기
8/11
post-thumbnail

💡 가위바위보

이 문제를 도대체 어떻게 풀지 고민을 많이 했는데, 복잡하게 생각할 필요가 없었다. A를 기준으로 삼아 경우의 수를 작성하면 되는 문제였다. 분류를 하는 문제가 나오면 기준을 어디에 둘지 정하면 빠르게 해답을 찾을 수 있다고 한다. 이 문제는 A를 기준으로 삼아 승패를 분류하면 된다. 코드는 다음과 같다.

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

💡 점수 계산

이 문제를 해결하는 key는 count라는 변수를 선언하는 것이다. arr를 돌며 x가 1일 경우 count를 1 증가시키고, answer에 count만큼 더해주면 된다. x가 0이 나오면 count를 초기화해서, 자동으로 가산점이 초기화된다. count를 떠올리기만 하면 쉽게 풀 수 있는 문제였다. (하지만 그걸 못해서 다른 방향으로 헤맴 ㅎ)

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

💡 등수 구하기

N(1<=N<=100)명의 학생의 국어점수가 입력되면 각 학생의 등수를 입력된 순서대로 출력하는 프로그램을 작성하세요.

오늘 푼 문제 중 가장 어려웠던 등수 구하기! 높은 점수순으로 출력하면 sort를 써서 간단하게 해결할 수 있을 거 같은데 입력된 순서를 지키면서 어떻게 순위를 찾을지 많이 고민스러웠다. 결국 풀이를 봤는데

  let n = arr.length;
  let answer = Array.from({ length: n }, () => 1);

Array.from을 이용해 새로운 배열을 만드시는 것을 보고 놀랐다.console.log로 저기까지 작성한 answer부분을 확인하면 n개의 length를 가진, 모든 value가 1인 배열이 리턴된다. 이 다음부터는 이중for문을 돌며 arr[j]가 arr[i]보다 클 때마다 answer[i]의 등수를 1씩 증가시키면 된다. 최종 코드는 다음과 같다.

function solution(arr) {
  let n = arr.length;
  let answer = Array.from({ length: n }, () => 1);
  for (let i = 0; i < n; i++) {
    for (let j = 0; j < n; j++) {
      if (arr[j] > arr[i]) answer[i]++;
    }
  }
  return answer;
}

✍️ Array. from

Array.from() 메서드는 유사 배열 객체(array-like object)나 반복 가능한 객체(iterable object)를 얕게 복사해 새로운Array 객체를 만듭니다. -출처: MDN

string을 Array.from()으로 배열로 만들 때 사용해본 적이 있는데, 사용할 수 있는 범위가 내 생각보다 훨씬 무궁무진했다. Array.from과 화살표 함수를 사용하는 파트가 인상깊어서 그 부분만 간단히 정리해보겠다.

💥 Array.from과 화살표 함수 사용하기

Array.from과 화살표 함수를 사용하면 배열의 모든 값을 간단하게 2배로 증가시킬 수도 있다.

Array.from([1, 2, 3], x => x + x);
// [2, 4, 6]

혹은 오늘 등수 찾기 문제에서 사용했던 것처럼 배열을 초기화하는데 사용할 수도 있다.

 let answer = Array.from({ length: 5 }, () => 1);

위 코드가 5의 길이를 가진, 1이라는 value를 가진 배열로 리턴된 것처럼 말이다. Array.from 은 유사 배열을 배열로 만들어주는 메소드이고, 두번째 인자로 각각의 유사배열에 전달할 함수를 넘길 수 있다. 아래는 mdn에 있던 예제다.

Array.from({length: 5}, (v, i) => i);

{length:5}라는 유사배열을 배열로 만든 다음, 두번째 인자로 value와 index를 받아 value를 index로 초기화시켜주는 함수를 전달하는 코드다. 위 코드를 실행하면 [0, 1, 2, 3, 4]라는 결과가 반환된다.

profile
공부하는 즐거움

0개의 댓글