전체 글 18

[JAVA] 깊은복사 & 얕은복사(clone(), Cloneable)

다음의 코드 내용에서 출력을 예상해 보세요. class Point{ public int x, y; public Point(int x, int y) { this.x = x; this.y = y; } public void changePoint(int x, int y) { this.x = y; this.y = x; } } class Rectangle implements Cloneable{ private Point upperLeft, lowerRight; public Rectangle(int x1, int y1, int x2, int y2) { upperLeft = new Point(x1, y1); lowerRight = new Point(x2, y2); } public void showRectangle() {..

[백준/boj.kr] 21939번 문제 추천 시스템 Version1(JAVA)

문제 추천 시스템 Version1 문제 보기 1. 문제 정의 "문제번호, 난이도"로 정의된 아이템들을 가지고 아래의 3가지 명령어에 대해 처리해 주는 문제 입니다. 명령어 상세 내용 비고 recommend x(x = ±1) x = 1: 가장 어려운 문제의 번호를 출력 가장 어려운 문제가 여러개면, 가장 큰 문제 번호 출력 x = -1: 가장 쉬운 문제의 번호를 출력 가장 쉬운 문제가 여러개면, 가장 작은 문제 번호 출력 add P L 난이도 L인 문제 번호 P를 추가 1. 리스트에 없는 문제번호 P만 add 2. 이전에 있던 문제번호 P가 다른 난이도로 add 가능 solved P 문제 번호 P를 제거 리스트에 있는 문제 번호 P만 delete 2. 풀이 방법 탐색 "문제번호, 난이도" 쌍(Pair)을 ..

[백준/boj.kr] 6198번 옥상 정원 꾸미기(JAVA)

옥상 정원 꾸미기 문제 보기 1. 문제 정의 높이가 h(1), h(2), h(3) ... h(N)인 빌딩 N개가 있을 때, 각 빌딩에서 다른 빌딩의 옥상을 관찰 가능한 갯수를 구해야 하는 문제입니다. 문제에서의 빌딩들을 예시로 들자면, 위와 같이 6개의 빌딩이 있고 각각 높이가 주어져 있습니다. 각 빌딩에서 오른쪽을 바라 볼 때 옥상이 관찰 가능한 빌딩을 카운팅 해보면 됩니다. 1번째 빌딩에서는 2, 3, 4 빌딩을 볼 수 있고, 2번 빌딩에서는 볼 수 있는 빌딩이 없으며, 3번 빌딩에서는 4번 빌딩을 볼 수 있습니다. 2. 풀이 방법 탐색 이 문제의 핵심은 i번째 빌딩의 높이 h(i)를 기준으로 이전 빌딩들 중, i번째 빌딩의 높이 h(i)보다 낮은 빌딩은 체크할 필요가 없다는 점 입니다. 위의 예시에..

[Spring] MyBatis를 이용해 DB 조작하기(SQL Mapper)

JAVA ORM의 대표인 JAP를 활용해서도 DB를 조작할 수 있지만, SQL Mapper를 활용해 DB를 조작하는 MyBatis도 있습니다. 1. MyBatis란? 객체지향 언어인 자바의 관계형 데이터베이스 프로그래밍을 좀 더 쉽게 할 수 있게 도와주는 개발 프레임워크 복잡한 JDBC 코드를 걷어내며 깔끔한 소스코드를 유지 자바의 객체(Object)와 SQL 사이에서 자동 맵핑을 도와주는 프레임워크 XML 형태로 쓰인 JDBC 코드라고 생각해도 될 만큼 JDBC의 모든 기능을 제공 2. MyBatis 적용하기 1) Dependency 추가 pom.xml에 mybatis 관련 dependency를 추가해 줍니다. (상세 워딩은 직접 쳐도 되지만, 새 프로젝트를 추가하면서 mybatis를 설정해 나온 po..

Spring 2022.03.31

[프로그래머스] 합승택시요금(C/C++)

합승택시요금 문제보기 다익스트라, 플로이드 와샬 알고리즘 보기 1. 문제 정의 노드와 무향 간선이 포함된 그래프가 주어졌을 때, 동일한 출발점에서 시작하여 서로 다른 도착점으로 이동하는데 소비하는 최소 비용을 구하는 문제 입니다. 문제에서 주어지는 포인트는 "출발점 s / 도착점 a / 도착점 b" 총 3가지 입니다. 2명이 동일한 출발점 s에서 시작해 임의의 i 지점까지 같이 이동하고, 이후 쪼개져서 각자 도착점 a와 도착점 b로 도착하는 모든 경로 합의 최소 값을 구해야 합니다. 2. 풀이 방법 탐색 s: 출발점 i: 임의의 지점(같이 택시를 탑승하는 종점) a: a가 도착점 b: b의 도착점 s, i, a, b가 위와 같다고 했을 때, 이 문제에서 구해야하는 경로는 3가지 입니다. 1) s -> i..

[알고리즘] 플로이드 와샬 - 최단경로 구하기(Floyd-Warshall), C/C++

그래프 자료구조에서 최단 경로, 최소 비용를 구해야 하는 알고리즘은 너비 우선 탐색(BFS), 다익스트라, 벨만-포드, 플로이드 워샬 이 있습니다. 1. 플로이드 와샬(Floyd-Warshall) 알고리즘이란? 플로이드 와샬은 그래프 자료구조에서 노드와 가중치가 있는 간선이 존재할 때 모든 정점간의 최소 비용을 구할 수 있는 그래프 탐색 알고리즘 입니다. 5개의 노드와 6개의 간선이 존재하는 그래프 예시를 들겠습니다. 여기서 간선의 방향은 단지 갈수 있냐, 없냐를 결정지을 뿐 중요하지 않습니다. BFS나 다익스트라 같은 탐색 기법은 특정 노드끼리의 최소 비용만 구하면 됩니다. 즉 탐색을 시작하는 시작 노드가 정해져 있는 경우에 해당됩니다. 하지만 플로이드 와샬은 모든 노드간의 최소 비용을 구할 수 있습니..

[알고리즘] 다익스트라 - 최단 경로 구하기(Dijkstra), C/C++

그래프 자료구조에서 최단 경로, 최소 비용를 구해야 하는 알고리즘은 너비 우선 탐색(BFS), 다익스트라, 벨만-포드, 플로이드 워샬 이 있습니다. 1. 다익스트라(Dijkstra) 알고리즘 이란? 그래프 자료구조에서 노드와 가중치가 있는 간선이 존재하고, 시작 노드에서 모든 노드까지의 최단 경로(최소 비용)를 구하는 알고리즘 입니다. 위 그래프를 예시로 보자면, 1번 노드를 시작해서 다른 모든 노드(2, 3, 4, 5)까지의 최단 경로를 구해야 합니다. 그리고 각 노드를 잇는 간선(방향 존재 유무는 중요하지 않습니다. 갈 수 있냐, 없냐 차이 이므로!)에는 가중치가 있습니다. 이 그래프에서 노드1을 시작으로 다익스트라 알고리즘을 적용해 다른 노드까지의 최단 경로를 구해 보겠습니다. 2. 다익스트라 적용..

[Spring] 이메일 전송(JavaMailSende)

회원 가입을 할 때 이메일을 기입하게 되는 경우가 있습니다. 이 때 해당 이메일을 확인하기 위한 절차나, 사용자가 비밀번호를 잊었을 경우 확인 절차를 위해 메일을 전송하기도 합니다. 그러면 스프링에서 메일을 전송하기 위한 JavaMailSender를 사용해 보겠습니다. 1. pom.xml에 라이브러리 추가 Mail 관련 기능을 이용하기 위해 pom.xml에 관련 라이브러리를 추가해야 합니다. 가장 쉬운 방법으로 새로운 프로젝트를 생성하면서 관련 기능을 추가해 생성된 dependency 내역을 가져오면 됩니다. 기존과 같은 세팅으로 새로운 프로젝트를 생성해 보겠습니다. "Next"를 눌러 줍니다. JavaMailSender를 사용할 수 있는 "Java Mail Sender"를 클릭해 dependency를 ..

Spring 2022.03.24

[Spring] 기본 디렉토리 구조(Controller, Repository, Model, Service)

Spring은 자바 기반의 객체지향으로 프로그래밍 해야 하는 프레임워크입니다. 그럼 실제 개발할때 구조가 어떻게 되며, 어떤 패턴을 갖게 되는 걸까요? 1. Layered Architecture n-계층 아키텍쳐라고도 하며, 여러 레이어들이 각자 분리되어진 아키텍처를 말합니다. 여기서 레이어는 공통 단위로 묶어진 소프트웨어 단위로, 크게 Presentation / Service / Persistence 로 구성됩니다. 1) Presentation layer(View, Controller, Pages, Display beans) 사용자와의 최종 접점으로, 사용자로부터 데이터를 입력받거나 반대로 데이터를 가공해 처리 결과를 출력해서 보여주는 레이어 입니다. 2) Service layer(Services, M..

Spring 2022.03.24

[Spring] Thymeleaf를 통한 View 페이지 매핑

위에서 MainController 클래스 안에 index함수가 있습니다. 최상위 경로로 요청이 들어오면 "index"를 리턴하도록 작성이 되어있는데, 이는 View역할을 하는 index.html을 리턴하도록 매핑하는 로직 입니다. index.html에 작성된 내용은 위와 같고, 현재 상태에서 실행을 시켜 최상위 경로에 대한 요청을 하게 되면 앞서 작성해 놓았던 View페이지인 "index.html"을 가져오게 됩니다. 그러면, MainController에서 최상위 경로('/')에 request를 하면 "index"를 리턴하게 되고, "index.html"을 가져오게 되는것은 알겠는데 어떻게 내가 작성해 놓았던 "index.html"위치를 알고 가져오게 되는 걸까요? 정답은 타임리프(Thymeleaf) 설..

Spring 2022.03.23