Hello Kitty Eyes Shut
๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ’ป ์ฝ”ํ…Œ/๐Ÿ“Œ JAVA

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/JAVA] ๊ฐ€์žฅ ๋งŽ์ด ๋ฐ›์€ ์„ ๋ฌผ

๋ฐ˜์‘ํ˜•

 

 

 

๐Ÿ”— ๋ฌธ์ œ ๋ฐ”๋กœ๊ฐ€๊ธฐ

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

 

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

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

programmers.co.kr

 


๐Ÿ“Œ ๋ฌธ์ œ ์š”์•ฝ

 

์นœ๊ตฌ๋“ค ๊ฐ„์— ์„ ๋ฌผ์„ ์ฃผ๊ณ ๋ฐ›์€ ๊ธฐ๋ก์„ ๋ฐ”ํƒ•์œผ๋กœ ๋‹ค์Œ ๋‹ฌ์— ๊ฐ€์žฅ ๋งŽ์€ ์„ ๋ฌผ์„ ๋ฐ›๋Š” ์นœ๊ตฌ๋Š” ์„ ๋ฌผ์„ ๋ช‡ ๊ฐœ ๋ฐ›์„์ง€ ์ฐพ์•„์•ผ ํ•œ๋‹ค.

 

๋‹ค์Œ ๋‹ฌ์—๋Š” ์•„๋ž˜์˜ ์„ธ ๊ฐ€์ง€ ์กฐ๊ฑด์— ๋”ฐ๋ผ ์„ ๋ฌผ์„ ๋ฐ›์„ ์˜ˆ์ •์ด๋‹ค.

  • A์™€ B๊ฐ€ ์ฃผ๊ณ ๋ฐ›์€ ์„ ๋ฌผ์˜ ์ˆ˜๊ฐ€ ๋‹ค๋ฅด๋ฉด, ๋‘˜ ์‚ฌ์ด์—์„œ ๋” ๋งŽ์ด ์„ ๋ฌผํ–ˆ๋˜ ์‚ฌ๋žŒ์ด ์„ ๋ฌผ์„ ํ•˜๋‚˜ ๋ฐ›๋Š”๋‹ค.
  • A์™€ B๊ฐ€ ์ฃผ๊ณ ๋ฐ›์€ ์„ ๋ฌผ์˜ ์ˆ˜๊ฐ€ ๊ฐ™๊ฑฐ๋‚˜ ๊ธฐ๋ก์ด ์—†์œผ๋ฉด, ์„ ๋ฌผ์ง€์ˆ˜๊ฐ€ ๋” ๋†’์€ ์‚ฌ๋žŒ์ด ์„ ๋ฌผ์„ ํ•˜๋‚˜ ๋ฐ›๋Š”๋‹ค.
    (์„ ๋ฌผ ์ง€์ˆ˜ = ๋‚ด๊ฐ€ ์ค€ ์„ ๋ฌผ ์ˆ˜ - ๋‚ด๊ฐ€ ๋ฐ›์€ ์„ ๋ฌผ ์ˆ˜)
  • ์ฃผ๊ณ ๋ฐ›์€ ์„ ๋ฌผ์˜ ์ˆ˜๋„ ๊ฐ™๊ณ , ์„ ๋ฌผ์ง€์ˆ˜๋„ ๊ฐ™๋‹ค๋ฉด, ์•„๋ฌด๋„ ์„ ๋ฌผ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.

 

๐Ÿ“ฅ ์ž…๋ ฅ

  • friends
    • ์นœ๊ตฌ๋“ค์˜ ์ด๋ฆ„์„ ๋‹ด์€ ๋ฌธ์ž์—ด ๋ฐฐ์—ด
    • ex. ["muzi", "ryan", "frodo", "neo"]
    • ๊ธธ์ด๋Š” 2 ์ด์ƒ 50 ์ดํ•˜
    • ๊ฐ ์ด๋ฆ„์€ ์ค‘๋ณต ์—†์ด, ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž๋กœ ๊ตฌ์„ฑ๋œ ์ตœ๋Œ€ 10๊ธ€์ž
  • gifts
    • ์„ ๋ฌผ์„ ์ฃผ๊ณ ๋ฐ›์€ ๊ธฐ๋ก์„ ๋‹ด์€ ๋ฌธ์ž์—ด ๋ฐฐ์—ด
    • ex. ["muzi frodo", "ryan muzi"]
    • ๊ฐ ์›์†Œ๋Š” "๋ณด๋‚ธ์‚ฌ๋žŒ ๋ฐ›์€์‚ฌ๋žŒ" ํ˜•ํƒœ (๊ณต๋ฐฑ์œผ๋กœ ๋ณด๋‚ธ ์‚ฌ๋žŒ๊ณผ ๋ฐ›์€ ์‚ฌ๋žŒ์„ ๊ตฌ๋ถ„)
    • ๊ธธ์ด๋Š” 1 ์ด์ƒ 10,000 ์ดํ•˜
    • ๊ฐ™์€ ์‚ฌ๋žŒ์ด ์ž๊ธฐ ์ž์‹ ์—๊ฒŒ ์„ ๋ฌผํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์—†์Œ

 


๐Ÿ’ก ์•„์ด๋””์–ด

1๏ธโƒฃ ์นœ๊ตฌ ์Œ ๊ฐ„์˜ ์„ ๋ฌผ ๊ธฐ๋ก ์ •๋ฆฌ

int[][] cnt = new int[m][m];
int[] give_total = new int[m];
int[] receive_total = new int[m];

 

  • cnt[i][j]: i๋ฒˆ ์นœ๊ตฌ๊ฐ€ j๋ฒˆ ์นœ๊ตฌ์—๊ฒŒ ์ค€ ์„ ๋ฌผ์˜ ์ˆ˜
  • give_total[i]: i๋ฒˆ ์นœ๊ตฌ๊ฐ€ ์ „์ฒด ์นœ๊ตฌ๋“ค์—๊ฒŒ ์ค€ ์„ ๋ฌผ ์ˆ˜
  • receive_total[i]: i๋ฒˆ ์นœ๊ตฌ๊ฐ€ ์ „์ฒด ์นœ๊ตฌ๋“ค๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ์„ ๋ฌผ ์ˆ˜

๐Ÿ‘‰๐Ÿป ์ด ์ •๋ณด๋“ค์„ ์ด์šฉํ•ด์„œ ์„ ๋ฌผ ๊ด€๊ณ„์™€ ์„ ๋ฌผ ์ง€์ˆ˜๋ฅผ ๋ชจ๋‘ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ค€๋น„ํ–ˆ๋‹ค.

 

 

2๏ธโƒฃ ์„ ๋ฌผ ๊ธฐ๋ก ํŒŒ์‹ฑ ๋ฐ ๋ˆ„์ 

for(int i = 0; i < n; i++){
    String[] gift = gifts[i].split("\\s");
    String giver = gift[0];
    String receiver = gift[1];
            
    int row = 0, col = 0;
            
    for(int j = 0; j < m; j++){
        if(giver.equals(friends[j])){
            row = j;
            give_total[j]++;
        }
                
        if(receiver.equals(friends[j])){
            col = j;
            receive_total[j]++;
        }
    }
            
    cnt[row][col]++;
}

 

  • gifts ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉฐ, giver์™€ receiver์˜ ์ธ๋ฑ์Šค๋ฅผ friends์—์„œ ์ฐพ๊ธฐ
  • ์ด์— ๋”ฐ๋ผ cnt์™€ give_total, receive_total์„ ๋ชจ๋‘ ์—…๋ฐ์ดํŠธ ํ•ด์ฃผ๊ธฐ

 

3๏ธโƒฃ ๋ชจ๋“  ์นœ๊ตฌ ์Œ์— ๋Œ€ํ•ด ๋‹ค์Œ ๋‹ฌ ๋ฐ›์„ ์„ ๋ฌผ ๊ณ„์‚ฐ

for(int i = 0; i < m; i++){
    for(int j = 0; j < m; j++){
    if(i == j){
            continue;
    }
                
     if(cnt[i][j] > cnt[j][i]){
            answer[i]++;
     }
     else if(cnt[i][j] < cnt[j][i]){
            answer[j]++;
     }   
     else{
            int tmp1 = give_total[i] - receive_total[i];
            int tmp2 = give_total[j] - receive_total[j];
                    
            if(tmp1 > tmp2){
                answer[i]++;
            }
            else if(tmp1 < tmp2){
                answer[j]++;
            }
        }
                
    }
}

 

  • ๊ฐ ์นœ๊ตฌ์Œ (i, j)์— ๋Œ€ํ•ด ์„ ๋ฌผ์„ ์ฃผ๊ณ ๋ฐ›์€ ๊ธฐ๋ก์„ ๋น„๊ต
  • ์ž๊ธฐ ์ž์‹ ์—๊ฒŒ ์„ ๋ฌผ์„ ํ•  ์ˆ˜๋Š” ์—†์œผ๋‹ˆ i == j๋ผ๋ฉด ๊ฑด๋„ˆ๋›ฐ๊ธฐ
  • ์ฃผ๊ณ  ๋ฐ›์€ ์„ ๋ฌผ ์ˆ˜๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ, ์„ ๋ฌผ์„ ๋” ๋งŽ์ด ํ•œ ์นœ๊ตฌ๊ฐ€ ๋‹ค์Œ ๋‹ฌ์— ์„ ๋ฌผ์„ ํ•˜๋‚˜ ๋ฐ›์Œ
  • ์ฃผ๊ณ ๋ฐ›์€ ์„ ๋ฌผ ์ˆ˜๊ฐ€ ๊ฐ™์œผ๋ฉด, ์„ ๋ฌผ์ง€์ˆ˜๋ฅผ ๋น„๊ตํ•ด์„œ ๋” ํฐ ์ชฝ์ด ์„ ๋ฌผ์„ ํ•˜๋‚˜ ๋ฐ›์Œ
  • ์„ ๋ฌผ์ง€์ˆ˜ ๋งˆ์ € ๊ฐ™๋‹ค๋ฉด ์•„๋ฌด๋„ ์„ ๋ฌผ์„ ๋ฐ›์ง€ ์•Š์Œ

 

4๏ธโƒฃ ๊ฐ€์žฅ ๋งŽ์€ ์„ ๋ฌผ์„ ๋ฐ›๋Š” ์นœ๊ตฌ ์ฐพ๊ธฐ

int max = 0;
for(int i = 0; i < m; i++){
    if(answer[i] > max){
        max = answer[i];
    }
}

return max / 2;

 

  • ์ตœ์ข…์ ์œผ๋กœ ๊ฐ€์žฅ ๋งŽ์ด ๋ฐ›์€ ์„ ๋ฌผ์˜ ๊ฐœ์ˆ˜๋ฅผ max์— ์ €์žฅ
  • ์ด ๋•Œ ๋ชจ๋“  (i, j) ์Œ์„ ๋‹ค ๋น„๊ตํ•˜๋ฉด์„œ ์„œ๋กœ ์ฃผ๊ณ ๋ฐ›์€ ์„ ๋ฌผ์„ ๋‘ ๋ฒˆ์”ฉ ๊ณ„์‚ฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ฒฐ๊ณผ๋ฅผ 2๋กœ ๋‚˜๋ˆ ์„œ ๋ฐ˜ํ™˜

 


๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป ์ตœ์ข… ์ฝ”๋“œ

class Solution {
    public int solution(String[] friends, String[] gifts) {
        int n = gifts.length;
        int m = friends.length;
        
        int[][] cnt = new int[m][m];
        int[] give_total = new int[m];
        int[] receive_total = new int[m];
        int[] answer = new int[m];
        
        for(int i = 0; i < n; i++){
            String[] gift = gifts[i].split("\\s");
            String giver = gift[0];
            String receiver = gift[1];
            
            int row = 0, col = 0;
            
            for(int j = 0; j < m; j++){
                if(giver.equals(friends[j])){
                    row = j;
                    give_total[j]++;
                }
                
                if(receiver.equals(friends[j])){
                    col = j;
                    receive_total[j]++;
                }
            }
            
            cnt[row][col]++;
        }
        
        for(int i = 0; i < m; i++){
            for(int j = 0; j < m; j++){
                if(i == j){
                    continue;
                }
                
                if(cnt[i][j] > cnt[j][i]){
                    answer[i]++;
                }
                else if(cnt[i][j] < cnt[j][i]){
                    answer[j]++;
                }   
                else{
                    int tmp1 = give_total[i] - receive_total[i];
                    int tmp2 = give_total[j] - receive_total[j];
                    
                    if(tmp1 > tmp2){
                        answer[i]++;
                    }
                    else if(tmp1 < tmp2){
                        answer[j]++;
                    }
                }
                
            }
        }
        
        int max = 0;
        for(int i = 0; i < m; i++){
            if(answer[i] > max){
                max = answer[i];
            }
        }
        
        return max / 2;
    }
}

 


๐Ÿ•‘ ์‹œ๊ฐ„ ๋ณต์žก๋„

1๏ธโƒฃ ์„ ๋ฌผ ๊ธฐ๋ก ํŒŒ์‹ฑ ๋ฐ ๋ฐฐ์—ด ๋ˆ„์ 

for (int i = 0; i < n; i++) {
    ...
    for (int j = 0; j < m; j++) {
        if (giver.equals(friends[j])) ...
        if (receiver.equals(friends[j])) ...
    }
}

 

  • ๋ฐ”๊นฅ ๋ฃจํ”„๋Š” n๋ฒˆ
  • ์•ˆ์ชฝ ๋ฃจํ”„๋Š” m๋ฒˆ

๐Ÿ‘‰๐Ÿป ์—ฌ๊ธฐ์„œ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(n * m)

 

2๏ธโƒฃ ๋ชจ๋“  ์นœ๊ตฌ ์Œ์— ๋Œ€ํ•ด ์„ ๋ฌผ ๋น„๊ต

for (int i = 0; i < m; i++) {
    for (int j = 0; j < m; j++) {
        if (i == j) continue;
        ...
    }
}

 

  • ๋ชจ๋“  ์นœ๊ตฌ ์Œ (i != j) ๋น„๊ต

๐Ÿ‘‰๐Ÿป ์—ฌ๊ธฐ์„œ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(m²)

 

3๏ธโƒฃ ์ตœ๋Œ“๊ฐ’ ๊ณ„์‚ฐ

for (int i = 0; i < m; i++) {
    ...
}

 

  • ์นœ๊ตฌ ์ˆ˜๋งŒํผ ์ˆœํšŒ

๐Ÿ‘‰๐Ÿป ์—ฌ๊ธฐ์„œ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(m)

 

 

๋”ฐ๋ผ์„œ ์ตœ์ข… ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(n * m + m²)์ด๋‹ค.

(์ด๋•Œ n์€ ์„ ๋ฌผ ๊ธฐ๋ก ์ˆ˜, m์€ ์นœ๊ตฌ ์ˆ˜)

 

๋ฐ˜์‘ํ˜•