ABOUT ME

-

  • [2020 ์นด์นด์˜ค ๋ธ”๋ผ์ธ๋“œ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ] ๊ฐ€์‚ฌ ๊ฒ€์ƒ‰ JAVA
    STUDY ๐Ÿ’›/์•Œ๊ณ ๋ฆฌ์ฆ˜ 2021. 2. 17. 16:49
    ๋ฐ˜์‘ํ˜•

     

    [๋ฌธ์ œ]


    programmers.co.kr/learn/courses/30/lessons/60060

     

    ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ๊ฐ€์‚ฌ ๊ฒ€์ƒ‰

     

    programmers.co.kr

    ์นœ๊ตฌ๋“ค๋กœ๋ถ€ํ„ฐ ์ฒœ์žฌ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋กœ ๋ถˆ๋ฆฌ๋Š” ํ”„๋กœ๋„๋Š” ์Œ์•…์„ ํ•˜๋Š” ์นœ๊ตฌ๋กœ๋ถ€ํ„ฐ ์ž์‹ ์ด ์ข‹์•„ํ•˜๋Š” ๋…ธ๋ž˜ ๊ฐ€์‚ฌ์— ์‚ฌ์šฉ๋œ ๋‹จ์–ด๋“ค ์ค‘์— ํŠน์ • ํ‚ค์›Œ๋“œ๊ฐ€ ๋ช‡ ๊ฐœ ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•˜๋‹ˆ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๊ฐœ๋ฐœํ•ด ๋‹ฌ๋ผ๋Š” ์ œ์•ˆ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.
    ๊ทธ ์ œ์•ˆ ์‚ฌํ•ญ ์ค‘, ํ‚ค์›Œ๋“œ๋Š” ์™€์ผ๋“œ์นด๋“œ ๋ฌธ์ž์ค‘ ํ•˜๋‚˜์ธ '?'๊ฐ€ ํฌํ•จ๋œ ํŒจํ„ด ํ˜•ํƒœ์˜ ๋ฌธ์ž์—ด์„ ๋œปํ•ฉ๋‹ˆ๋‹ค. ์™€์ผ๋“œ์นด๋“œ ๋ฌธ์ž์ธ '?'๋Š” ๊ธ€์ž ํ•˜๋‚˜๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, ์–ด๋–ค ๋ฌธ์ž์—๋„ ๋งค์น˜๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
    ์˜ˆ๋ฅผ ๋“ค์–ด "fro??"๋Š” "frodo", "front", "frost" ๋“ฑ์— ๋งค์น˜๋˜์ง€๋งŒ "frame", "frozen"์—๋Š” ๋งค์น˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    ๊ฐ€์‚ฌ์— ์‚ฌ์šฉ๋œ ๋ชจ๋“  ๋‹จ์–ด๋“ค์ด ๋‹ด๊ธด ๋ฐฐ์—ด words์™€ ์ฐพ๊ณ ์ž ํ•˜๋Š” ํ‚ค์›Œ๋“œ๊ฐ€ ๋‹ด๊ธด ๋ฐฐ์—ด queries๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ, ๊ฐ ํ‚ค์›Œ๋“œ ๋ณ„๋กœ ๋งค์น˜๋œ ๋‹จ์–ด๊ฐ€ ๋ช‡ ๊ฐœ์ธ์ง€ ์ˆœ์„œ๋Œ€๋กœ ๋ฐฐ์—ด์— ๋‹ด์•„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด ์ฃผ์„ธ์š”.

     

    [๊ฐ€์‚ฌ ๋‹จ์–ด ์ œํ•œ์‚ฌํ•ญ]
    - words์˜ ๊ธธ์ด(๊ฐ€์‚ฌ ๋‹จ์–ด์˜ ๊ฐœ์ˆ˜)๋Š” 2 ์ด์ƒ 100,000 ์ดํ•˜์ž…๋‹ˆ๋‹ค.
    - ๊ฐ ๊ฐ€์‚ฌ ๋‹จ์–ด์˜ ๊ธธ์ด๋Š” 1 ์ด์ƒ 10,000 ์ดํ•˜๋กœ ๋นˆ ๋ฌธ์ž์—ด์ธ ๊ฒฝ์šฐ๋Š” ์—†์Šต๋‹ˆ๋‹ค.
    - ์ „์ฒด ๊ฐ€์‚ฌ ๋‹จ์–ด ๊ธธ์ด์˜ ํ•ฉ์€ 2 ์ด์ƒ 1,000,000 ์ดํ•˜์ž…๋‹ˆ๋‹ค.
    - ๊ฐ€์‚ฌ์— ๋™์ผ ๋‹จ์–ด๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ๋‚˜์˜ฌ ๊ฒฝ์šฐ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ณ  words์—๋Š” ํ•˜๋‚˜๋กœ๋งŒ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
    - ๊ฐ ๊ฐ€์‚ฌ ๋‹จ์–ด๋Š” ์˜ค์ง ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž๋กœ๋งŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ, ํŠน์ˆ˜๋ฌธ์ž๋‚˜ ์ˆซ์ž๋Š” ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

    [๊ฒ€์ƒ‰ ํ‚ค์›Œ๋“œ ์ œํ•œ์‚ฌํ•ญ]
    - queries์˜ ๊ธธ์ด(๊ฒ€์ƒ‰ ํ‚ค์›Œ๋“œ ๊ฐœ์ˆ˜)๋Š” 2 ์ด์ƒ 100,000 ์ดํ•˜์ž…๋‹ˆ๋‹ค.
    - ๊ฐ ๊ฒ€์ƒ‰ ํ‚ค์›Œ๋“œ์˜ ๊ธธ์ด๋Š” 1 ์ด์ƒ 10,000 ์ดํ•˜๋กœ ๋นˆ ๋ฌธ์ž์—ด์ธ ๊ฒฝ์šฐ๋Š” ์—†์Šต๋‹ˆ๋‹ค.
    - ์ „์ฒด ๊ฒ€์ƒ‰ ํ‚ค์›Œ๋“œ ๊ธธ์ด์˜ ํ•ฉ์€ 2 ์ด์ƒ 1,000,000 ์ดํ•˜์ž…๋‹ˆ๋‹ค.๊ฒ€์ƒ‰ ํ‚ค์›Œ๋“œ๋Š” ์ค‘๋ณต๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
    - ๊ฐ ๊ฒ€์ƒ‰ ํ‚ค์›Œ๋“œ๋Š” ์˜ค์ง ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž์™€ ์™€์ผ๋“œ์นด๋“œ ๋ฌธ์ž์ธ '?' ๋กœ๋งŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ, ํŠน์ˆ˜๋ฌธ์ž๋‚˜ ์ˆซ์ž๋Š” ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
    - ๊ฒ€์ƒ‰ ํ‚ค์›Œ๋“œ๋Š” ์™€์ผ๋“œ์นด๋“œ ๋ฌธ์ž์ธ '?'๊ฐ€ ํ•˜๋‚˜ ์ด์ƒ ํฌํ•จ๋ผ ์žˆ์œผ๋ฉฐ, '?'๋Š” ๊ฐ ๊ฒ€์ƒ‰ ํ‚ค์›Œ๋“œ์˜ ์ ‘๋‘์‚ฌ ์•„๋‹ˆ๋ฉด ์ ‘๋ฏธ์‚ฌ ์ค‘ ํ•˜๋‚˜๋กœ๋งŒ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.
    -> ์˜ˆ๋ฅผ ๋“ค์–ด "??odo", "fro??", "?????"๋Š” ๊ฐ€๋Šฅํ•œ ํ‚ค์›Œ๋“œ์ž…๋‹ˆ๋‹ค.
    ๋ฐ˜๋ฉด์— "frodo"('?'๊ฐ€ ์—†์Œ), "fr?do"('?'๊ฐ€ ์ค‘๊ฐ„์— ์žˆ์Œ), "?ro??"('?'๊ฐ€ ์–‘์ชฝ์— ์žˆ์Œ)๋Š” ๋ถˆ๊ฐ€๋Šฅํ•œ ํ‚ค์›Œ๋“œ์ž…๋‹ˆ๋‹ค.

    [์ž…์ถœ๋ ฅ ์˜ˆ]

    - "fro??"๋Š” "frodo", "front", "frost"์— ๋งค์น˜๋˜๋ฏ€๋กœ 3์ž…๋‹ˆ๋‹ค.
    - "????o"๋Š” "frodo", "kakao"์— ๋งค์น˜๋˜๋ฏ€๋กœ 2์ž…๋‹ˆ๋‹ค.
    - "fr???"๋Š” "frodo", "front", "frost", "frame"์— ๋งค์น˜๋˜๋ฏ€๋กœ 4์ž…๋‹ˆ๋‹ค.
    - "fro???"๋Š” "frozen"์— ๋งค์น˜๋˜๋ฏ€๋กœ 1์ž…๋‹ˆ๋‹ค.
    - "pro?"๋Š” ๋งค์น˜๋˜๋Š” ๊ฐ€์‚ฌ ๋‹จ์–ด๊ฐ€ ์—†์œผ๋ฏ€๋กœ 0 ์ž…๋‹ˆ๋‹ค.

     


     

    [Solution 1]
    - ์ด์ง„ํƒ์ƒ‰ ์‚ฌ์šฉ X
     - ์ •ํ™•์„ฑ ํ…Œ์ŠคํŠธ 18/18 ํ†ต๊ณผ (25.0)
     - ํšจ์œจ์„ฑ ํ…Œ์ŠคํŠธ 2/5 ํ†ต๊ณผ (30.0)
     - ํ•ฉ๊ณ„ 55.0 / 100.0

    package programmers_๊ฐ€์‚ฌ๊ฒ€์ƒ‰;
    
    public class Main {
    	public static void main(String[] args) {
    		//TEST CASE
    		String[] words = {"frodo", "front", "frost", "frozen", "frame", "kakao"};
    		String[] queries = {"fro??", "????o", "fr???", "fro???", "pro?"};
    		
    		int[] sol = Solution(words, queries);
    		
    		for(int i=0; i<sol.length; i++) {
    			System.out.print(sol[i]+" ");
    		}
    	}
    
    	static int[] Solution(String[] words, String[] queries) {
    		int[] answer = new int [queries.length];
    		
    		for(int i=0; i<queries.length; i++) {
    			char tmp = queries[i].charAt(0);		//์ฟผ๋ฆฌ์˜ ์ฒซ๋ฒˆ์งธ ๋‹จ์–ด
    			
    			String compareStr = "";
    			boolean location = false;		//์™€์ผ๋“œ์นด๋“œ์˜ ์œ„์น˜ -> true:์ ‘๋‘์‚ฌ์—	false:์ ‘๋ฏธ์‚ฌ์— ์œ„์น˜
    			int qcnt = 0;					//์™€์ผ๋“œ์นด๋“œ COUNT
    			
    			//์™€์ผ๋“œ์นด๋“œ๊ฐ€ ์ ‘๋‘์‚ฌ์— ์œ„์น˜
    			if(tmp == '?') {
    				location = true;
    				qcnt = 1;
    			} else {
    				//์™€์ผ๋“œ์นด๋“œ๊ฐ€ ์ ‘๋ฏธ์‚ฌ์— ์œ„์น˜ํ•˜๋ฉด ์ฒซ๋ฒˆ์งธ ์•ŒํŒŒ๋ฒณ ์—ฐ๊ฒฐ
    				compareStr = Character.toString(tmp);
    			}
    			
    			//๋‘๋ฒˆ์งธ ์•ŒํŒŒ๋ฒณ๋ถ€ํ„ฐ ํƒ์ƒ‰
    			for(int j=1; j<queries[i].length(); j++) {
    				tmp = queries[i].charAt(j);
    				
    				if(tmp == '?') {
    					qcnt++;				//์™€์ผ๋“œ์นด๋“œ๋ฉด ์™€์ผ๋“œ์นด๋“œ CNT++
    				} else {
    					compareStr += Character.toString(tmp);		//์•ŒํŒŒ๋ฒณ์ด๋ผ๋ฉด ๋’ค์— ๋‹จ์–ด๋“ค๊ณผ ๋น„๊ตํ•  compareStr์— ์—ฐ๊ฒฐํ•ด์คŒ
    				}
    			}
    			
    			//๋‹จ์–ด๋“ค๊ณผ ๋น„๊ต ์‹œ์ž‘
    			int ansCnt = 0;
    			for(int j=0; j<words.length; j++) {
    				if(words[j].length() != compareStr.length()+qcnt) continue;				//๋‹จ์–ด์™€ ๊ธธ์ด๊ฐ€ ๋‹ค๋ฅด๋ฉด ๋น„๊ตํ•  ํ•„์š”X
    				
    				if(location) {
    					//์™€์ผ๋“œ์นด๋“œ๊ฐ€ ์ ‘๋‘์‚ฌ์— ์œ„์น˜ํ•˜๋ฉด ์™€์ผ๋“œ์นด๋“œCNT(qcnt) ์ดํ›„๋ถ€ํ„ฐ ์•ŒํŒŒ๋ฒณ๊ณผ ๋น„๊ต
    					if(words[j].substring(qcnt, words[j].length()).equals(compareStr)) ansCnt++;
    				} else {
    					//์™€์ผ๋“œ์นด๋“œ๊ฐ€ ์ ‘๋ฏธ์‚ฌ์— ์œ„์น˜ํ•˜๋ฉด ์ฒซ๋ฒˆ์งธ๋ถ€ํ„ฐ qcnt๊นŒ์ง€์˜ ์•ŒํŒŒ๋ฒณ๊ณผ ๋น„๊ต
    					if(words[j].substring(0, compareStr.length()).equals(compareStr)) ansCnt++;
    				}
    			}
    			answer[i] = ansCnt;
    		}
    		
            return answer;
        }
    }

     

     

    [Solution 2]
    - ์ด์ง„ํƒ์ƒ‰ ์‚ฌ์šฉ
    - Lower Bound, Upper Bound ๊ตฌํ˜„

    package programmers_๊ฐ€์‚ฌ๊ฒ€์ƒ‰;
    
    import java.util.ArrayList;
    import java.util.Collections;
    
    public class Main {
    	public static void main(String[] args) {
    		String[] words = {"frodo", "front", "frost", "frozen", "frame", "kakao"};
    		String[] queries = {"fro??", "????o", "fr???", "fro???", "pro?"};
    		
    		int[] sol = Solution(words, queries);
    		
    		for(int i=0; i<sol.length; i++) {
    			System.out.print(sol[i]+" ");
    		}
    	}
    
    	static int[] Solution(String[] words, String[] queries) {
    		ArrayList<ArrayList<String>> arr = new ArrayList<ArrayList<String>>();
    		ArrayList<ArrayList<String>> revArr = new ArrayList<ArrayList<String>>();
    		
    		int[] answer = new int [queries.length];
    		
    		//๋‹จ์–ด์˜ ๊ธธ์ด๋ณ„๋กœ Array Init
    		for(int i = 0; i < 10001; i++) { 
    			arr.add(new ArrayList<String>()); 
    			revArr.add(new ArrayList<String>());
    		}
    		
    		//๋‹จ์–ด๋“ค ์—ญ๋ฐฉํ–ฅ์œผ๋กœ ์ €์žฅ
    		for(int i=0; i<words.length; i++) {
    			String word = words[i];
    			arr.get(word.length()).add(word);
    			revArr.get(word.length()).add((new StringBuffer(word)).reverse().toString());
    		}
    		
    		//๋‹จ์–ด ์ •๋ ฌ
    		for(int i=0; i<10001; i++) {
    			Collections.sort(arr.get(i));
    			Collections.sort(revArr.get(i));
    		}
    
    		//์ฟผ๋ฆฌ๋ฌธ์˜ ์™€์ผ๋“œ์นด๋“œ ์œ„์น˜ ํ™•์ธ
    		for(int i=0; i<queries.length; i++) {
    			int ansCnt = 0;
    			//์™€์ผ๋“œ์นด๋“œ๊ฐ€ ์ ‘๋‘์— ์œ„์น˜ -> ์ฟผ๋ฆฌ๋„ ๋’ค์ง‘์–ด์„œ revArr์™€ ๋น„๊ต
    			if(queries[i].charAt(0) == '?') {
    				String tmp = (new StringBuffer(queries[i])).reverse().toString();		//์ฟผ๋ฆฌ ๋‹จ์–ด ๋’ค์ง‘
    				
    				//์ฟผ๋ฆฌ์˜ ?๋“ค์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์ž‘์€๊ฐ’๊ณผ ๊ฐ€์žฅ ํฐ๊ฐ’์œผ๋กœ ๋งŒ๋“ค์–ด์„œ(replace) ์ฐพ๊ธฐ
    				int rightIndex = upper_bound(revArr.get(queries[i].length()), tmp.replaceAll("\\?", "z"));	//์ธ์ž๊ฐ’(ex: frozzz)๋ณด๋‹ค ํฐ ์ฒซ๋ฒˆ์งธ idx
    				int leftIndex = lower_bound(revArr.get(queries[i].length()), tmp.replaceAll("\\?", "a"));	//์ธ์ž๊ฐ’(ex: froaaa)๊ณผ ๊ฐ™๊ฑฐ๋‚˜ ํฐ ์ฒซ๋ฒˆ์งธ idx
    				
    				ansCnt = rightIndex - leftIndex;		//์ดˆ๊ณผ ์œ„์น˜ - ์‹œ์ž‘ ์œ„์น˜
    			} else {		//์™€์ผ๋“œ์นด๋“œ๊ฐ€ ์ ‘๋ฏธ์— ์œ„์น˜ -> arr์™€ ๋น„๊ต
    				int rightIndex = upper_bound(arr.get(queries[i].length()), queries[i].replaceAll("\\?", "z"));
    				int leftIndex = lower_bound(arr.get(queries[i].length()), queries[i].replaceAll("\\?", "a"));
    				
    				ansCnt = rightIndex - leftIndex;
    			}
    			answer[i] = ansCnt;
    		}
    		
            return answer;
        }
    	
    	//lower_bound : ์ฃผ์–ด์ง„ ์ธ์ž๊ฐ’(target)๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฐ’์ด ์ฒ˜์Œ ๋‚˜์˜ฌ ๋•Œ์˜ ์œ„์น˜ return
    	static int lower_bound(ArrayList<String> list, String target) {
    		int begin = 0;
    		int end = list.size();
    		
    		while(begin < end) {
    			int mid = (begin+end)/2;
    			//list[mid]๊ฐ€ target๋ณด๋‹ค ์‚ฌ์ „์ˆœ์œผ๋กœ ๊ฐ™๊ฑฐ๋‚˜ ํฌ๋ฉด(๋’ค์— ์žˆ์œผ๋ฉด)
    			if(list.get(mid).compareTo(target) >= 0) end = mid;
    			else begin = mid + 1;
    		}
    		
    		return begin;
    	}
    
    	//upper_bound : ์ธ์ž๊ฐ’(target)๋ณด๋‹ค ํฐ ์ฒซ๋ฒˆ์งธ ์œ„์น˜๋ฅผ ๋ฐ˜ํ™˜
    	static int upper_bound(ArrayList<String> list, String target) {
    		int begin = 0;
    	    int end = list.size();
    	    
    	    while(begin < end) {
    	    	int mid = (begin+end)/2;
    	    	
    	    	//list[mid]๊ฐ€ target๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด
    	    	if(target.compareTo(list.get(mid)) >= 0) begin = mid + 1;
    	    	else end = mid;
    	    }
    	    
    	    return begin;
    	}
    }
    ๋ฐ˜์‘ํ˜•
Designed by Tistory.