728x90

 

 

Bean이란?

 

빈(Bean)은 IoC(Inversion of Control) 컨테이너에 의해 관리되는 객체

애플리케이션의 핵심 구성 요소로, 주로 서비스, 데이터 엑세스 객체(DAO), 컨트롤러 등과 같은 객체를 포함한다.

 

Spring 컨테이너는 이러한 빈들을 생성하고, 설정하고, 관리한다.

 


 

Bean의 특징

 

  1. Spring IoC 컨테이너에 의해 관리됨
  2. 구성 메타데이터를 통해 정의됨 : 빈의 정의는 XML 파일, 애노테이션, JAVA 설정 클래스를 통해 제공됨.
  3. 의존성 주입 지원 : 빈은 다른 빈이나 리소스와의 의존성을 주입받을 수 있다.
  4. 생명 주기 관리 : Spring은 빈의 생명 주기(생성, 초기화, 소멸)를 관리함

 


 

Bean의 생성 방법 3가지

 

1. XML 설정 파일

 

<bean id="myBean" class="com.example.MyBean"/>

 

 

2.애노테이션 기반 설정

 

@Component
public class MyBean {
    // ...
}

 

3. Java 설정 클래스

 

@Configuration
public class AppConfig {
    @Bean
    public MyBean myBean() {
        return new MyBean();
    }
}

 

 


 

Bean의 생명 주기

 

  1. 스프링 IoC 컨테이너 생성
  2. 스프링 빈 생성
  3. 의존관계 주입
  4. 초기화 *callback 메서드 호출
  5. 사용
  6. 소멸 전 callback 메서드 호출
  7. 스프링 종료 

 

*callback 메서드 : 특정 이벤트나 조건이 발생했을 때 시스템이나 프레임워크에 의해 자동으로 호출되는 메서드


 

Bean Scope

 

빈 스코프는 빈의 생명 주기와 사용 범위를 정의합니다.

 

Spring에서 제겅하는 주요 Scope

 

  • singleton
  • prototype
  • request
  • session
  • globalSession
728x90

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/12934

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

풀이 - 나의 생각

 

뒤에 소수점이 붙은걸 어떻게 알지?

 

라는 고민만 해결하면 되는 문제입니다.

 

제가 선택한 방법은

 

Double형을 long형으로 변환해서 비교하는 방법이었습니다.

 

우선 주어진 정수 n의 제곱근을 Double형으로 저장한 후

 

이것을 long형으로 변환 후 비교하면 되는 아주 간단한 방식입니다.

 

그런데 이 두가지의 차이가 뭐길래 이런 결과가 날까? 생각할 것입니다.

 

부동 소수점과 정수 변환

  1. double 타입:
    • double은 64비트 IEEE 754 부동 소수점 숫자입니다.
    • 소수 부분을 포함할 수 있으며, 매우 큰 값과 매우 작은 값을 표현할 수 있습니다.
  2. long 타입:
    • long은 64비트 정수입니다.
    • 소수 부분을 포함할 수 없으며, 정수만 표현할 수 있습니다.

 

long 타입은 이미 정수입니다.

 

double 값을 long으로 캐스팅하면 소수 부분이 버려집니다. 즉, double 값에서 정수 부분만 남게 됩니다.

 

public class Main {
    public static void main(String[] args) {
        double value = 4.26;
        long longValue = (long) value;
        
        System.out.println("Original double value: " + value); // 4.26
        System.out.println("Converted long value: " + longValue); // 4
    }
}

 

이렇게 되는 겁니다.

 

그러니까 제곱근이 X.xxxxxxx 이렇게 나왔을때

 

이것을 long 타입으로 변환하면 X.0000000이렇게 되는 겁니다.

 

그러니까

 

X.xxxxxxx == X.0000000 하면 False가 나오겠죠?

 

ps.

 

추가적으로 제가 제곱을 할때

 

Math.pow()를 쓰지 않았는데

 

그 이유는 이런 간단한 계산에서는 오히려 비효율적이기 때문입니다.

 

Math.pow는 더 복잡한 거듭 제곱 계산을 위해 유용합니다.

 

코드

 

class Solution {
    public long solution(long n) {
        long answer = -1;
        double sqrt = Math.sqrt(n);
        if(sqrt == (long)sqrt){
            sqrt++;
            answer = (long)(sqrt * sqrt);
        }
        return answer;
    }
}

 

 

 

 

 

 

 

다음에 또 봐요

 

728x90

 

Integer.valueOf(String)

  • 반환 타입: Integer 객체
  • 설명: Integer.valueOf(String)는 문자열을 Integer 객체로 변환합니다. 이 메서드는 내부적으로 Integer 객체를 생성하거나, 이미 생성된 객체를 캐싱하여 반환할 수 있습니다. 따라서 이 메서드는 Integer 객체를 반환하기 때문에 자동 박싱(autoboxing)이 발생합니다.
  • 캐싱: Integer.valueOf(int)는 -128부터 127까지의 값을 캐싱합니다. 이 범위 내의 값들은 동일한 객체를 재사용합니다.
Integer intValue = Integer.valueOf("123");

 

Integer.parseInt(String)

  • 반환 타입: 기본 타입 int
  • 설명: Integer.parseInt(String)는 문자열을 기본 타입 int로 변환합니다. 이 메서드는 문자열을 숫자로 파싱하여 직접 int 타입으로 반환하기 때문에, 객체 생성이나 캐싱과 관련이 없습니다.
int intValue = Integer.parseInt("123");
 

 

요약

  • Integer.valueOf(String)는 Integer 객체를 반환하고, 캐싱 메커니즘을 사용할 수 있습니다. 반환 타입은 객체(Integer)입니다.
  • Integer.parseInt(String)는 기본 타입 int를 반환하며, 캐싱 메커니즘이 없습니다. 반환 타입은 기본 타입(int)입니다.

 

사용 예시

public class Main {
    public static void main(String[] args) {
        String str = "123";
        
        // Integer.valueOf(String) 사용
        Integer integerValue = Integer.valueOf(str);
        System.out.println("Integer.valueOf: " + integerValue); // Integer 객체 반환

        // Integer.parseInt(String) 사용
        int intValue = Integer.parseInt(str);
        System.out.println("Integer.parseInt: " + intValue); // 기본 타입 int 반환
    }
}

 

결론

  • Integer.valueOf(String)는 Integer 객체를 반환하고, 캐싱 메커니즘을 통해 메모리 효율성을 향상시킬 수 있습니다.
  • Integer.parseInt(String)는 기본 타입 int를 반환하며, 메모리 효율성 측면에서 조금 더 가볍습니다.

두 메서드 모두 문자열을 정수로 변환하는 데 유용하지만, 반환 타입과 내부 동작 방식의 차이로 인해 특정 상황에서 더 적합한 메서드를 선택할 수 있습니다.

728x90

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/72413

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

풀이 - 나의 생각

전형적인 다익스트라 알고리즘에다가

 

비교연산 한 번이 추가 된 문제입니다.

 

무지와 어파치가 각자의 목적지 'A' 와 'B'에

 

최소한의 비용으로 가는 방법을 알기 위해서는

 

결국에 모든 목적지에 최소한의 비용으로 가는 방법을 알아야합니다.

 

그렇기에

 

int[] distFromStart = dijkstra(graph, n, s);
int[] distFromA = dijkstra(graph, n, a);
int[] distFromB = dijkstra(graph, n, b);

 

우선 출발지에서 모든 지점으로의 최소 비용을 구합니다.

A와 B에서 모든 지점의 최소 비용을 구합니다.

 

그 후 세가지 경우의 합을 비교합니다.

 

그 이유는

 

우리가 고려해야하는 경우는

 

1. 일정 지점까지 동행 후, 그 지점부터 각자의 목적지를 가는 경우

 

2. 처음부터 각자 가는 경우

 

두가지 입니다.

 

출발지에서 시작하는 다익스트라는 일정 지점까지 동행하는 경우를,

 

A, B에서 출발하는 다익스타는 일정 지점에서부터 각자가 간 경우를 알 수 있게 합니다.

 

그렇기에 세개의 배열의 합은

 

목적지까지의 비용을 나타내게 되는겁니다.

 

 

코드

 

import java.util.*;

class Node implements Comparable<Node>{
    int index;
    int cost;
    
    public Node(int index, int cost){
        this.index = index;
        this.cost = cost;
    }
    
    @Override
    public int compareTo(Node other){
        return Integer.compare(this.cost, other.cost);
    }
}

class Solution {
    public int solution(int n, int s, int a, int b, int[][] fares) {
        int[][] graph = new int[n+1][n+1];
        //그래프 초기화 및 값 입력
        for(int i = 1; i <= n; i++){
            Arrays.fill(graph[i], Integer.MAX_VALUE);
        }
        for(int[] fare : fares){
            graph[fare[0]][fare[1]] = fare[2];
            graph[fare[1]][fare[0]] = fare[2];
        }
        
        int[] distFromStart = dijkstra(graph, n, s);
        int[] distFromA = dijkstra(graph, n, a);
        int[] distFromB = dijkstra(graph, n, b);
        
        int minCost = Integer.MAX_VALUE;
        for(int i = 1; i <= n; i++){
            if(distFromStart[i] != Integer.MAX_VALUE && distFromA[i] != Integer.MAX_VALUE && distFromB[i] != Integer.MAX_VALUE){
                minCost = Math.min(minCost, distFromStart[i] + distFromA[i] + distFromB[i]);
            }
        }
        
        return minCost;
    }
    
    private int[] dijkstra(int[][] graph, int n, int start){
        int[] dist = new int[n+1];
        Arrays.fill(dist, Integer.MAX_VALUE);
        dist[start] = 0;
        
        PriorityQueue<Node> pq = new PriorityQueue<>();
        pq.add(new Node(start, 0));
        
        while(!pq.isEmpty()){
            Node node = pq.poll();
            int current = node.index;
            int cost = node.cost;
            
            //가야할 곳의 비용이 기존의 비용보다 비싸면 pass
            if(cost > dist[current]) continue;
            
            for(int i = 1; i <= n; i++){
            	//자기 자신의 위치, 연결이 안된 곳은 pass
                if(graph[current][i] == Integer.MAX_VALUE) continue;
                
                int newDist = cost + graph[current][i];
                //새로운 최소 비용일 시 갱신
                if(newDist < dist[i]){
                    dist[i] = newDist;
                    pq.add(new Node(i, newDist));
                }
            }
        }
        
        return dist;
    }
}

 

 

 

 

 

 

 

다음에 또 봐요

 

'프로그래머스 > Lv.3' 카테고리의 다른 글

코딩테스트 연습 > 이중우선순위큐 - JAVA  (0) 2024.01.05
728x90

 

 

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

풀이 - 나의 생각

String 함수 중 replaceAll을 활용하면 아주 쉽게 해결됩니다.

 

저 같은 경우 toLowerCase()를 사용했지만

 

replaceAll("[P,p,Y,y]","") 를 사용하면

 

P, p, Y, y가 모두 삭제되고

 

replaceAll("[^P,p,Y,y]","") 를 사용하면

 

P, p, Y, y를 제외한 문자를 모두 삭제합니다.

 

아무튼 저는 다 소문자로 바꾸고

 

p, y을 제외한 문자를 삭제했습니다.

 

그 후 p를 제외한 문자열 길이와 y를 제외한 문자열 길이가

 

짝수가 아니면 False를 반환하게 하였습니다.

 

하지만 이외에도

 

p를 제외한 문자열과 y를 제외한 문자열의 길이의 차가 0이 아니면

 

False를 반환하게 해도 됩니다.

 

 

 

코드

 

class Solution {
    boolean solution(String s) {
        boolean answer = true;
        
        s = s.toLowerCase();
        s = s.replaceAll("[^p,y]","");
        if(s.length() == 0) return answer;
        else if(s.length()%2!=0) return false;
        
        if(s.replaceAll("[p]","").length() == s.replaceAll("[y]","").length()) return true;
        
        return false;
    }
}

 

 

 

 

 

 

 

다음에 또 봐요

 

728x90

온라인 교육이 아닌 2024 상반기 기본 훈련의 안보교육 답입니다.

시기나 지역마다 답이 다를 수 있으니 확인하시기 바랍니다.

 

A형
OOXOO
전투감각, 훈련, 힘이없는평화, 예비군, 진정한 평화

B형
OOXOO
생존, 1968, 비상근예비군, 예비전력, 4차 산업기술

'잡담 > 일상' 카테고리의 다른 글

최근 근황  (0) 2024.02.24
728x90

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/151139

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

풀이 - 나의 생각

 

먼저 8~10월 총 대여 횟수가 5회 이상인 CAR_ID를 찾아낸 후

 

JOIN한다.

 

그 후에 GROUP BY로 달 별, CAR_ID 별로 묶어서

 

그 숫자를 센다.

 

 

코드

 

SELECT MONTH(START_DATE) MONTH, C.CAR_ID, COUNT(*) RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY C
JOIN (
    SELECT CAR_ID
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
    WHERE MONTH(START_DATE) IN (8, 9, 10)
    GROUP BY CAR_ID
    HAVING COUNT(HISTORY_ID) >= 5) SUB ON C.CAR_ID = SUB.CAR_ID
WHERE MONTH(START_DATE) IN (8, 9, 10)
GROUP BY MONTH, C.CAR_ID
HAVING COUNT(*) >= 1
ORDER BY MONTH, C.CAR_ID DESC;

 

 

 

 

 

 

 

다음에 또 봐요

 

728x90

 

싸피에 주던 용돈 100만원이 끊겼다.

알바를 시작했다.

그 시간에 공부를 조금이라도 더 하는 게 좋은가? 라고 생각도 했지만

앞에서 말한 것처럼 

 

먹고 살긴 해야 하고

하루 종일 집에 있는다고 

 

그 모든 시간을 공부에 투자하지도 못할 거 같아서

좋게 생각하기로 했다.

 

요즘에는 알고리즘 공부에 중점을 두고 공부하고 있다.

코테를 해보면 아직 알고리즘 실력이 모자란다고 스스로 느끼기 때문이다.

그다음은 정처기 준비

다음 주면 필기시험이다.

그게 끝나면 CS, SQLD, JLPT N2, TOPIC을 준비할 예정이다

N2를 저번 시험에 땄으면 좋았겠지만 7점 차이로 미끄러졌다.

사실 프로젝트 준비 때문에 시험 준비를 별로 못했는데도 점수가 생각보다는

잘 나와서 의외였다.

 

 

 

아무튼 싸피 2학기 때부터 자존감이 떨어진다고 느껴진다.

면접도 떨어지고, 서류도 떨어지고 하다 보니 더 그렇다.

하지만 그러면서도 그냥 하자! 라고 생각하고 살고 있다.

'잡담 > 일상' 카테고리의 다른 글

2024 예비군 기초훈련 안보교육 시험문제 정답  (10) 2024.03.18

+ Recent posts