본문 바로가기

내일배움캠프

15일차 TIL

🍎 How's the 14th day going?

오늘도 조 회의와 코드카타에 넘 정신 없어서 많이 못했다. 아 뭔가 실력이 느는 느낌이 드는 날이 좋은데..
오늘은 좀 아쉽네.. 그래도 스트림에 대해선 좀 더 생각할 수 있었던 것 같다. 아 Array와 Arrays 차이가 궁금했는데 해결할수 있었다. 항상 Arrays 쓸 때 Array 나와서 어떤 클래스지 궁금했는데.. 잘 해결했다.

다음번엔 실력이 느는 느낌 받을 수 있도록 화이팅

 

🍊코드카타 목록

  • 이름에 el이 들어가는 동물 찾기
  • 푸드 파이트 대회
  • 콜라 문제
  • 명예의 전당(1)

 

💡오늘 정리 목록

  • Java Stram 실습
  • Optional Class
  • Array vs Arrays

 

🚩오늘의 회고

 

 

1. 코드카타

 

1) 이름에 el이 들어가는 동물 찾기

- sql 문제 / 난이도 하 

- Like 와 % 사용에 대한 문제

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE NAME LIKE '%EL%' AND ANIMAL_TYPE = 'DOG'
ORDER BY NAME

2) 푸드 파이트 대회

- 센스 없이 풀었던 문제, 그래도 스트림 한번 써봐서 좋았다.

- for 문 활용에 대한 문제// TMI : 바보같이 stream map 까지 써서 넘 어렵게 풀었다

- 난이도 하 ,, 체감 중

 

a. 내가 푼 코드 : 갯수를 반으로 나눠서 앞에서 부터 채우고 물 지난 후 뒤에서 채우는 방식.. 

                           그대로 map으로 주어진 푸드 배열 값 바꾸고. 앞에서 채우고 물 채우고 뒤에서 채우고.. 그냥 순차적 해결

                           시간 복잡도 : 2n

import java.util.*;
import java.util.stream.Collectors;

class Solution {
    public String solution(int[] food) {
        String answer = "";
        List<Integer> al = Arrays.stream(food)
                .map(f->f/2)
                .boxed()
                .collect(Collectors.toList());
        for(int i=1;i<al.size();i++){
            for(int j=0;j<al.get(i);j++){
                answer+=Integer.toString(i);
            }
        }
        answer +="0";
        for(int i=al.size()-1;i>0;i--){
            for(int j=0;j<al.get(i);j++){
                answer+=Integer.toString(i);
            }
        }
        return answer;
    }
}

 

b) 베스트 풀이 : 넣을 때 앞 뒤로 하나씩.. 넣는다. 시간 복잡도 : n/2

class Solution {
    public String solution(int[] food) {
        String answer = "0";

        for (int i = food.length - 1; i > 0; i--) {
            for (int j = 0; j < food[i] / 2; j++) {
                answer = i + answer + i; 
            }
        }

        return answer;
    }
}

 

4배나 더 걸리고 길고 복잡하게 코드 작성함.

코드는 쉽고 간결할 수록 좋은 코드이다!

콜라 문제

-난이도 : 하 , 체감 : 하

이것도 그냥 콜라 반 나누고 순서대로 .. 구하는 방식으로 썻다.

너무 순차적 직선적 생각만 하는거 같다. 반성

a) 내가 푼 코드 : 뭐. 나쁘진 않았다.

class Solution {
    public int solution(int a, int b, int n) {
        int answer = 0;
        while(n>=a){
            answer += n/a*b;
            n= n/a*b + n%a;
        }
        return answer;
    }
}

 

b) 베스트 코드 : 수학을 잘해야 한다..ㅠ.ㅠ

class Solution {
    public int solution(int a, int b, int n) {
        return (n > b) / (a - b) * b;
    }
}

 

코드와 수학 실력은 어느정도 상관관계가 있음,, 특히 점화식 쪽으로는 상당히 공부할 필요가 있다고 생각한다.
여기서는 무한 등비급수로 풀어버렸다..

명예의 전당(1)

이 문제는 만들면서 heap 트리 생각했는데,, 길이 제한 때문에 고민했었는데

우선순위 큐를 떠올리지 못했다. 그래서 어렵게 풀어버렸다 아쉽네

난이도 : 하 , 체감 : 중하

import java.util.*;
import java.util.stream.Collectors;

import static java.util.Collections.sort;


class Solution {
    public int[] solution(int k, int[] score) {

        int[] answer = new int[score.length];
        int[] a = new int[k];
        int idx=0;
        for(int i=0;i<score.length;i++){
            insert(score[i],a);//추가하는 메서드
            answer[i]=a[idx];
            if(idx<k-1) idx++;//갯수에 따라서 마지막 값이 달라서 체크
        }
        return answer;
    }

    public static void insert(int value,int [] a){
        for(int i=0;i<a.length;i++){//삽입 정렬 형태로 큰 거 넣고 뒤에로 미는 방식
            if(value>=a[i]){
                int tmp=a[i];
                a[i]=value;
                i++;
                while(i<a.length ){
                    int k=a[i];
                    a[i]=tmp;
                    tmp=k;
                    i++;
                }
                break;
            }
        }
    }
}

 

b) 베스트 코드 : 우선순위큐 활용했음

import java.util.*;

class Solution {
    public int[] solution(int k, int[] score) {
        int[] answer = new int[score.length];

        PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();

        int temp = 0;
        for(int i = 0; i < score.length; i++) {

            priorityQueue.add(score[i]);
            if (priorityQueue.size() > k) {
                priorityQueue.poll();
            }
            answer[i] = priorityQueue.peek();
        }
        return answer;
    }
}

 

2. 오늘의 정리 목록

 

1) Java Stram 실습

- 팁과제 하면서 만들었던 스트림 및 코드 카타 때 사용 스트림 복습

a) food 내 값을 반으로 바꿔서 저장

List<Integer> al = Arrays.stream(food)
                .map(f->f/2)
                .boxed()
                .collect(Collectors.toList());

 

int 배열로 리스트 형태로 바꿀 때 포문 쓰기 싫어서 스트림 형식으로 구현했다.

map > 형태변환 , boxed > 원시타입 배열을 wrapper 타입으로 변환 그래야지만 객체 스트림에 담을 수 있다.

 

b) 과목 번호에 해당하는 점수 배열 가져오기

List<Score> inquiryScores = new ArrayList<>(student.getScoreStore().stream()
                .filter(score -> score.getSubjectId()==(subjectId))
                .toList());

 

여기서 scoreStore 안 건드리려고 List 새로 만들어서 했음

filter > 조건에 맞는 것만 선택

toList() > 리스트화 주의 jdk 14 이후로만 가능
         -14 이전 사용 법 :  .collect(Collectors.toList());

 

Optional Class

Optional 클래스는 자바 8부터 도입된 클래스로, 값이 존재할 수도 있고 존재하지 않을 수도 있는 객체를 나타냅니다. 이 클래스는 주로 메서드가 값을 반환할 때 값이 없을 경우를 처리하기 위해 사용됩니다. 대체로 스트림이랑 연계해서 하나의 객체를 가져올 때 사용하면 편함, 이전에는 메서드가 null을 반환하거나 예외를 던지는 방식으로 이를 처리했지만, Optional은 이러한 방식보다 더 명시적이고 안전한 방법을 제공합니다.

Optional 클래스의 중요한 특징은 다음과 같습니다:

  1. 값의 존재 여부 표현: Optional은 값이 존재하는지 여부를 명시적으로 나타냅니다. 값이 존재하는 경우에는 Optional 객체에 해당 값이 포함되고, 값이 존재하지 않는 경우에는 비어 있는 Optional 객체가 생성됩니다.
  2. Null 참조 회피: Optional을 사용하면 메서드가 null을 반환할 때 발생할 수 있는 NullPointerException을 방지할 수 있습니다. 대신에 메서드는 비어 있는 Optional 객체를 반환하고, 호출자는 이를 통해 값이 존재하지 않는 경우를 처리할 수 있습니다.
  3. 명시적인 값 접근: Optional 객체로부터 값에 접근할 때는 명시적인 방법을 사용해야 합니다. 이는 값이 없는 경우에 대비하여 안전성을 높여줍니다. 예를 들어, get() 메서드를 사용하여 값에 직접 접근할 수 있지만, 값이 없는 경우에는 NoSuchElementException이 발생합니다. 대신에 orElse() 또는 orElseGet() 메서드를 사용하여 기본값을 제공할 수 있습니다.
  4. 함께 사용되는 유틸리티 메서드: Optional 클래스에는 값이 있는지 여부를 확인하거나 값이 없는 경우에 대한 대안을 제공하는 다양한 유틸리티 메서드가 있습니다. 예를 들어, isPresent(), ifPresent(), orElse(), orElseGet(), orElseThrow() 등이 있습니다.

Optional 클래스는 주로 메서드에서 값이 없는 경우를 명시적으로 처리하기 위해 사용됩니다. 이를 통해 코드의 가독성을 높이고 예외 발생 가능성을 줄일 수 있습니다. 그러나 과용되면 코드를 복잡하게 만들 수 있으므로, 적절하게 사용하는 것이 중요

.

Array vs Arrays

간단하게 이야기하면 Array는 배열을 나타내는 클래스, 배열을 생서하고 관리, 하지만 메서드 포함이 안되 있음

Arrays는 배열을 다루기 위한 매서드를 포함하고 있는 클래스, 즉 배열을 다루기 위해서 사용

우선순위큐

  우선순위 큐는 데이터를 저장하고 관리하는 자료구조 중 하나로, 각 요소는 우선순위에 따라 정렬됩니다. 이 구조는 보통 이진 힙(Binary Heap)을 기반으로 구현됩니다. 이진 힙은 완전 이진 트리의 일종으로, 부모 노드가 자식 노드보다 항상 우선순위가 높은 것을 보장합니다.

  우선순위 큐는 주로 작업 스케줄링, 이벤트 처리, 그래프 알고리즘 등의 다양한 응용 분야에서 사용됩니다. 예를 들어, 시스템에서 중요한 작업이나 이벤트를 먼저 처리해야 할 때 우선순위 큐를 활용할 수 있습니다. 또한 네트워크 라우팅에서도 사용되며, 데이터 패킷을 우선순위에 따라 전송하여 효율적으로 네트워크 리소스를 관리할 수 있습니다.

자바에서는 java.util.PriorityQueue 클래스를 사용하여 우선순위 큐를 구현할 수 있습니다. 이 클래스는 힙의 특성을 활용하여 요소를 추가하면 자동으로 우선순위에 따라 정렬됩니다. 이를 통해 가장 높은 우선순위를 가진 요소가 항상 가장 먼저 처리됩니다.

 

우선 순위 큐 생성방법 

 

 1 . 기본 생성자를 사용하여 생성한 후, add() 또는 offer() 메서드를 사용하여 요소를 추가합니다.

PriorityQueue<Integer> pq = new PriorityQueue<>();
pq.add(3);
pq.add(1);
pq.add(2);

 

2 . 요소를 포함하는 컬렉션(Collection)을 전달하여 생성할 수도 있습니다.

List<Integer> list = Arrays.asList(3, 1, 2);
PriorityQueue<Integer> pq = new PriorityQueue<>(list);

 

3 . 초기 용량(capacity)을 지정하여 생성할 수도 있습니다.

PriorityQueue<Integer> pq = new PriorityQueue<>(10); // 초기 용량이 10인 우선순위 큐 생성

 

4 . Comparator를 사용하여 우선순위 큐를 생성할 수도 있습니다. Comparator를 지정하지 않으면 요소의 natural ordering을 기반으로 우선순위가 결정됩니다.

PriorityQueue<Integer> pq = new PriorityQueue<>((a, b) -> b - a); // 내림차순으로 정렬하는 우선순위 큐 생성

 

메소드 정리

  1. add(E e) 또는 offer(E e): 우선순위 큐에 요소를 추가합니다.
  2. remove() 또는 poll(): 우선순위가 가장 높은 요소를 큐에서 제거하고 반환합니다. 큐가 비어있으면 null을 반환합니다.
  3. peek(): 우선순위가 가장 높은 요소를 큐에서 제거하지 않고 반환합니다. 큐가 비어있으면 null을 반환합니다.
  4. clear(): 큐의 모든 요소를 제거합니다.
  5. size(): 큐에 있는 요소의 개수를 반환합니다.
  6. isEmpty(): 큐가 비어있는지 여부를 확인합니다.
  7. toArray(): 큐의 요소를 배열로 반환합니다.
  8.  

※ 오늘의 회고

음 정신없는 하루였다.. 금요일은 진짜 힘드네. 주말에 쉬기 보다는 좀 부족한 부분 복습하고. 

좀 실력이 더 느는 시간을 좀 보내야겠다..

자바는 배우면 배울수록 내가 모르는 부분이 많고 배워야 할 것이 많구나 하고 느끼게 되는 하루였다.

 

'내일배움캠프' 카테고리의 다른 글

TIL 17일차  (0) 2024.05.08
TIL 16일차  (2) 2024.05.07
TIL 14일차  (0) 2024.05.02
TIL 13일  (1) 2024.05.01
TIL 12일차  (1) 2024.04.30