프로그래머스 [예상 대진표] - 구현 Lv.2

JH.P·2022년 8월 10일

구현

  • 문제의 상황을 잘 이해하고, 조건에 일치하는 답을 반환하도록 구현하는 문제이다.

로직

  • 문제에서 n명의 참가자가 주어지므로, 1부터 n까지의 배열을 만든다. 이때 A와 B는 다른 참가자들과 구별이 가능해야 하므로 배열의 형태로 저장한다.(ex) [A, 'battle']) 그리고 토너먼트 회차를 기록할 변수 count를 생성하고 1을 할당한다.
  • 참가자 배열의 길이가 1이 되기 전까지 반복을 시행한다.
  • 참가자 배열을 1칸을 건너뛰며 순회한다.(부전승은 없고, 주어지는 참가자는 짝수명이기 때문에 차례대로 두 요소씩 검사하기 위함이다.) 이때 A와 B를 제외하고는 누가 이겨도 상관이 없다.
  • 그리고 순회하면서 오른쪽에 위치한 요소와 비교를 한다.
    • 만약 두 요소 모두 변수 타입이 object이면, 토너먼트 회차를 반환한다.
    • 둘 중 하나만 object라면, 해당 요소는 A 또는 B이므로 다음 토너먼트에 진출할 참가자 배열에 삽입한다.
    • 위 조건에 모두 부합하지 않는다면, 둘 다 일반 참가자이므로 첫 요소를 다음 토너먼트에 진출할 참가자 배열에 삽입한다.

코드

function solution(n,a,b)
{
    // ex)
    // [1, 2,  3, 4,  5, 6,  7, 8]
    // 1번부터 8번 참가자까지 존재, 
    // 2개 마다 한 텀으로 배틀 붙음
    // 토너먼트 한 회가 끝나면 참가자 목록이 4로 줄음,
    // 이때 a - 1과 b - 1의 위치를 추적해야한다.
    // 그리고 둘이 이웃하게 되면, 그때의 토너먼트 회를 반환한다.
    
    // 1부터 n까지 참가자 배열 만들기(추적해야하는 A와 B는 배열 형태로 표시를 해준다.)
    let arr = []
    for(let i = 0; i < n; i++) {
        if(i === (a - 1) || i === (b - 1)) {
            arr.push([i, 'battle'])
        } else {
            arr.push(i)
        }
    }
     
    let count = 1   // 토너먼트 회차
    
    // 토너먼트 인원이 1명이 되면 반복을 중단하도록 반복 조건 설정
    while(arr.length > 1) {
        let battleArr = []
        // 매 토너먼트 마다 n을 반으로 줄여야한다.
        // for loop => 0 인덱스와 1 인덱스 중 하나가 배열이면, 나머지 하나도 배열이면 count 반환[x] 그 중 배틀러를 넣고,
        // 0 인덱스, 1인덱스 중 하나도 배열이 없다면, 아무거나 넣어도 된다.
        const length = arr.length
        for(let i = 0; i < length; i += 2) {    // 시합 전 배열
            if(typeof arr[i] === 'object' && typeof arr[i + 1] === 'object') {
                return count
            }
            if(typeof arr[i] === 'object' || typeof arr[i + 1] === 'object') {
                // 둘 중 객체형태인 것을 시합 후 배열에 넣어야한다.
                if(typeof arr[i] === 'object') {
                    battleArr.push(arr[i])
                } else if(typeof arr[i + 1] === 'object'){
                    battleArr.push(arr[i + 1])
                }
            } else {
                // 둘 중 아무거나 시합 후 배열에 넣어도 상관없다.
                battleArr.push(arr[i])
            }      
        }
        count += 1  // 토너먼트 다음 회차로 이동
        arr = battleArr
     }
    return count
}
profile
꾸준한 기록

0개의 댓글