본문 바로가기
알고리즘

[프로그래머스]달리기 경주

by limew 2023. 5. 27.
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

https://school.programmers.co.kr/learn/courses/30/lessons/178871

 

 

1번 풀이:  시간초과

// 젤 큰 문제 시간초과 (10^8 넘어가면 끝)
// const [key, value] map.entries()
// map사용해서 player찾음
// value값으로 object의 key찾기

// array로 풀면 시간초과
function solution(players, callings) {
    var answer = [];
    let temp = null;
    
    for (const calling of callings) {
        const index = players.indexOf(calling);
        temp = players[index-1];
        players[index-1] = calling;
        players[index] = temp;
    }
    answer = players;
    return answer;
}

 

2. 

map을 배열로 변환: ...map이지 Obect.entries(), Object.values() 는 안 됨

배열.sort이지, map.sort은 안 됨

 

function solution(players, callings) {
    var answer = [];
    const map = new Map();
    const map2 = new Map();
    players.forEach((p, i) => {
        map.set(p, i); // {name: rank}
        map2.set(i, p); // {rank: name}
    });

    for (const calling of callings) {
        const playerCurrRank = map.get(calling);
        const otherPlayerName = map2.get(playerCurrRank - 1);
        map.set(calling, playerCurrRank - 1); // 현재 선수 한 순위 앞으로 보내기
        map.set(otherPlayerName, map.get(otherPlayerName) + 1); // 다른 선수 한 순위 뒤로 보내기

        // map2도 업데이트하기
        map2.set(playerCurrRank - 1, calling); // 앞순서에 현재선수 넣기
        map2.set(playerCurrRank, otherPlayerName); // 현재 순서에 앞선수 넣기
    }
    for (const [key, value] of map.entries()) {
        answer[value] = key;
    }
    return answer;
}

 

3.

function solution(players, callings) {
    const nameObj = {};
    players.forEach((p, i) => nameObj[p] = i);

    for (const calling of callings) {
        const idx1 = nameObj[calling]; // 현재선수의 랭킹
        const name2 = players[idx1-1]; // 앞선수의 이름
        // nameObj 업데이트
        nameObj[calling] -= 1;
        nameObj[name2] += 1;
        // players 업데이트
        players[idx1-1] = calling;
        players[idx1] = name2;
    }
    return players;
}