코테/프로그래머스

[프로그래머스/Level1] 달리기 경주 (JAVA)

imname1am 2024. 4. 6. 23:40
반응형

📖 문제

 

프로그래머스

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

programmers.co.kr

 

 

 

💡  풀이 방식

• HashMap → 시간 복잡도 : O(N)

 

1. players 배열을 돌며 Map에 player와 순서를 저장한다.

Map<String, Integer> map = new HashMap<>();
for(int i = 0 ; i < players.length ; i++) {
    map.put(players[i], i);
}

 

 

2. callings 배열을 돌며 경주를 진행한다.

  2-1) player 이름에 해당하는 순서를 찾는다.

int rank = map.get(player);

 

 

  2-2) 현재 player보다 한 칸 앞에 있는 사람을 찾고, 그 사람의 순위와 players 배열 값을 변경한다.

String frontPlayer = players[rank - 1];	// 현재 player보다 한 칸 앞에 있는 사람

map.replace(frontPlayer, rank);
players[rank] = frontPlayer;

 

 

  2-3) 현재 player의 순위도 한 칸 앞으로 변경하고, players 배열 값도 변경한다.

map.replace(player, rank -1);
players[rank -1] = player;

 

 

 

 

🔺 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import java.util.*;
 
class Solution {    
    public String[] solution(String[] players, String[] callings) {        
        
        Map<String, Integer> map = new HashMap<>();
        for(int i = 0 ; i < players.length ; i++) {
            map.put(players[i], i);
        }
        
        for(String player : callings) {
            int rank = map.get(player);
            
            // 현재 player보다 한 칸 앞에 있는 사람 찾고, 그 사람 순위와 players 배열 값 변경하기
            String frontPlayer = players[rank - 1];
            
            map.replace(frontPlayer, rank);
            players[rank] = frontPlayer;
            
            // 현재 player의 순위도 한 칸 앞으로 변경하고, players 배열 값도 변경하기
            map.replace(player, rank -1);
            players[rank -1= player;
        }
        
        return players;
    }
}
 
cs

 

 

 

➕ 다른 풀이 방식

똑같은데 map의 등수와 playes에 있는 등수를 모두 변경할 때 코드 순서가 가독성이 좀 더 좋길래..ㅎㅎ

 

[JAVA] 달리기 경주

https://school.programmers.co.kr/learn/courses/30/lessons/178871?language=java 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁

123okk2.tistory.com

 


💦 어려웠던 점

- 그냥 완전탐색으로 매번 해당 call의 순서를 찾고, 앞 값과 값을 변경하도록 했었는데 시간 초과가 떴었다. (O(N^2))

 

 

1회독 2회독 3회독 4회독 5회독
V        

(참고)

 

[연습문제][lv.1] 달리기 경주 - 자바(Java)

문제 링크 https://school.programmers.co.kr/learn/courses/30/lessons/178871 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁

jie0025.tistory.com

 

반응형