반응형
[BOJ15991] 1,2,3더하기 6(동적 프로그래밍)
알고리즘/동적 프로그래밍2024. 2. 26. 20:56[BOJ15991] 1,2,3더하기 6(동적 프로그래밍)

문제 링크 https://www.acmicpc.net/problem/15991 15991번: 1, 2, 3 더하기 6 각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 1,000,000,009로 나눈 나머지를 출력한다. www.acmicpc.net 풀이 시간 복잡도 : O(N) 문제) 정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 3가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다. 단, 합은 대칭을 이루어야 한다. 1 + 1 + 1 + 1 1 + 2 + 1 2 + 2 대칭을 이루는게 포인트이기 때문에 아래와 같이 구하면 되었다 - DP[N - 2] 양 옆에 1씩 더하는 경우 - DP[N - 4] 양 옆에 2씩 더하는 경우 - DP[N - 6] 양 옆에 3씩 더..

[BOJ2263] 트리의 순회(분할 정복)
알고리즘/트리2024. 2. 24. 10:58[BOJ2263] 트리의 순회(분할 정복)

문제 링크 https://www.acmicpc.net/problem/2263 2263번: 트리의 순회 첫째 줄에 n(1 ≤ n ≤ 100,000)이 주어진다. 다음 줄에는 인오더를 나타내는 n개의 자연수가 주어지고, 그 다음 줄에는 같은 식으로 포스트오더가 주어진다. www.acmicpc.net 풀이 postorder(후위 순회, 왼쪽-오른쪽 -루트) - 항상 root가 마지막에 위치(*특징) - 트리의 특성상 root를 기준으로 왼쪽/오른쪽 서브트리가 나누어지게 때문에 postorder 통해 트리의 root 파악 가능 inodrer(중위 순회, 왼쪽-루트-오른쪽) - root를 기준으로 왼쪽/오른쪽 서브 트리가 나누어진다 - postorder로 구한 root 값으로 inorder의 왼쪽/오른쪽 서브 트..

[Java] PriorityQueue(우선 순위 큐) 분석하고, 따라 구현해보기
알고리즘/자료구조2024. 2. 12. 22:03[Java] PriorityQueue(우선 순위 큐) 분석하고, 따라 구현해보기

우선 순위 큐 (Priority Queue)최소 혹은 최대값을 효율적으로 찾을 수 있는 자료 구조 - 시간 복잡도 :  O( log₂N) - 힙(완전 이진 트리) 자료 구조 기반 구현  - (사전에 정렬할 필요 없이) 데이터 삽입/삭제 시 우선 순위에 따라 빠르게 접근/삭제 가능하다① 최소 힙 : 부모 노드 ≤ 자식 노드 ② 최대 힙 : 부모 노드 ≥ 자식 노드 참고. 부모-자식 인덱스 구하는 공식루트가 0번 인덱스부터인 경우① 부모 노드 = (현재 노드 - 1) / 2② 왼쪽 자식 노드 = (부모 노드 * 2) + 1③ 오른쪽 자식 노드 = 왼쪽 노드 + 1   구현해보기java.util.PriorityQueue 에서 간단하게 필요한 부분만 추출하였다public class MyPriorityQueue ..

[Java] Queue (By ArrayDeque) 따라 구현해보기
알고리즘/자료구조2024. 2. 12. 20:26[Java] Queue (By ArrayDeque) 따라 구현해보기

ArrayDeque 클래스 특징① 자바 1.6 추가② 내부적으로 가변길이 배열(Resizable-array)로 데이터 관리, 용량 제한 없음③ Thread-safe 하지 않음④ Null element 금지⑤ Stack 으로 사용할시 Stack 클래스 빠르고, Queue로 사용할 시 LinkedList 클래스보다 빠르다This class is likely to be faster than Stack when used as a stack, and faster than LinkedList when used as a queue.  ArrayDeque를 Queue로 활용하는 경우 아래의 네가지 장점을 생각해 볼 수 있다① 더 높은 성능 지원 - 내부적으로 배열을 사용하여 큐를 구현하기 때문에 빠른 접근 시간을 제공..

[Java] Stack (By ArrayDeque) 따라 구현해보기
알고리즘/자료구조2024. 2. 12. 19:40[Java] Stack (By ArrayDeque) 따라 구현해보기

ArrayDeque 클래스 특징① 자바 1.6 추가② 내부적으로 가변길이 배열(Resizable-array)로 데이터 관리, 용량 제한 없음③ Thread-safe 하지 않음④ Null element 금지⑤ Stack 으로 사용할시 Stack 클래스보다 빠르고, Queue로 사용할 시 LinkedList 클래스보다 빠르다This class is likely to be faster than Stack when used as a stack, and faster than LinkedList when used as a queue. - 공식 doc  참고. Stack 클래스 단점자바 1.0에 추가되었고, Vector 클래스를 상속받고 있다 -- LIFO (Last In First Out) - 멀티 스레드 환경에서..

[Next Step] 12장 확장성 있는 DI 프레임워크로 개선
독서/📚2023. 11. 23. 13:50[Next Step] 12장 확장성 있는 DI 프레임워크로 개선

12.1 필드와 setter 메소드에 @Inject 기능 추가현재 생성자 주입만 가능한데, @Inject를 활용해서 필드(field), setter 메소드를 통해서도 DI를 할 수 있도록 기능을 추가한다 필드와 생성자 주입@Service public class MyQnaService { private UserRepository userRepository @Inject private QuestionRepository questionRepository; @Inject public MyQnaService(UserRepository userRepository) { this.userRepository = userRepository }} setter 주입@Controllerpublic cla..

[Next Step] 11장 의존관계 주입(DI)을 통합 테스트 하기 쉬운 코드 만들기
독서/📚2023. 11. 21. 14:03[Next Step] 11장 의존관계 주입(DI)을 통합 테스트 하기 쉬운 코드 만들기

11.1 왜 DI가 필요한가?의존관계란 객체 혼자 모든 일을 처리하기 힘들기 때문에 내가 해야 할 작업을 다른 객체에게 위임하면서 발생한다.즉, 내가 가지고 있는 책임과 역할을 다른 객체에 위임하는 순간 발생하는 것이다. (중략..)DI는 객체 간의 의존관계를 어떻게 해결하느냐에 따른 새로운 접근 방식이다.지금까지 우리는 의존관계에 있는 객체를 사용하기 위해 객체를 직접 생성하고, 사용하는 방식으로 구현했다. (중략..)이 같은 방식으로 구현할 경우 유연한 개발을 하는데 한계가 있기 때문에 인스턴스를 생성하는 책임과 사용하는 책임을 분리하자는 것이다.(중략..)이처럼 객체 간의 의존관계에 대한 결정권을, 의존관계를 가지는 객체가 가지는 것이 아니라 외부의 누군가가 담당하도록 맡겨 버림으로써 좀 더 유연한..

[Next Step] 10장 새로운 MVC 프레임워크 구현을 통한 점진적 개선
독서/📚2023. 11. 20. 21:44[Next Step] 10장 새로운 MVC 프레임워크 구현을 통한 점진적 개선

목표✨ (p338)① 레거시 MVC프레임워크와 애노테이션 기반의 새로운 MVC 프레임워크가 동시에 서비스 가능하도록 구현② 인터페이스로 추상화 가능한 부분을 찾아 2개의 프레임워크가 공존 가능하도록 리팩토링 수행  10.1 MVC 프레임워크 요구사항 3단계10.1.1 요구사항 (p335) 아래 RequestMapping 코드를 보면 직접 요청 URL과 컨트롤러를 추가 해야 하는 불편함이 있다. 서블릿과 같이 애노테이션을 활용해 설정을 추가하고 서버가 시작할때 자동으로 매칭되도록 개선해 본다. (힌트: @Controller 애노테이션을 추가하고, 자바 리플렉션을 활용) 10.1.2 자바 리플렉션(p340)Hint① java.lang.Class API의 getConstructors(), getMethods(..

[Next Step] 8장 Ajax를 활용해 새로고침 없이 데이터 갱신하기
독서/📚2023. 11. 17. 18:31[Next Step] 8장 Ajax를 활용해 새로고침 없이 데이터 갱신하기

실습 프로젝트 저장소실습의 경우 처음에 fork 받았는데, 깃 허브 잔디가 심어지지 않아 기술 블로그 참고(링크)하여 저장소 설정을 변경하도록 함 jwp-basic https://github.com/slipp/jwp-basic/tree/step4-qna-getting-started GitHub - slipp/jwp-basic: 자바 웹 프로그래밍 기본 실습자바 웹 프로그래밍 기본 실습. Contribute to slipp/jwp-basic development by creating an account on GitHub.github.com 8장 AJAX를 활용해 새로고침 없이 데이터 갱신하기- 이번 장에서는 질문 목록/상세, 답변 목록/생성/삭제 화면 및 기능 구현 후 리팩토링을 수행한다- 책에는 없는 내..

[Next Step] 7장 DB를 활용해 데이터를 영구적으로 저장하기
독서/📚2023. 11. 17. 11:24[Next Step] 7장 DB를 활용해 데이터를 영구적으로 저장하기

실습 프로젝트 저장소실습의 경우 처음에 fork 받았는데, 깃 허브 잔디가 심어지지 않아 기술 블로그 참고(링크)하여 저장소 설정을 변경하도록 함 jwp-basic https://github.com/slipp/jwp-basic/tree/step2-user-with-mvc-framework GitHub - slipp/jwp-basic: 자바 웹 프로그래밍 기본 실습자바 웹 프로그래밍 기본 실습. Contribute to slipp/jwp-basic development by creating an account on GitHub.github.com  자바 진영은 데이터베이스에 대한 접근 로직 처리를 담당하는 객체를 별도로 분리해 구현하는 것을 추천한다. 이 객체를 DAO(Data Access Object)라..

[Next Step] 6장 서블릿/JSP를 활용해 동적인 웹 애플리케이션 개발하기
독서/📚2023. 11. 16. 21:01[Next Step] 6장 서블릿/JSP를 활용해 동적인 웹 애플리케이션 개발하기

실습 프로젝트 저장소실습의 경우 처음에 fork 받았는데, 깃 허브 잔디가 심어지지 않아 기술 블로그 참고(링크)하여 저장소 설정을 변경하도록 함 jwp-basic (6.1)https://github.com/slipp/jwp-basic/tree/step0-getting-started GitHub - slipp/jwp-basic: 자바 웹 프로그래밍 기본 실습자바 웹 프로그래밍 기본 실습. Contribute to slipp/jwp-basic development by creating an account on GitHub.github.com  web-application-server https://github.com/slipp/web-application-server GitHub - slipp/web-ap..

[Next Step] 5장 웹 서버 리팩토링, 서블릿 컨테이너와 서블릿의 관계
독서/📚2023. 11. 16. 11:07[Next Step] 5장 웹 서버 리팩토링, 서블릿 컨테이너와 서블릿의 관계

실습 프로젝트 저장소실습의 경우 처음에 fork 받았는데, 깃 허브 잔디가 심어지지 않아 기술 블로그 참고(링크)하여 저장소 설정을 변경하도록 함 web-application-server (3 ~ 6장)https://github.com/slipp/web-application-server GitHub - slipp/web-application-server: 웹 애플리케이션 서버 실습을 위한 뼈대웹 애플리케이션 서버 실습을 위한 뼈대. Contribute to slipp/web-application-server development by creating an account on GitHub.github.com  4장에서 구현한 HTTP 웹 서버를 리팩토링하면서 설계를 개선하는 경험을 해보자  https://..

[Next Step] 3~4장 HTTP 웹서버 구현을 통해 HTTP 이해하기(No Framework)
독서/📚2023. 11. 15. 11:21[Next Step] 3~4장 HTTP 웹서버 구현을 통해 HTTP 이해하기(No Framework)

로컬 개발 환경 구축 https://dev-ljw1126.tistory.com/294 [Next Step] 3.3 원격 서버에 배포 (p84) 정리목차 요구사항 로컬 개발 환경에 설치한 HTTP 웹 서버를 물리적으로 떨어져 있는 원격 서버에 배포해 정상적으로 동작하는지 테스트한다. 이때 HTTP 웹 서버 배포 작업은 root 계정이 아닌 배포를dev-ljw1126.tistory.com 실습 프로젝트 저장소실습의 경우 처음에 fork 받았는데, 깃 허브 잔디가 심어지지 않아 기술 블로그 참고(링크)하여 저장소 설정을 변경하도록 함 web-application-server (3 ~ 6장)https://github.com/slipp/web-application-server GitHub - slipp/web-a..

[Next Step] 10.4 배포 자동화를 위한 쉘 스크립트 개선 (p362) 정리
독서/📚2023. 11. 10. 17:17[Next Step] 10.4 배포 자동화를 위한 쉘 스크립트 개선 (p362) 정리

요구사항소스 코드를 배포한 후 문제가 발생할 경우 빠르게 원복(롤백, rollback)할 수 있는 환경을 구축한다  ① 배포 스크립트( deploy.sh ) 개선② 원복(롤백) 스크립트( rollback.sh) 구현 참고. 영상 자료https://www.youtube.com/watch?v=UqocnEIX-mAhttps://www.youtube.com/watch?v=7OSzN16FqCw1. 배포 스크립트( deploy.sh ) 개선개선할 부분① /home/releases/프로젝트 디렉토리 생성하여 빌드 디렉토리를 rename 하여 이동시킨다② 배포할 디렉토리를 TOMCAT_HOME/webapps의 ROOT로 심볼릭 링크 생성 후 톰캣 재시작한다 deploy.sh 수정#!/bin/bashREPOSITORY_..

[Next Step] 6.6 쉘 스크립트를 활용한 배포 자동화(p218) 정리
독서/📚2023. 11. 3. 22:22[Next Step] 6.6 쉘 스크립트를 활용한 배포 자동화(p218) 정리

요구사항-지금까지 구현한 기능을 개발 서버에 톰캣 서버를 설치한 후 배포한다-서버가 정상적으로 실행되고 있는지 톰캣 로그 파일( catalina.out )을 통해 모니터링 한다-쉘 스크립트를 만들어 배포 과정을 자동화 한다 ① 톰캣 서버 설치② 실습 코드 배포③ 톰캣 서버 로그 모니터링④ 쉘 스크립트 통해 배포 자동화  참고. 영상 자료https://www.youtube.com/watch?v=ZsiO27LeW34https://www.youtube.com/watch?v=9Rr4gMRyUtQhttps://www.youtube.com/watch?v=bzM1WL4qdoA1. 톰캣 서버 설치톰캣 디렉토리 구조 - bin : 톰캣 서버 시작/종료,  catalina.sh 옵션 설정도 가능 - logs : 톰캣 실행..

[BOJ21923] 곡예 비행 (동적 프로그래밍)
알고리즘/동적 프로그래밍2023. 10. 6. 22:25[BOJ21923] 곡예 비행 (동적 프로그래밍)

문제링크 https://www.acmicpc.net/problem/21923 21923번: 곡예 비행 동헌이는 모형 비행기 조종 대회에 참가하였다. 이 대회에서는 격자 모양의 공간에서 모형 비행기를 조종하여 얻는 비행 점수로 순위를 매긴다. 격자의 각 칸에는 점수가 부여되어 있고, 비행 www.acmicpc.net 문제풀이 처음 격자형 그래프에 대해 BFS로 풀이하려 함 그런데 상승에서 하강으로 바뀌는 시점에 처리가 모호했고, 제한된 시간 40분을 초과하여 풀이 방법을 확인함 - 동적 프로그래밍 풀이 - 상승과 하강일때 dp 테이블을 각각 구한 후 반복문 돌며 합했을 때 최대치를 구하면 됨 - 시간 복잡도 : N, M이 각 1000이라 해도 대략 O( 3 * 10^6 ) 보다 적게 연산 된다. 예시 예제..

[BOJ21925] 짝수 팰린드롬(그리디, 탐욕 알고리즘)
알고리즘/탐욕(그리디)2023. 10. 6. 21:27[BOJ21925] 짝수 팰린드롬(그리디, 탐욕 알고리즘)

문제링크 https://www.acmicpc.net/problem/21925 21925번: 짝수 팰린드롬 (1, 1), (5, 6, 7, 7, 6, 5), (5, 5) www.acmicpc.net 문제풀이 그리디 알고리즘 풀이 방법을 알게 되어 풀이시 메모리와 시간적 측면에서 앞서 직접 DP 풀이한 방식보다 나은 것을 확인가능했다. - 그리디 알고리즘 풀이 - 핵심 아이디어 : 큰 짝수 팰린드롬은 작은 짝수 팰린드롬으로 구성이 된다. 그러므로 1) i와 j 포인터를 사용해서 최소가 되는 짝수 팰린드롬 구하면 결과값 증가시키고 포인터 이동 (i < N까지) 2) i 시작점에서 팰린드롬을 찾지 못하는 경우 종료 후 -1 출력 (투 포인터 방식) 제출코드 import java.util.*; import jav..

[BOJ21925] 짝수 팰린드롬 (동적 프로그래밍, DP)
알고리즘/동적 프로그래밍2023. 10. 6. 21:17[BOJ21925] 짝수 팰린드롬 (동적 프로그래밍, DP)

문제링크 https://www.acmicpc.net/problem/21925 21925번: 짝수 팰린드롬 (1, 1), (5, 6, 7, 7, 6, 5), (5, 5) www.acmicpc.net 문제풀이 직접 풀이하여 통과는 하였지만, 방문 배열로 사용여부를 체크한다거나 맨앞에 펠린드롬이 아닌 경우 처리를 찾지 못해 아쉬움이 남는다. - 동적 프로그래밍 풀이 - palindrome 2차원 배열 전처리하여 구함 팰린드롬인 경우 1) 자기 자신이거나 (길이1) 2) 바로 옆에 수와 같거나 (길이2) 3) 양 끝이 같고, (시작점 + 1) ~ (끝점 - 1) 범위의 수도 팰린드롬인 경우 - 최대 수열의 길이 N = 5,000이기 때문에 int[][] palindrome 선언시 4byte * 5,000 * 5..

반응형
image