달리기 경주

Sheryl Yun·2023년 7월 11일
0

문제 링크🔗

처음 풀이

  • callings에서 하나씩 꺼냄
  • 꺼낸 원소가 players에 있으면 players의 해당 원소의 인덱스(players.indexOf(calling))를 + 1 하여 새로운 players 배열 생성
  • 문제점: 무조건 배열을 사용, 배열을 이중 순환해야 함

새로운 풀이

  • 선수 이름에 맞는 현재 등수가 저장된 playerInfo 객체 생성
  • 불린 선수, 불린 선수의 현재 등수, 불린 선수의 앞 선수 구하기
  • 불린 선수와 앞 선수의 등수 교체 (배열과 객체에 모두 반영)
  • 개선된 점: 객체를 활용하여 이중 for문 순환이 사라짐 (시간복잡도 감소)
let playerInfo = {};

function getPlayerInfo (players) {
    // forEach는 새로운 배열을 반환하는 것이 아니기 때문에 return문 불필요
    players.forEach((player, index) => {
        playerInfo[player] = index;
    })
}

function solution(players, callings) {
    getPlayerInfo(players);
    
    callings.forEach((calling) => {
        // 불린 선수의 현재 등수
        let index = playerInfo[calling];
        
        // 불린 선수의 앞 선수
        let frontPlayer = players[index - 1];
        
        // 배열에서 앞 선수와 현재 불린 선수의 자리 교체
        players[index - 1] = calling;
        players[index] = frontPlayer;
        
        // playerInfo 객체에서도 앞 선수와 현재 불린 선수의 자리 교체
        playerInfo[frontPlayer] = index;
        playerInfo[calling] = index - 1;
    });
    
    return players;
}

** 7월 11일부터 7월 14일까지 채용 과제를 진행하여 4개의 포스팅을 한번에 올립니다.

profile
영어강사, 프론트엔드 개발자를 거쳐 데이터 분석가를 준비하고 있습니다 ─ 데이터분석 블로그: https://cherylog.tistory.com/

0개의 댓글