[TIL] Udemy 20일차 프론트엔드/백엔드 - Java 기초 및 SPRING JPA기초

강준호·2024년 1월 10일

Udemy

목록 보기
24/44

스프링 부트와 JPA 활용2 - 도메인 분석 설계

https://velog.io/@mpfo0106/%EC%8B%A4%EC%A0%84-%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B6%80%ED%8A%B8%EC%99%80-JPA-%ED%99%9C%EC%9A%A92-%EB%8F%84%EB%A9%94%EC%9D%B8-%EB%B6%84%EC%84%9D-%EC%84%A4%EA%B3%84

팀스터디

귤 고르기

https://school.programmers.co.kr/learn/courses/30/lessons/138476?language=java

내풀이

import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;

class Solution {
    public int solution(int k, int[] tangerine) {
       int answer = 1;
        HashMap<Integer, Integer> tgr = new HashMap<>();
        for (int i = 0; i < tangerine.length; i++) {
            tgr.put(tangerine[i], tgr.getOrDefault(tangerine[i], 0) + 1);
        }

        List<Integer> keySet = new ArrayList<>(tgr.keySet());
        keySet.sort(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return tgr.get(o2).compareTo(tgr.get(o1)); //내림차순
            }
        });

        for (Integer key : keySet) {
            int n = tgr.get(key);
            if (n >= k) {
                return answer;
            } else {
                k -= n;
                answer += 1;
            }
        }
        return answer;
    }
}

생각한 풀이 1

  • 위 코드 처럼 map 으로 묶고 value 정렬후 비교
  • Stream 을 사용하려 했지만 오랜만에 사용해서 포기하고, Comparator를 사용했다.

생각한 풀이 2

  • 계수정렬
  • 내가 좋아하는 쉬운 풀이지만 이번 문제의 경우 1 ≤ tangerine의 원소 ≤ 10,000,000 이기 떄문에 깔끔하게 포기했다.

다른 사람의 풀이

import java.util.*;

class Solution {
    public int solution(int k, int[] tangerine) {
        int answer = 0;
        HashMap<Integer,Integer> map =new HashMap<>();

        for (int t : tangerine) {
            map.put(t, map.getOrDefault(t, 0) + 1);
        }

        List<Integer> list = new ArrayList<>(map.keySet());
        list.sort((o1, o2) -> map.get(o2)-map.get(o1));

        for(Integer key:list){
            k -=map.get(key);
            answer++;
            if(k<=0){
                break;
            }
        }

        return answer;
    }
}
  • 내풀이와 비슷하지만 Comparator 대신 람다를 사용해 풀었다. (더 좋은거 같다)

짝지어 제거하기

https://school.programmers.co.kr/learn/courses/30/lessons/12973?language=java

내 풀이

import java.util.Stack;

    public int solution(String s) {
        Stack<Character> stack = new Stack<>();
        char ch = s.charAt(0);
        stack.push(ch);
        for (int i = 1; i < s.length(); i++) {
            char cur = s.charAt(i);
            if (cur == ch) {
                stack.pop();
                i+=1;
            } else {
                stack.push(s.charAt(i));
                ch = cur;
            }
        }
        if (stack.isEmpty()) //최종 스택이 비어있다면
            return 1;
        else
            return 0;
    }

테스트 코드는 통과했지만 채점해보니 절반정도가 틀렸다.

틀린 이유

ch 의 잘못된 사용.

  • pop 하면서 ch 위치 업데이트가 안됐다.

i+=1 을 잘못된 사용

  • 예를들면 "abba" 경우 첫 번째 쌍 "bb"를 제거한 후 나머지 "aa"는 처음에는 인접하지 않지만 여전히 제거가능하기 때문에 건너뛰면 안된다.

결론

  • ch 로 마지막 값을 저장하지 않고, peek 로 위치검사를 하자

두번째 코드

    public int solution(String s){
          Stack<Character> stack = new Stack<>();
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            if (!stack.isEmpty() && stack.peek() == ch) {
                stack.pop();
            } else { //비어있으면
                stack.push(ch);
            }
        }
        return stack.isEmpty() ? 1 : 0;
    }

toChar Array 를 쓰는게 더 편하다!!

0개의 댓글