-
[2020 ์นด์นด์ค ๋ธ๋ผ์ธ๋ ์ฝ๋ฉํ ์คํธ] ๊ฐ์ฌ ๊ฒ์ JAVASTUDY ๐/์๊ณ ๋ฆฌ์ฆ 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.0package 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; } }
๋ฐ์ํ'STUDY ๐ > ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ผ์ฑSWํ ์คํธ] ์๊ธฐ ์์ด JAVA (0) 2021.02.17 [BOJ] 4485 ๋ น์ ์ท ์ ์ ์ ๊ฐ ์ ค๋ค์ง? JAVA (0) 2021.02.15 [BOJ] 15649~15652 N๊ณผ M JAVA (0) 2021.02.15 [BOJ] 2887 ํ์ฑ ํฐ๋ JAVA (0) 2021.02.09 [BOJ] 18352 ํน์ ๊ฑฐ๋ฆฌ์ ๋์ ์ฐพ๊ธฐ_JAVA (0) 2021.02.09