[TIL] (230817) ๐Ÿ’ฌ Map์€ key๊ฐ’์„ ํ™œ์šฉํ•œ value์˜ ๊ฒ€์ƒ‰ ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค.(์‹œ๊ฐ„ ๋ณต์žก๋„ ์ฃผ์˜)

Noh Jihyeonยท2023๋…„ 8์›” 17์ผ
0

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
4/49
post-thumbnail

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฌธ์ œ๋ฅผ ํ’€๋˜ ์ค‘ ๋‹ต์€ ๋งž์œผ๋‚˜ ๋ฌธ์ œ ์ œ์ถœํ•˜๊ธฐ๋ฅผ ์ง„ํ–‰ํ–ˆ์„๋•Œ ์ผ์ •๊ตฌ๊ฐ„์—์„œ ๊ณ„์† ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.
๋‚˜๋Š” ์•„๋ฌด๋ฆฌ ์ƒ๊ฐํ•ด๋„ ๋ญ๊ฐ€ ๋ฌธ์ œ์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์–ด์„œ ๋‚ด ์ฝ”๋“œ์™€ ์˜ˆ์‹œ์ฝ”๋“œ๋ฅผ ๋น„๊ตํ•˜๋ฉด์„œ ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด์•˜๋‹ค.


๐Ÿ”ธ๋ฌธ์ œ์ 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค-๋‹ฌ๋ฆฌ๊ธฐ๊ฒฝ์ฃผ

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




๋‚˜๋Š” ์ด ๋ฌธ์ œ๋ฅผ ๋ณด๊ณ  callings ๋ฐฐ์—ด์˜ ์ˆœ์„œ๋Œ€๋กœ players ๋ฐฐ์—ด์—์„œ ์ธ๋ฑ์Šค๊ฐ’์„ ์ฐพ๊ณ 

์ฐพ์€ ์ธ๋ฑ์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์•ž์˜ ์ธ๋ฑ์Šค๊ฐ’๊ณผ ๋ณ€๊ฒฝํ•˜๋ฉด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋”ฉ์„ ํ–ˆ๋‹ค.





import java.util.ArrayList;
import java.util.Collections;

class Solution {
    public String[] solution(String[] players, String[] callings) {
        ArrayList<String> playerList = new ArrayList<>();
        Collections.addAll(playerList, players); // players ๋ฐฐ์—ด์„ ArrayList๋กœ ๋ณต์‚ฌ
        
        for (String calling : callings) {
            int temp = playerList.indexOf(calling);
            Collections.swap(playerList, temp - 1, temp);
        }
        String[] playerArray = playerList.toArray(new String[0]);
        return playerArray;
    }
}


๊ฒฐ๊ณผ๋Š”~~



๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๋กœ ์‹คํŒจํ–ˆ๋‹ค^^


๐Ÿ”ธ์‹œ๋„ํ•ด๋ณธ ๊ฒƒ๋“ค

์‹œํ—˜์—์„œ๋Š” ๋ฐ˜ํ™˜๊ฐ’์ด String[]๋กœ ๋˜์–ด์žˆ์–ด์„œ ๋งˆ์ง€๋ง‰์— ArrayList<String&t; -> String[]๊ฐ€ ์†๋„์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์„๊นŒ?

๊ทธ๋ž˜์„œ ์ž„์˜๋กœ ๋ฐ˜ํ™˜๊ฐ’์„ ๋ณ€๊ฒฝํ•ด๋ดค๋‹ค.


  
import java.util.ArrayList;
import java.util.Collections;

class Solution {
    public ArrayList<String> solution(String[] players, String[] callings) {
        ArrayList<String> playerList = new ArrayList<>();
        Collections.addAll(playerList, players); // players ๋ฐฐ์—ด์„ ArrayList๋กœ ๋ณต์‚ฌ
        
        for (String calling : callings) {
            int temp = playerList.indexOf(calling);
            Collections.swap(playerList, temp - 1, temp);
        }
        // String[] playerArray = playerList.toArray(new String[0]);
        return playerList;
    }
}

๊ฒฐ๊ณผ๋Š” ๋™์ผํ•˜๊ฒŒ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜!!

์‹คํ–‰๋œ ํ•ญ๋ชฉ๋„ ์ด์ „๊ณผ ๋น„์Šทํ•œ ์ฒ˜๋ฆฌ์†๋„๋ฅผ ๋ณด์˜€๋‹ค.

๊ทธ๋ ‡๋‹ค๋Š”๊ฑด ์ด ์ฝ”๋“œ ์ž์ฒด๊ฐ€ ๋ฌธ์ œ๊ฒ ์ง€.....




ํ™•์ธํ•ด๋ณด๋‹ˆ ๋‚ด๊ฐ€ ํ•œ ์ฝ”๋”ฉ์€ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.

์„ ์ˆ˜ ์ˆ˜๊ฐ€ n, ํ˜ธ์ถœ ์ˆ˜๊ฐ€ m์ธ ๊ฒฝ์šฐ O(n * m)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

๋ฐœ์ƒํ•œ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ์ข€ ๋” ์ž์„ธํ•˜๊ฒŒ ํ™•์ธํ•ด๋ณด์•˜๋‹ค.


indexOf(): ์ด ์ž‘์—…์€ playerList์—์„œ ํŠน์ • ๊ฐ’์„ ์ฐพ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ตœ์•…์˜ ๊ฒฝ์šฐ, ๋ฆฌ์ŠคํŠธ ๋‚ด์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ๊ฒ€์‚ฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ O(n)์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ n์€ playerList์˜ ๊ธธ์ด์ž…๋‹ˆ๋‹ค.

Collections.swap(): ์ด ์ž‘์—…์€ ๋‘ ๊ฐœ์˜ ์š”์†Œ๋ฅผ ์Šค์™‘ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์ž‘์—…์€ O(1)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ์˜ ์Šค์™‘์€ indexOf()๋ฅผ ํ†ตํ•ด ์ฐพ์€ ์ธ๋ฑ์Šค์™€ ๊ทธ ์•ž์˜ ์ธ๋ฑ์Šค๋ฅผ ์Šค์™‘ํ•˜๋Š”๋ฐ, indexOf() ์ž์ฒด๊ฐ€ O(n)์ด๋ฏ€๋กœ ์ด ์—ฐ์‚ฐ๋„ ๊ฒฐ๊ตญ O(n) ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ, callings ๋ฐฐ์—ด์˜ ๊ธธ์ด๊ฐ€ m์ด๊ณ , playerList์˜ ๊ธธ์ด๊ฐ€ n์ผ ๋•Œ, callings ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉด์„œ indexOf()์™€ Collections.swap()์ด ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด์ ์ธ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(n * m)์ด ๋ฉ๋‹ˆ๋‹ค.


indexOf()๊ณผ swap์œผ๋กœ O(n * m)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ์ฆ๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ •๋‹ต์€ ๋งž์ง€๋งŒ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๋กœ ์ œ์ถœ์ด ์•ˆ๋˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.
๐Ÿค” ๊ทธ๋Ÿผ ์–ด๋–ค์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์งœ์•ผํ• ๊นŒ?

๐Ÿ™‹โ€โ™€ Key ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Value๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์–ด์„œ ๊ฒ€์ƒ‰ ์†๋„๊ฐ€ ์ƒ๋Œ€์ ์œผ๋กœ ๋น ๋ฅธ Map์„ ์‚ฌ์šฉํ•ด๋ณด์ž.




import java.util.HashMap;

public class Solution {
    public String[] solution(String[] players, String[] callings) {
        int n = players.length;
        HashMap<String, Integer> indexMap = new HashMap<>();

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

        for (String calling : callings) {
            int idx = indexMap.get(calling);
            if (idx > 0) {
                String temp = players[idx - 1];
                players[idx - 1] = players[idx];
                players[idx] = temp;

                indexMap.put(players[idx - 1], idx - 1);
                indexMap.put(players[idx], idx);
            }
        }
        return players;
    }
}

HashMap์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด (1). key๊ฐ’ ์ค‘๋ณต๋ถˆ๊ฐ€, (2) key๊ฐ’์œผ๋กœ ๊ฒ€์ƒ‰์‹œ ์†๋„ ํ–ฅ์ƒ ์ด๋ผ๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

์ด ์ฝ”๋“œ์—์„œ๋Š” String[] players์˜ ์š”์†Œ๊ฐ’์„ key๋กœ, ์ธ๋ฑ์Šค์™€ ๋งค์นญ๋˜๋Š” i๊ฐ’์„ value๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  temp๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•ด๋‹น๋˜๋Š” idx์™€ idx-1์˜ ์œ„์น˜๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋„๋ก ์ฝ”๋”ฉํ•œ๋‹ค.

= ์ œ์ถœ ์„ฑ๊ณต



๐Ÿ”ธํ•ด๊ฒฐ

Map์˜ key, value๊ฐ’์„ ์ด์šฉํ•˜์—ฌ ๋น ๋ฅธ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ–ˆ๋‹ค.


temp๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ”๊ฟ€ ์ธ๋ฑ์Šค์˜ ๊ฐ’์„ ์„ค์ •ํ•˜๊ณ  index.put์œผ๋กœ ๋ฐ”๋€ ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ๊นŒ์ง€ ํ•จ๊ป˜ ์žฌ์„ค์ •ํ•ด์คฌ๋‹ค.




๐Ÿ”ธ์•Œ๊ฒŒ ๋œ ์ 

Collections.swap()์™€ indexOf()๋Š” ๋‚ด๊ฐ€ ์›ํ•˜๋Š”๋ฐ๋กœ ๋™์ž‘ํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ๋งž์ง€๋งŒ, ์ด ๋‘๊ฐ€์ง€๊ฐ€ ํ•จ๊ป˜ ๋™์ž‘ํ• ๋•Œ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ n*m์ผ ์ •๋„๋กœ ๋งŽ์ด ์ƒ์Šนํ•œ๋‹ค๋Š”๊ฒƒ์€ ๋ชฐ๋ž๋‹ค.


์‹œ๊ฐ„ ๋ณต์žก๋„(Time Complexity), ๋น…-์˜ค ํ‘œ๊ธฐ๋ฒ•(Big-O Notation)์„ ๊ณต๋ถ€ํ•˜์—ฌ ๋‚ด๊ฐ€ ํ•œ ์ฝ”๋”ฉ์— ๋ถ€์—ฌ๋œ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ณ ๋ คํ•ด๋ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค.


๋˜ํ•œ Map์€ key๋ฅผ ์ด์šฉํ•˜์—ฌ ๋‚ด๋ถ€ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•˜๋Š” ์ž‘์—…์ด ํ•„์š”ํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค๋Š”๊ฒƒ์„ ์žŠ์ง€๋ง์ž.



profile
๊ผญ๊ผญ ์”น์–ด์„œ ์†Œํ™”์‹œํ‚ค๋Š” ๋ง›์žˆ๋Š” ์ฝ”๋”ฉ

0๊ฐœ์˜ ๋Œ“๊ธ€