2차 공부/알고리즘

달리기 경주

공대탈출 2024. 7. 2. 15:08

 

 

function solution(players, callings) {
	//rank배열 생성
    let rank = [...players]
    //callings의 요소들을 돌면서 해당 순서의 값의 위치를 찾아내
    //앞 등수의 이름을 저장해두고, call요소를 앞으로 보내고 저장해둔 앞 등수의 이름을
    //call의 등수였던 곳으로 바꿀 생각이다.
    for (let call of callings) {
        let presentCallRank = rank.indexOf(call)
        let aboveRankName = rank[presentCallRank-1]
        rank[presentCallRank-1] = call
        rank[presentCallRank] = aboveRankName
    }
    //바뀌어진 rank배열을 리턴한다.
    return rank;
}

아마 players배열의 크기가 커지면서 indexOf가 필요로하는 시간이 매우 커져 실패한 것으로 생각한다.

 

function solution(players, callings) {
	//rankArr배열을 만들어 준다.
    let rankArr = [...players]
    //시간복잡도를 낮추기 위해 Map객체를 사용한다.
    let rankMap = new Map();
    
    //players배열, 순위를 rankMap에 세팅한다.
    players.forEach((name, index) => {
        rankMap.set(name, index)
    })
    
    //callings배열의 각 call마다 위치를 변경해준다.
    for (let call of callings) {
    	//rankMap에 저장되어있는 call의 순위를 가져온다.
        let presentRank = rankMap.get(call)
        //call의 앞 순위 이름을 rankArr에서 가져온다.
        let front = rankArr[presentRank-1]
        //call의 앞 순위 등수를 변수로 저장해둔다. (직관적으로 해석가능하게)
        let frontRank = presentRank-1
        //rankArr의 앞 순위를 call로 바꿔주고
        //rankArr의 현재 순위를 앞 순위였던 이름으로 바꿔준다.
        rankArr[frontRank] = call
        rankArr[presentRank] = front
        //rankMap의 각 이름의 순위를 변경해준다.
        rankMap.set(call, frontRank)
        rankMap.set(front, presentRank)
    }
    
    return rankArr;
}

반복마다 O(N*N0)이었던 시간복잡도가 O(N)로 바뀌면서 시간초과 실패를 해결하였다.

 

'2차 공부 > 알고리즘' 카테고리의 다른 글

신고 결과 받기  (0) 2024.07.04
공원 산책  (0) 2024.07.03
개인정보 수집 유효기간  (1) 2024.07.01
성격 유형 검사하기  (0) 2024.06.27
햄버거 만들기  (0) 2024.06.25