[programmers] [PCCP ๊ธฐ์ถœ๋ฌธ์ œ] 3๋ฒˆ / ์ถฉ๋Œ์œ„ํ—˜ ์ฐพ๊ธฐ (java)

 

 

 

#์‹œ๋ฎฌ๋ ˆ์ด์…˜  #ํ•ด์‹œ๋งต

  

<๋ฌธ์ œ ๋ถ„์„>

points: ์šด์†ก ํฌ์ธํŠธ๋“ค์˜ ์ขŒํ‘œ
routes: ๋กœ๋ด‡์ด ์–ด๋А ํฌ์ธํŠธ๋ฅผ ๊ฑฐ์ณ์•ผ ํ•˜๋Š”์ง€
์ฐพ์•„์•ผ ํ•˜๋Š” ๊ฒƒ: ์œ„ํ—˜ ์ƒํ™ฉ์˜ ๋ฐœ์ƒ ํšŸ์ˆ˜

1) ๊ฐ๊ฐ์˜ route์— ๋Œ€ํ•ด์„œ ๊ฒฝ๋กœ ๋ฐฐ์—ด์„ ๋งŒ๋“ ๋‹ค. (์ด๋™ ํฌ์ธํŠธ ์ด์šฉํ•ด์„œ)

  - ์ˆœํšŒํ•  ๋•Œ ์ธ๋ฑ์Šค๋ฅผ ์ „์ฒด ๊ฐ’๋ณด๋‹ค ํ•˜๋‚˜ ์ž‘๊ฒŒ ์žก์•„์„œ ํ˜„์žฌ ๊ฐ’ ๊ธฐ์ค€์œผ๋กœ ๋‹ค์Œ ๊ฐ’๊นŒ์ง€ ์ด๋™ ๊ฒฝ๋กœ๋ฅผ ์ฒดํฌํ•˜๊ฒŒ ํ•จ
2) ๋งŒ๋“ค์–ด์ง„ ๊ฒฝ๋กœ ๋ฐฐ์—ด์„ ์ธ๋ฑ์Šค๋ณ„๋กœ ํ™•์ธํ•ด์„œ ๊ฒน์น˜๋ฉด ์œ„ํ—˜ ์ƒํ™ฉ +1, ๋ฐ˜๋ณต๋ฌธ ์ข…๋ฃŒ

  - ๊ฐ™์€ ์ขŒํ‘œ์— ๋งŽ์€ ๊ฐ’์ด ์ถฉ๋Œํ•ด๋„ ํ•˜๋‚˜์˜ ์ถฉ๋Œ๋กœ ์ฒดํฌํ•ด์„œ HashMap ์‚ฌ์šฉํ•ด์„œ ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ๋“ฑ์žฅ ํšŸ์ˆ˜๋ฅผ ์„ธ๋Š” ๋ฐฉ์‹์œผ๋กœ ํ–ˆ์Œ

๊ฒฝ๋กœ ๊ณ„์‚ฐ์€?
ex) 1,4์—์„œ 6,4๋กœ ์ด๋™ํ•˜๋ ค๋ฉด: r ํ•˜๋‚˜์”ฉ ์ฆ๊ฐ€
๊ธฐ๋ณธ์ ์œผ๋กœ ํ–‰ ๋จผ์ € ์ด๋™, ๊ทธ๋‹ค์Œ ์—ด ์ด๋™

 

<์ฃผ์˜ํ•  ์ >

  • ์ฒ˜์Œ์—๋Š” ์ „์ฒด ๊ฒฝ๋กœ์˜ ์ˆ˜๋ฅผ ์„ธ์„œ ๊ทธ๊ฑธ ํ•˜๋‚˜์”ฉ ๋นผ๋Š” ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ ธ๋Š”๋ฐ, ๋””๋ฒ„๊น…์„ ํ•˜๋‹ค๊ฐ€ ๋งค ์ดˆ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•œ ๋ฐ”ํ€ด์”ฉ ๋Œ๋ฆฌ๋Š” ๊ฒƒ์ด ๋จธ๋ฆฟ์†์—์„œ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ•ด๋ณด๊ธฐ์— ๋” ํŽธํ•˜๋‹ค๊ณ  ๋А๊ปด์กŒ๋‹ค.
  • points ๋ฐฐ์—ด์—์„œ ์ขŒํ‘œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ๋•Œ clone()์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์›๋ณธ ๋ฐฐ์—ด์˜ ๊ฐ’์„ ๋ฐ”๊ฟ”์„œ ์ฐธ์กฐ๊ฐ’ ์˜ค๋ฅ˜ ๋ฐœ์ƒ
  • ์ œ์‹œ๋˜๋Š” ๊ฐ’ ์ธ๋ฑ์Šค๊ฐ€ 1๋ถ€ํ„ฐ ์‹œ์ž‘๋˜๋ฏ€๋กœ ์ธ๋ฑ์Šค๋ฅผ ์žก์„ ๋•Œ ์ž˜ ์ผ์น˜์‹œ์ผœ์•ผ ํ•œ๋‹ค
  • HashMap์˜ key๋ฅผ int[]๋กœ ์žก์œผ๋ฉด ๊ฐ™์€ ๊ฐ์ฒด๋กœ ์ธ์‹ํ•˜์ง€ ์•Š๋Š”๋‹ค. List<Integer> ์‚ฌ์šฉ

 

import java.util.*;
import java.util.stream.Collectors;

class Solution {
    public int solution(int[][] points, int[][] routes) {
        int answer = 0;
        int countRoutes = routes.length;    // ๋กœ๋ด‡์˜ ์ˆ˜
        
        // ๊ฐ ๋กœ๋ด‡์ด ์–ด๋–ค ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•˜๋Š”์ง€ ์ €์žฅํ•œ๋‹ค
        // key: ๋กœ๋ด‡ ์ธ๋ฑ์Šค(0~routes.length - 1), value: ๊ฐ ๋กœ๋ด‡์˜ ๊ฒฝ๋กœ(int[])๋ฅผ ArrayList์— ์ €์žฅ
        HashMap<Integer, ArrayList<int[]>> paths = new HashMap<>();
        
        for (int idx = 0; idx < countRoutes; idx++) {   // 0 ~ routes.length - 1๊นŒ์ง€ ๋กœ๋ด‡ ์ˆœํšŒ
            paths.put(idx, new ArrayList<int[]>()); // paths์— ๋กœ๋ด‡ ์ธ๋ฑ์Šค key ์‚ฝ์ž…
            int[] route = routes[idx];  // route: ๋กœ๋ด‡์˜ ์ด๋™ ๊ฒฝ๋กœ ๋ฐฐ์—ด
            int l = route.length;   // l: ๊ฐ ๋กœ๋ด‡์ด ๊ฑฐ์น˜๋Š” ํฌ์ธํŠธ์˜ ์ˆ˜
            paths.get(idx).add(points[route[0] - 1].clone());  // ์‹œ์ž‘์  paths์— ์‚ฝ์ž…
            
            for (int i = 0; i < l - 1; i++) {
                int[] cur = points[(route[i] - 1)].clone();   // ํ˜„์žฌ ์ขŒํ‘œ
                int[] next = points[(route[i + 1] - 1)].clone();  // ๋‹ค์Œ์— ์ด๋™ํ•  ์ขŒํ‘œ

                while (cur[0] != next[0]) { // row
                    if (cur[0] < next[0]) {
                        cur[0] = cur[0] + 1;
                        paths.get(idx).add(new int[]{cur[0], cur[1]});               
                    } else {
                        cur[0] = cur[0] - 1;
                        paths.get(idx).add(new int[]{cur[0], cur[1]});
                    }
                }
                while (cur[1] != next[1]) { // column
                    if (cur[1] < next[1]) {
                        cur[1] = cur[1] + 1;
                        paths.get(idx).add(new int[]{cur[0], cur[1]});               
                    } else {
                        cur[1] = cur[1] - 1;
                        paths.get(idx).add(new int[]{cur[0], cur[1]});
                    }
                }   
            }
        }
        
        // ๊ฐ€์žฅ ๊ธด ๊ฒฝ๋กœ ์ˆ˜ ๊ตฌํ•˜๊ธฐ
        int maxCnt = 0;
        Set<Integer> keySet = paths.keySet();        
        for (Integer key : keySet) {
            if (paths.get(key).size() > maxCnt) {
                maxCnt = paths.get(key).size();
            }                                        
        }
        
        // ์ถฉ๋Œ ํ™•์ธ
        for (int sec = 0; sec < maxCnt; sec++) { // ๊ฐ€์žฅ ๊ธด ๊ฒฝ๋กœ๋งŒํผ ์ˆœํšŒ (๋งค ์ดˆ์— ํ•ด๋‹น)
            HashMap<List<Integer>, Integer> check = new HashMap<>();    // ๊ฐ ์‹œ๊ฐ„๋ณ„ ๋“ฑ์žฅ ๊ฒฝ๋กœ count
            for (int i = 0; i < countRoutes; i++) { // ๋กœ๋ด‡ ์ˆœ์„œ๋Œ€๋กœ ํƒ์ƒ‰
                if (paths.get(i).size() != 0) { // ๊ฒฝ๋กœ๊ฐ€ ๋๋‚˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ์—๋งŒ
                    int[] target = paths.get(i).get(0);
                    List<Integer> targetList = Arrays.stream(target).boxed().collect(Collectors.toList());
                    if (check.containsKey(targetList)) {    // ์ด๋ฏธ ๋‚˜์˜จ ๊ฑฐ๋ฉด + 1
                        check.replace(targetList, check.get(targetList) + 1);
                    } else {
                        check.put(targetList, 1);
                    }
                    
                    paths.get(i).remove(0); // ๊ณ„์‚ฐํ•œ ๊ฒฝ๋กœ๋Š” path์—์„œ ์‚ญ์ œ
                    
                }   
            }   
            
            for (List<Integer> key : check.keySet()) {
                if (check.get(key) > 1) {   // 2๋ฒˆ ์ด์ƒ ๋“ฑ์žฅํ•œ ๊ฒฝ์šฐ ์ค‘๋ณต ๊ฒฝ๋กœ๋กœ count
                    answer++;
                }
            }
        }   
        return answer;
    }
}
 

 

โœ… 1. paths.get(i).remove(0) ์„ฑ๋Šฅ ์ด์Šˆ

๋ฌธ์ œ

  • ArrayList.remove(0)๋Š” O(n) ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ maxCnt๋งŒํผ ๋ฐ˜๋ณตํ•˜๊ฒŒ ๋˜๋ฉด ์ „์ฒด ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(R × maxLen²) ์ˆ˜์ค€์œผ๋กœ ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค (R: ๋กœ๋ด‡ ์ˆ˜, maxLen: ๊ฒฝ๋กœ ๊ธธ์ด).
  • ๋กœ๋ด‡ ์ˆ˜๋‚˜ ๊ฒฝ๋กœ ๊ธธ์ด๊ฐ€ ๋งŽ์•„์งˆ ๊ฒฝ์šฐ ์‹ฌ๊ฐํ•œ ๋น„ํšจ์œจ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ”ง ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  • index ๊ธฐ๋ฐ˜ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์œผ๋กœ ์ „ํ™˜ (์Šฌ๋ผ์ด์‹ฑ ๋Œ€์‹  ์ธ๋ฑ์Šค๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ๋ฐฉ์‹)

โœ… 2. ์ขŒํ‘œ ๋น„๊ต ์‹œ List<Integer> → ๋ฌธ์ž์—ด ๋˜๋Š” Pair ๊ตฌ์กฐ๋กœ ๋‹จ์ˆœํ™”

๋ฌธ์ œ

  • List<Integer>๋กœ ์ขŒํ‘œ๋ฅผ ํ‘œํ˜„ํ•˜๊ณ  Map ํ‚ค๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฑด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฌด๊ฒ์Šต๋‹ˆ๋‹ค.

๐Ÿ”ง ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  • ์ขŒํ‘œ๋ฅผ ๋ฌธ์ž์—ด "r,c" ํ˜•์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜, Objects.hash(r, c)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

SW๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ํ‰๊ฐ€, ๊ต์œก, ์ฑ„์šฉ๊นŒ์ง€ Total Solution์„ ์ œ๊ณตํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์„ฑ์žฅ์„ ์œ„ํ•œ ๋ฒ ์ด์Šค์บ ํ”„

programmers.co.kr