구현
- 문제의 상황을 잘 이해하고, 조건에 일치하는 답을 반환하도록 구현하는 문제이다.
로직
- 문제에서 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
}