전체 글333 [Java] 다익스트라 알고리즘(Dijkstra Algorithm) + 예제 다익스트라 알고리즘 V = vertext(정점) , E = edge(간선) , adjNode = adjacentNode(인접노드) - 최단경로를 구하는 알고리즘 - 하나의 정점을 기준으로 다른 정점까지 가는 최단거리를 구한다. (출발지에서 다른 정점까지의 최단거리들을 구한다) - 음수 가중치가 없어야한다 - 인접 행렬로 표현된 그래프로 다익스트라 알고리즘을 구현시 시간 복잡도 O(V^2) - 우선순위 큐+리스트를 사용해서 다익스트라 알고리즘 구현시 시간복잡도 ( ElogV) 까지 낮출수 있다고 한다. - 탐욕법(그리디 알고리즘) 과 동적 계획법(다이나믹 프로그래밍)을 사용한다. -> 방문하지 않은 노드 중에서 가장 비용이 적은 노드를 선택한다 (그리디 알고리즘) -> 해당 노드로부터 갈 수 있는 노드들의.. 자바/알고리즘 2023. 1. 3. 16 ★★★ (의존관계주입시)조회한 빈이 모두 필요할때, (의존관계주입)자동, 수동의 올바른 실무 운영 기준 , 빈 생명주기 콜백 조회한 빈이 모두 필요할때 List , Map 실무적 예를 들면) 할인 서비스를 제공하는데 클라이언트가 할인의 종류를 선택할 수 있을때를 가정해보자. 스프링을 사용하면 소위 말하는 전략패턴을 매우 간단하게 구현할 수 있다. 빈들 Map,List로 가져오기 테스트 public class AllBeanTest { @Test void findAllBean() { ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class); //전달인자로 넣은것은 빈으로 등록된다.(DiscountService는 스프링컨테이너 생성할때 전달인자로 넣어서 직접 빈 등록해준거다.) // 전달인자 클래스중.. 인프런/스프링핵심원리(기본) 2022. 12. 30. 15) ★★★ 다양한 의존관계 주입방법,옵션처리,생성자 주입 선택,final 키워드,롬복과 최신 키워드, 조회할 빈이 2개이상(문제발생)(@Autowired,@Qualfier,@Primary), 어노테이션 직접 만들기 의존관계 주입은 크게 4가지 방법이 있다. 1. 생성자 주입 2. 수정자 주입(== setter 주입) 3. 필드 주입 4. 일반 메서드 주입 생성자 주입 @Component public class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) { this.memberRepository = memberRepository; this... 인프런/스프링핵심원리(기본) 2022. 12. 28. 14)★★★컴포넌트 스캔과 의존관계 자동주입(@ComponentScan,@Autowired), 탐색위치와 기본 스캔 대상(@Service~) , 스캔필터링 , 중복 등록과 충돌 AppConfig라는 구성설정 파일을 만들어서 스프링빈을 등록했고 등록하는 과정에서 자동으로 의존관계도 주입되었다. 하지만 등록해야하는 스프링빈이 많아지면 설정 정보도 커지고 누락하는 문제가 발생한다. ( + 귀찮음) 그래서 스프링에서는 설정정보 없이 자동으로 스프링 빈을 등록하는 컴포넌트 스캔을 제공한다. 의존관계도 자동으로 주입하는 @Autowired라는 기능도 제공한다. 공부를 위해 원래있던 AppConfig는 냅두고 새로 AutoAppConfig를 생성한다. @ComponentScan을 사용하면 @Component 어노테이션이 붙은 모든 클래스를 찾아서 자동으로 스프링빈으로 등록해준다. AutoAppConfig.java @Configuration // 설정정보 파일이니까 @Configuration.. 인프런/스프링핵심원리(기본) 2022. 12. 28. 13)★★싱글톤이 필요한 이유,싱글톤 패턴, 싱글톤 컨테이너,싱글톤 방식의 주의점 ,@Configuration과 싱글톤,@Configuration과 바이트코드 조작의 마법,@Configuration의 역할 웹 어플리케이션과 싱글톤이 필요한 이유 보통 여러 클라이언트가 동시에 요청을 하게된다. DI 컨테이너 (의존성 주입 컨테이너) ==> 우리가 만든 AppConfig 만약에 스프링이 없다면 위의 그림과 같이 3명이 동시에 memberService를 요청했을때 멤버서비스가 3개가 생성될것이다. public class SingletonTest { @Test @DisplayName("스프링 없는 순수한 DI 컨테이너") void pureContainer() { AppConfig appConfig = new AppConfig(); //1. 조회: 호출할 때 마다 객체를 생성 MemberService memberService1 = appConfig.memberService(); //2. 조회: 호출할 때 마다 객체.. 인프런/스프링핵심원리(기본) 2022. 12. 27. 12)BeanFactory, ApplicationContext ,다양한 설정 형식 지원(자바코드, XML) , 스프링 빈 설정 메타정보(BeanDefinition) 상속받은 인터페이스를 구현하는 AnnotationConfigApplicationContext(구현 클래스,구현체) BeanFactory (빈 팩토리) - 스프링 컨테이너 최상위 인터페이스 - 스프링빈을 관리하고 조회하는 역할 담당 - 이전 시간에 썼던 getBean()과 같이 사용했던 대부분의 기능은 빈팩토리에서 제공하는 기능이였다. ApplicationContext - 빈팩토리를 상속하는 인터페이스이므로 빈팩토리의 기능을 모두 상속받아서 제공한다. - 빈팩토리와 차이는 뭘까? -> 빈을 관리하고 조회하는 기능(빈팩토리)은 물론이고 수많은 부가기능이 필요하기 때문에 다른 인터페이스도 상속하고있다. 다양한 설정 형식 지원 (자바코드 , XML) 이전에 AppConfig.class로 설정정보를 줘서 스프링컨.. 인프런/스프링핵심원리(기본) 2022. 12. 27. 11)컨테이너에 등록된 모든 빈 조회,내가 등록한 빈 조회, 스프링 빈 조회(기본), 스프링 빈 조회(동일한 타입이 둘 이상), 스프링 빈 조회(상속 관계) 테스트 코드를 생성해서 등록된 빈 조회해보기 ApplicationContextInfoTest.java class ApplicationContextInfoTest { // junit5부터는 public이 없어도 된다. AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); @Test @DisplayName("모든 빈 출력하기") void findAllBean() { String[] beanDefinitionNames = ac.getBeanDefinitionNames(); //컨테이너에 등록된 빈 이름들 배열을 가져온다. for (String beanDefinitionName : beanDe.. 인프런/스프링핵심원리(기본) 2022. 12. 27. ★백준/7562 나이트의 이동 /bfs 나이트의 이동 성공다국어 한국어 시간 제한메모리 제한제출정답맞힌 사람정답 비율 1 초 256 MB 44259 22440 16709 49.655% 문제 체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수 있을까? 입력 입력의 첫째 줄에는 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 세 줄로 이루어져 있다. 첫째 줄에는 체스판의 한 변의 길이 l(4 ≤ l ≤ 300)이 주어진다. 체스판의 크기는 l × l이다. 체스판의 각 칸은 두 수의 쌍 {0, ..., l-1} × {0, ..., l-1}로 나타낼 수 있다. 둘째 줄과 셋째 줄에는 나이트가 현재 있는 칸, .. 자바/알고리즘 문제 풀이 2022. 12. 27. [Java] 두 배열 비교하기 배열을 비교할때는 Arrays.equals() 메소드를 사용한다. static void solve() throws IOException { int[] a = {1, 2, 3,}; int[] b = {1, 2, 3,}; if (a == b) { bw.write("동일한 배열입니다."); } else { bw.write("동일하지않습니다."); } } ==로 비교하게되면 원하는 결과가 나오지않는다. ==연산자는 각 배열의 주소값을 비교하기 때문이다. Arrays.equals()를 사용하면 원하는 결과가 나온다. static void solve() throws IOException { int[] a = {1, 2, 3,}; int[] b = {1, 2, 3,}; if (Arrays.equals(a,b)) { .. 자바/++ 2022. 12. 27. ★백준/1697 숨바꼭질 / bfs 숨바꼭질 성공다국어 한국어 시간 제한메모리 제한제출정답맞힌 사람정답 비율 2 초 128 MB 178291 51168 32156 25.208% 문제 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다. 수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오. 입력 첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과.. 자바/알고리즘 문제 풀이 2022. 12. 27. ★백준/2178 미로탐색 /bfs 미로 탐색 성공 시간 제한메모리 제한제출정답맞힌 사람정답 비율 1 초 192 MB 143947 62393 40055 42.067% 문제 N×M크기의 배열로 표현되는 미로가 있다. 1 0 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 0 1 1 미로에서 1은 이동할 수 있는 칸을 나타내고, 0은 이동할 수 없는 칸을 나타낸다. 이러한 미로가 주어졌을 때, (1, 1)에서 출발하여 (N, M)의 위치로 이동할 때 지나야 하는 최소의 칸 수를 구하는 프로그램을 작성하시오. 한 칸에서 다른 칸으로 이동할 때, 서로 인접한 칸으로만 이동할 수 있다. 위의 예에서는 15칸을 지나야 (N, M)의 위치로 이동할 수 있다. 칸을 셀 때에는 시작 위치와 도착 위치도 포함한다. 입력 첫째 줄에 두 정.. 자바/알고리즘 문제 풀이 2022. 12. 27. 백준/1012 유기농배추 / dfs, bfs 유기농 배추 시간 제한메모리 제한제출정답맞힌 사람정답 비율 1 초 512 MB 129612 50993 34412 37.258% 문제 차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에 효과적인 배추흰지렁이를 구입하기로 결심한다. 이 지렁이는 배추근처에 서식하며 해충을 잡아 먹음으로써 배추를 보호한다. 특히, 어떤 배추에 배추흰지렁이가 한 마리라도 살고 있으면 이 지렁이는 인접한 다른 배추로 이동할 수 있어, 그 배추들 역시 해충으로부터 보호받을 수 있다. 한 배추의 상하좌우 네 방향에 다른 배추가 위치한 경우에 서로 인접해있는 것이다. 한나가 배추를 재배하는 땅은 고르지 못해서.. 자바/알고리즘 문제 풀이 2022. 12. 27. 이전 1 ··· 14 15 16 17 18 19 20 ··· 28 다음