-
[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