[프로그래머스/Level1] 달리기 경주 (JAVA)
📖 문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
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