2024_09_05 Kata

SJ.CHO·2024년 9월 5일

알고리즘 Kata

62.

답안 :

public class Solution {

	public int solution(String[] babbling) {
		int answer = 0;
		for (int i = 0; i < babbling.length; i++) {
			// 불가능한 문자열일경우 제외
			if (babbling[i].contains("ayaaya") || babbling[i].contains("yeye") || babbling[i].contains("woowoo")
					|| babbling[i].contains("mama")) {
				continue;
			}
			// 가능한 문자열을 변경
			babbling[i] = babbling[i].replace("aya", " ");
			babbling[i] = babbling[i].replace("ye", " ");
			babbling[i] = babbling[i].replace("woo", " ");
			babbling[i] = babbling[i].replace("ma", " ");
			babbling[i] = babbling[i].replace(" ", "");
			// 해당문자열이 가능한 문자열이었을경우 answer++
			if (babbling[i].length() == 0) {
				answer++;
			}
		}
		return answer;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Solution s = new Solution();
		String[] babbling = {"ayaye", "uuu", "yeye", "yemawoo", "ayaayaa"};
		System.out.println(s.solution(babbling));
	}
}
  • 알고리즘 설명 : 연속적인 동일단어는 반복할수없기에 이를 제외하고 String.replace() 를 통해 가능한 단어를 변경 후 체크함.
  • 문자열 문제는 replace()를 얼마나 잘사용하냐에 따라 난이도가 날뛰는거같다.

    .contains(Stinrg) : 해당 자료구조안에 특정값이 존재하면 true / faulse
    .replace(old,new) : 해당 문자열에 old문자열이 있을시 new 문자열로 변경

다른사람 풀이

import java.util.HashMap;
class Solution {
     public int solution(String[] babbling) {
        HashMap<Character,String> words = new HashMap<>() {{
            put('a',"aya");
            put('y',"ye");
            put('w',"woo");
            put('m',"ma");
        }};
        int answer = 0;

        for(String s: babbling) {
            char prev='\u0000';
            int i=0;
            for(;i<s.length();) {
                if(prev==s.charAt(i)) break;
                String word = words.getOrDefault(s.charAt(i),"");
                if(word.equals("")) break;
                String curStr = s.substring(i,Math.min(s.length(),i+word.length()));

                if(curStr.equals(word)) {
                    prev = s.charAt(i);
                    i+= word.length();
                } else break;
            }
            if(i==s.length()) answer++;
        }
        return answer;
    }
}

  • replace() 기능없이 문제를 map과 idx를 이용해 깔끔하게 푼 코드가 보이길래 참조.

실패한 코드

package answer;

public class Solution {

	public int solution(String[] babbling) {
		int answer = 0;
		String[] Possible = { "aya", "ye", "woo", "ma" };
		char[] temp = new char[3];
		for (int i = 0; i < babbling.length; i++) {
			for (int j = 0; j < Possible.length; j++) {
				if (babbling[i].equals(Possible[j])) {
					answer++;
					break;
				} else {
					for (int z = 0; z < temp.length; z++) {
						temp[z] = babbling[i].charAt(z);
						if (temp[0] == 'a' && temp[0] == 'y' && temp[0] == 'w' && temp[0] == 'm') {
							if(temp.toString().equals(Possible)) {
								
							}
						} else {
							break;
						}
					}
				}
			}
		}
		return answer;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Solution s = new Solution();
		String[] babbling = { "ayaye", "uuu", "yeye", "yemawoo", "ayaayaa" };
		System.out.println(s.solution(babbling));
	}
}
  • 위에 다른사람의 풀이와 알고리즘은 동일하게 생각을 했지만 구현부분에서 코드가 너무 더러워지고 복잡해져서 탈락... 이후 replace() 를활용하는것으로 변경

SQL Kata

64

답안 :

SELECT *
from PLACES
where HOST_ID IN(
select HOST_ID
from PLACES 
group by 1
having count(HOST_ID)>=2)
order by ID
  • 서브쿼리와 group by , having을 이용하여 중복값이있을경우 출력하게끔 풀이

65

답안 :

SELECT distinct c1.CART_ID
from CART_PRODUCTS c1
join CART_PRODUCTS c2
on c1.CART_ID = c2.CART_ID
where c1.Name IN('Milk') AND c2.Name IN('Yogurt')
order by 1
  • cross join 을 이용한 풀이 답안 자체는 나오지만 아마 성능이 매우매우매우매우매우매우 안좋을것이다.(table*table)의 경우의 수 이기때문에 규모가 커질수록 감당이 안됌..
SELECT CART_ID
  FROM CART_PRODUCTS
 WHERE CART_ID in
   (SELECT CART_ID
      FROM CART_PRODUCTS cp1
     WHERE NAME = 'Yogurt')
   AND NAME = 'Milk' 
 ORDER
    BY CART_ID
  • 서브쿼리를 이용하여 푼 답안.
profile
70살까지 개발하고싶은 개발자

0개의 댓글