๐ ๋ฌธ์ ๋ฐ๋ก๊ฐ๊ธฐ
https://school.programmers.co.kr/learn/courses/30/lessons/178871
ํ๋ก๊ทธ๋๋จธ์ค
SW๊ฐ๋ฐ์๋ฅผ ์ํ ํ๊ฐ, ๊ต์ก์ Total Solution์ ์ ๊ณตํ๋ ๊ฐ๋ฐ์ ์ฑ์ฅ์ ์ํ ๋ฒ ์ด์ค์บ ํ
programmers.co.kr
๐ ๋ฌธ์ ์์ฝ

๐๐ปโ๏ธ ๋ฌ๋ฆฌ๊ธฐ ๊ฒฝ์ฃผ
- ๊ท์น
- ํด์ค์ง์ด ๋ถ๋ฅธ ์ ์๋ ์๊ธฐ ์ ์ ์์ ์์น๋ฅผ ๋ฐ๊พผ๋ค.
- ํญ์ 1๋ฑ์ ์ด๋ฆ์ด ๋ถ๋ฆฌ์ง ์๋๋ค.
- ๋ชจ๋ ์ถ์์ด ๋๋ ํ์ ์ต์ข ์์๋ฅผ ๊ตฌํด์ผ ํ๋ค.
๐ ์ ๋ ฅ
- players: 1๋ฑ๋ถํฐ ํ์ฌ ์์๊น์ง์ ์ ์ ์ด๋ฆ ๋ฐฐ์ด
- callings: ์ถ์ํ ์ ์ ์ด๋ฆ ๋ฐฐ์ด
์๋ฅผ ๋ค๋ฉด ์๋์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ฌ๋ฆฌ๊ธฐ ๊ฒฝ์ฃผ๊ฐ ์ด๋ค์ง๋ค.
players = ["mumu", "soe", "poe", "kai", "mine"]
callings = ["kai", "kai", "mine", "mine"]
๐ ์งํ ๊ณผ์
1) "kai" → 4๋ฑ์ธ kai๊ฐ 3๋ฑ์ธ poe ์ถ์ // ["mumu", "soe", "kai", "poe", "mine"]
2) "kai" → 3๋ฑ์ธ kai๊ฐ 2๋ฑ์ธ soe ์ถ์ // ["mumu", "kai", "soe", "poe", "mine"]
3) "mine" → 5๋ฑ์ธ mine์ด 4๋ฑ์ธ poe ์ถ์ // ["mumu", "kai", "soe", "mine", "poe"]
4) "mine" → 4๋ฑ์ธ mine์ด 3๋ฑ์ธ soe ์ถ์ // ["mumu", "kai", "mine", "soe", "poe"]
์ต์ข
์์ → ["mumu", "kai", "mine", "soe", "poe"]
๐ก ์์ด๋์ด
1๏ธโฃ ์ด๋ฆ์ ์ธ๋ฑ์ค๋ก ๋งคํํ๊ธฐ
์ ์ ๋ฐฐ์ด players๋ ํ์ฌ ์์ ์์ผ๋ก ๋ค์ด์๋ค.
๋ฐ๋ผ์ ํธ๋ช ๋ ์ด๋ฆ์ผ๋ก ์ฆ์ ์์น๋ฅผ ์ฐพ์ผ๋ ค๋ฉด, ์ด๋ฆ → ์ธ๋ฑ์ค ๋งคํ์ ๋ง๋ค์ด์ผ ํ๋ค.
Map<String, Integer> map = new HashMap<>();
for(int i = 0; i < players.length; i++){
map.put(players[i], i);
}
์ด๋ ๊ฒ ํ๋ฉด "kai"๊ฐ ๋ถ๋ ธ์ ๋ indexMap.get("kai")๋ก ํ์ฌ ๋ฑ์ ์ธ๋ฑ์ค๋ฅผ O(1)๋ก ์ป์ ์ ์๋ค.
2๏ธโฃ ์ถ์ ์ฒ๋ฆฌํ๊ธฐ
ํด์ค์ง์ด ๋ถ๋ฅด๋ ์ด๋ฆ์ ๋ฐ๋ก ์ ์ ์์์ ์๋ฆฌ ๊ตํ์ ์๋ฏธํ๋ค.
์ฆ, idx์ ์ ์๊ฐ idx - 1์ ์ ์์ ์ค์๋๋ ๊ฒ์ด๋ค.
for (int i = 0; i < callings.length; i++) {
int idx = indexMap.get(callings[i]); // ํธ๋ช
๋ ์ ์์ ํ์ฌ ์์น
String front = answer[idx - 1]; // ๋ฐ๋ก ์ ์ ์
// ๋ฐฐ์ด์์ ๋ ์ ์ ์๋ฆฌ ๊ตํ
answer[idx - 1] = answer[idx];
answer[idx] = front;
// ๋ ๋ช
์ ์ธ๋ฑ์ค๋ง ๊ฐฑ์ (๋๊ธฐํ ๋ณด์ฅ)
indexMap.put(answer[idx - 1], idx - 1);
indexMap.put(answer[idx], idx);
}
์ด๋ idx - 1์ด๋ผ๊ณ ํด์ค ์ด์ ๋, ์ด์ฐจํผ ๋ฌธ์ ์ ์ฝ์กฐ๊ฑด ์ 1๋ฑ์ ๋ถ๋ฆฌ์ง ์์ผ๋ฏ๋ก ํญ์ ๊ด์ฐฎ๊ธฐ ๋๋ฌธ์ด๋ค.
๐ฉ๐ป๐ป ์ต์ข ์ฝ๋
import java.util.HashMap;
import java.util.Map;
class Solution {
public String[] solution(String[] players, String[] callings) {
String[] answer = players;
Map<String, Integer> map = new HashMap<>();
for(int i = 0; i < players.length; i++){
map.put(players[i], i);
}
for(int i = 0; i < callings.length; i++){
int idx = map.get(callings[i]);
String name = answer[idx - 1];
answer[idx - 1] = answer[idx];
answer[idx] = name;
map.put(answer[idx - 1], idx -1);
map.put(answer[idx], idx);
}
return answer;
}
}
๐ ์๊ฐ ๋ณต์ก๋
1๏ธโฃ ์ด๋ฆ → ์ธ๋ฑ์ค ๋งคํ
for (int i = 0; i < players.length; i++) {
map.put(players[i], i);
}
players ๋ฐฐ์ด์ ํ ๋ฒ ์ํํ๋ฉฐ ํด์๋งต์ ์ ์ฅํ๋ฏ๋ก O(N)์ด๋ค.
(์ด๋, N์ ์ ์์ ์)
2๏ธโฃ ์ถ์ ์ฒ๋ฆฌ
for (int i = 0; i < callings.length; i++) {
int idx = map.get(callings[i]); // O(1)
String front = answer[idx - 1]; // O(1)
answer[idx - 1] = answer[idx]; // O(1)
answer[idx] = front; // O(1)
map.put(answer[idx - 1], idx - 1); // O(1)
map.put(answer[idx], idx); // O(1)
}
๊ฐ ํธ์ถ์ ๋ํด ์์ ์๊ฐ ์์ ๋ง ์ํํ๋ฏ๋ก ๋ด๋ถ ์ฐ์ฐ์ O(1)์ด๊ณ ,
ํธ์ถ ํ์๋งํผ ๋ฐ๋ณตํ๋ฏ๋ก ์ ์ฒด ์๊ฐ ๋ณต์ก๋๋ O(M)์ด๋ค.
(์ด๋, M์ ํธ์ถ ํ์)
๐๐ป ๋ฐ๋ผ์ ์ต์ข ์๊ฐ ๋ณต์ก๋๋ O(N + M)์ด๋ค.
'๐ป ์ฝํ > ๐ JAVA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [ํ๋ก๊ทธ๋๋จธ์ค/JAVA] ๋ง์น ํ๊ธฐ (4) | 2025.08.13 |
|---|---|
| [ํ๋ก๊ทธ๋๋จธ์ค/JAVA] ์ถ์ต ์ ์ (5) | 2025.08.11 |
| [ํ๋ก๊ทธ๋๋จธ์ค/JAVA] ๋ฐ์ดํฐ ๋ถ์ (5) | 2025.08.09 |
| [ํ๋ก๊ทธ๋๋จธ์ค/JAVA] ์ด์ํ ์นธ (4) | 2025.08.04 |
| [ํ๋ก๊ทธ๋๋จธ์ค/JAVA] ๋ถ๋ ๊ฐ๊ธฐ (3) | 2025.07.30 |