์•Œ๊ณ ๋ฆฌ์ฆ˜๐Ÿฅš/๋ฌธ์ œํ’€์ด (Java)

[Programmers] ๋ฉ”๋‰ด ๋ฆฌ๋‰ด์–ผ (Lv.2) 2023/7/12

๐Ÿช„ํ•˜๋ฃจ๐Ÿช„ 2023. 7. 12. 21:53
728x90
๋ฌธ์ œ ์ œ๋ชฉ ์ •๋‹ต๋ฅ  ๋‚œ์ด๋„
๋ฉ”๋‰ด๋ฆฌ๋‰ด์–ผ 48% Lv.2
 

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

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

๋ฌธ์ œ์š”์•ฝ

์†๋‹˜๋ฒˆํ˜ธ์™€ ์†๋‹˜์ด ์ฃผ๋ฌธํ•œ ๋‹จํ’ˆ๋ฉ”๋‰ด ์กฐํ•ฉ์ด ์ฃผ์–ด์งˆ ๋•Œ, ์ƒˆ๋กœ์šด ์ฝ”์Šค ์š”๋ฆฌ๋ฅผ ๊ตฌํ•˜์—ฌ๋ผ.

์กฐ๊ฑด 1) ์ƒˆ๋กœ์šด ์ฝ”์Šค์š”๋ฆฌ๋Š” ๋‹จํ’ˆ๋ฉ”๋‰ด 2๊ฐœ ์ด์ƒ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด์•ผ ํ•œ๋‹ค

์กฐ๊ฑด 2) ์ƒˆ๋กœ์šด ์ฝ”์Šค์š”๋ฆฌ๋Š” ์†๋‹˜์ด ์ฃผ๋ฌธํ•œ ๋‹จํ’ˆ๋ฉ”๋‰ด ์กฐํ•ฉ์— ์ ์–ด๋„ 2๋ฒˆ ์ด์ƒ ํฌํ•จ๋˜์–ด์•ผ ํ•œ๋‹ค(์†๋‹˜์ด 2๋ฒˆ ์ด์ƒ ์ฃผ๋ฌธ)

์กฐ๊ฑด 3) ์ •๋‹ต ๋ฐฐ์—ด์€ ๋ฌธ์ž์—ด ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋˜์–ด ๋ฐ˜ํ™˜๋˜์–ด์•ผ ํ•œ๋‹ค.

์กฐ๊ฑด 4) ์ฝ”์Šค ์š”๋ฆฌ์˜ ๋‹จํ’ˆ๋ฉ”๋‰ด ๊ฐœ์ˆ˜๊ฐ€ ๊ฐ™์„ ๊ฒฝ์šฐ, ๋” ๋งŽ์ด ์ฃผ๋ฌธ๋œ ๊ฒƒ์„ ๋ฉ”๋‰ด์— ์ถ”๊ฐ€ํ•œ๋‹ค(๊ฐ™๋‹ค๋ฉด ๋‘˜ ๋‹ค ์ถ”๊ฐ€)

์กฐ๊ฑด 4์˜ ๊ฒฝ์šฐ ๋ฌธ์ œ์— ๊ธฐ์ˆ ๋˜์–ด ์žˆ์ง€๋Š” ์•Š์ง€๋งŒ, ์งˆ๋ฌธํ•˜๊ธฐ ๊ฒŒ์‹œํŒ์„ ํ†ตํ•ด ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค. 

 

 

์ƒ๊ฐํ•  ๊ฒƒ

์šฐ์„ , ๋ฐฐ์—ด์˜ ํฌ๊ธฐ์™€ ๋ฌธ์ž์—ด์˜ ํฌ๊ธฐ๋ฅผ ๋ณด๊ณ  ์™„์ „ ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•œ ๋ฌธ์ œ์ธ์ง€ ํ™•์ธํ•˜์—ฌ์•ผ ํ•œ๋‹ค.

๋ฐฐ์—ด ๊ธธ์ด 20, ๋ฌธ์ž์—ด ๊ธธ์ด 10์ดํ•˜๋กœ, ์™„์ „ ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

ํ’€์ด

Step1. course ๊ฐ’์— ๋Œ€ํ•ด์„œ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜ ์ฐพ๊ธฐ String[] dfs(String str, int len){return String[]} ํ•จ์ˆ˜

  • stack ๊ธธ์ด==ํ˜„์žฌ course ⇒ ๊ฒฝ์šฐ์˜ ์ˆ˜ ์ถ”๊ฐ€ + pop()
  • stack ๊ธธ์ด==0 push
  • ๋‚˜๋จธ์ง€[1~course-1] ๊ธฐ๋ณธ์ ์œผ๋กœ pushํ•˜๋˜, ๋‚จ์€ ์›์†Œ๊ฐ€ ์—†์œผ๋ฉด pop()

 

Step2. ํ•ด๋‹น ๊ฒฝ์šฐ๋ฅผ hashmap ์ด์šฉํ•˜์—ฌ dictionary ํ˜•ํƒœ๋กœ ์ €์žฅ("์š”๋ฆฌ๋ชฉ๋ก":์ฃผ๋ฌธ๊ฐœ์ˆ˜)

 

Step3. dictionary๋กœ ์ €์žฅํ•  ๋•Œ ๊ฐ course ๊ฐ’์— ๋Œ€ํ•ด maxValue๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ, maxValue์— ํ•ด๋‹นํ•˜๋Š” dictionary๋งŒ ์ •๋‹ต์— ์ถ”๊ฐ€

 

Step4. ์ •๋‹ต ํ˜•ํƒœ๋ฅผ ์ •๋ ฌํ•œ ๋’ค, array๋กœ ๋ณ€ํ™˜

 

 

์ฝ”๋“œ

import java.util.*;
class Solution {
    String[] dfs(String str, int len){
        List<String> vector=new ArrayList<String>();
        int[] idx_stack=new int[len];
        int top=-1;
        int start_idx=-1;
        int last_idx=0;
        while(start_idx<=str.length()-len){
            if(top==-1){//push
                idx_stack[++top]=++start_idx;
                last_idx=start_idx;
            }else if(top==(len-1)){//์ตœ๋Œ€ ์›์†Œ ์ฑ„์›€
                String nowstr="";
                for(int idx:idx_stack){
                    nowstr+=str.substring(idx, idx+1);
                }
                vector.add(nowstr);

                last_idx=idx_stack[top--];
                while(top>-1){
                    if(last_idx+1<=(str.length()-1)){//ํ˜„์žฌ ์›์†Œ len-1๊ฐœ
                        break;
                    }else{//ํ˜„์žฌ ์›์†Œ len-2๊ฐœ->pop
                        last_idx=idx_stack[top--];
                    }
                }
            }else{//1๊ฐœ ์ด์ƒ ์ตœ๋Œ€-1 ์ดํ•˜
                while(top>-1){
                    if(last_idx+1<=(str.length()-1)){//push
                        idx_stack[++top]=++last_idx;
                        break;
                    }else{//pop
                        last_idx=idx_stack[top--];
                    }
                }
            }
        }
        return vector.toArray(new String[vector.size()]);
    }
    public String[] solution(String[] orders, int[] course) {
        List<String> answer = new ArrayList<String>();
        for(int c_num:course){
            int maxCount=0;
            Map<String, Integer> ht = new HashMap<String, Integer>();
            for(int i=0; i<orders.length;i++){
                char[] str_char=orders[i].toCharArray();
                Arrays.sort(str_char);
                String now_order=new String(str_char);
                if(now_order.length()>=c_num){
                    String[] s_list=dfs(now_order, c_num);
                    for(String substr:s_list){
                        if(ht.containsKey(substr)==true){
                            ht.put(substr, ht.get(substr)+1);
                            if(maxCount==1){
                                maxCount=2;
                            }else{
                                if(maxCount<ht.get(substr)){
                                    maxCount+=1;
                                }
                            }
                        }else{
                            ht.put(substr, 1);
                            if(maxCount==0){
                                maxCount=1;
                            }
                        }
                    }
                }
            }
            for(String idx:ht.keySet()){
                if(maxCount<2){
                    break;
                }
                else if(ht.get(idx)==maxCount){
                    answer.add(idx);
                }else{
                    continue;
                }
            }
        }
        answer.sort(null);
        return answer.toArray(new String[answer.size()]);
    }
}

 

์‚ฌ์šฉํ•œ ๊ธฐ๋Šฅ ์ •๋ฆฌ

- ๋ฌธ์ž์—ด substring

๋ฌธ์ž์—ด๋ณ€์ˆ˜.substring(์‹œ์ž‘ ์ธ๋ฑ์Šค, ๋ ์ธ๋ฑ์Šค+1)

 

- List ์ •๋ ฌ

List๋ณ€์ˆ˜.sort(null)

 

- List -> Array ๋ณ€ํ™˜

List๋ณ€์ˆ˜.toArray(new ์ž๋ฃŒํ˜•(List๋ณ€์ˆ˜.size()) 

 

- ํ•ด์‹œ ํ•จ์ˆ˜ ์‚ฌ์šฉ

Map<key์ž๋ฃŒํ˜•, value์ž๋ฃŒํ˜•> ๋ณ€์ˆ˜๋ช… = new HashMap<key์ž๋ฃŒํ˜•, value์ž๋ฃŒํ˜•>();

  • ๊ฐ’ ์ถ”๊ฐ€     ๋ณ€์ˆ˜๋ช….put(key, value)
  • ๊ฐ’์œผ๋กœ ์‚ญ์ œ    ๋ณ€์ˆ˜๋ช….values().remove(์‚ญ์ œํ• ๊ฐ’)
  • ์กฐ๊ฑด์œผ๋กœ ์‚ญ์ œ    ๋ณ€์ˆ˜๋ช….values().removeIf(์กฐ๊ฑด)
  • ๋ชจ๋“  ํ‚ค ๊ฐ€์ ธ์˜ค๊ธฐ    ๋ณ€์ˆ˜๋ช….keySet()
  • ๋ชจ๋“  ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ    ๋ณ€์ˆ˜๋ช….values()
  • ํ‚ค๊ฐ’์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธ    ๋ณ€์ˆ˜๋ช….containsKey(ํ‚ค๊ฐ’)

 

 

ํ•œ ์ค„ ์ •๋ฆฌ

ํ•ด๋‹น ๋‚ด์šฉ์€ python์˜ dictionary ์ž๋ฃŒํ˜•์„ ์‚ฌ์šฉํ•˜๋ฉด ์ƒ๋‹นํžˆ ๋น ๋ฅธ ์‹œ๊ฐ„ ๋‚ด์— ํ’€ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

Java ์ž๋ฃŒํ˜• ๋ณ€ํ™˜์ด ์•„์ง ์ต์ˆ™ํ•˜์ง€ ์•Š์•„์„œ ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆฐ ๋ฌธ์ œ!  

728x90