본문 바로가기

알고리즘/배열

Find the Winner of the Circular Game

시계 방향으로 원에 n만큼 사람이 있음.

처음 인덱스에서 시작해서 k번째 인덱스를 삭제함.

삭제한 인덱스에서 k번째 사람을 또 삭제함.

1명 남을 때까지 반복.

답지 보기 전에 짠 코드

import java.util.ArrayList;
import java.util.List;

class Solution {

    public int findTheWinner(int n, int k) {
        List<Integer> list = new ArrayList<>();        //요소들을 담을 리스트.
        for (int i = 1; i<=n; i++) {
            list.add(i);
        }

        //일정하게 증가하는 인덱스 증가값.
        int cycle = k;                                
        //처음부터 시작하는 인덱스.
        int index = 0;                                

        //1개가 남을 때까지 반복.
        while (list.size() > 1) {                    
            //인덱스에 증가값을 더해줌. (자기 자신부터 세므로 -1함)
            index += cycle-1;                        
            //인덱스가 list보다 크면 리스트를 한 바퀴 이상 돈 것임.
            if (index >= list.size()) {                
                //배열을 도는 것은 의미가 없습니다.
                //3바퀴 돌고 1번째 인덱스에 있나, 
                //10바퀴 돌고 1번째 인덱스에 있나 상관없음.
                //배열의 사이즈로 나눠서 나머지 인덱스가 실제 위치임.
                index = index%list.size();            
            } 

            //해당 인덱스 요소를 삭제해줌.
            list.remove(index);        
        }

        return list.get(0);
    }
}
728x90
반응형

'알고리즘 > 배열' 카테고리의 다른 글

프로그래머스 - 로또의 최고 순위와 최저 순위  (0) 2021.11.17
1200. Minimum Absolute Difference  (0) 2021.09.13
1122. Relative Sort Array  (0) 2021.09.06
169. Majority Element  (0) 2021.07.03