본문 바로가기
알고리즘

자바 - 프로그래머스 / 달리기 경주

by kdozlo 2023. 4. 17.

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

 

프로그래머스

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

programmers.co.kr

LV 1

 

구현 방법

처음 : 이중 포문으로 원하는 값 찾아서 위치 바꾸기

     하지만,

       3 ≤ players[i]의 길이 ≤ 10 
       2 ≤ callings의 길이 ≤ 1,000,000
     으로 이중 포문 돌리니까 런타임 에러 뜸

 

나중 :  players 배열을 해시맵<player 이름, player 랭크>으로 바꿔서 원하는 값 찾을때 O(1)로 바꿔서 구현

주의점은 랭킹 바꿀때 players 배열만 업데이트 하는게 아니라 해시맵 정보도 업데이트 해줘야 함.

 

코드

처음 코드(런타임 에러)

class Solution {
    public String[] solution(String[] players, String[] callings) {

        for(String cur : callings) {
            for(int i = 0; i < players.length; i++) {
                if(players[i].equals(cur)) {
                    players[i] = players[i - 1];
                    players[i-1] = cur;
                }
            }
        }
        
        return players;
    }
}

 

나중 코드

import java.util.HashMap;
import java.util.Map;


class Solution {
    public String[] solution(String[] players, String[] callings) {

        Map<String, Integer> curRank = new HashMap<>();

        for(int i = 0; i < players.length; i++) {
            curRank.put(players[i], i);
        }



        for(String cur : callings) {
            Integer tempRank = curRank.get(cur);

            players[tempRank] = players[tempRank - 1];
            curRank.put(players[tempRank - 1], tempRank);

            players[tempRank - 1] = cur;
            curRank.put(cur, tempRank - 1);
        }

        return players;
    }
}

 

느낀 점

최근에 네이버 코테 치고 자신감이 낮아져서 쉬운 문제 풀었다. 아직 자바 기본 라이브러리도 안익숙해서 많이 써봐야 할것 같고, 복잡한 문제 읽고 이해하는게 오래 걸려서 그런 문제들 많이 접해봐야 할 것 같다.  아직 많이 부족한거 같은데 하면 또 될것 같기도 하다.