본문 바로가기

전체 글

(276)
이코테 - 탑승구 with JAVA 해당 문제가 다른 문제들과 다른 점은 union연산에서 부모를 던진다는 점이다. 왜 부모를 던지는 것일까? 해당 문제의 로직을 살펴보면 만약 1~4 탑승구 중 하나에 착륙이 가능한 비행기가 들어온다면 탑승구 4와 탑승구 3를 union 한다. 이렇게 반복을 하다 부모의 값이 0이라면 착륙이 불가능하게 처리한다. 0을 만들기 위해서는 부모를 던져야 한다. 예를 들어, 2, 2 비행기가 들어왔다고 가정하자 초기 부모는 다음과 같다 [0, 1, 2, 3] 2 비행기 착륙 : 0, 1, 1, 3 2 비행기 착륙 : 0, 0, 1, 3 과 같이 된다. (부모를 던졌다는 가정하에) 따라서, 이 후, 추가적으로 2이하의 수가 들어오면 0을 반환하고 종료된다. 코드 package JAVA.TCT.GraphTheory;..
Effective JAVA를 Spring 프로젝트에 적용해보자 (Item 10~14) 해당 블로그는 Object의 final이 아닌 메서드 equals, hashcode, toString, clone, finalize에 대한 내용으로 모두 재정의를 염두해 두고 설계된 메서드들이기에 활용 방법에 대해 설명한다. Item 10 : equals는 일반 규약을 지켜 정의하라. 기본적으로 equals는 자기 자신 즉, 인스턴스와 비교하기에 재정의를 통해 필드가 같은지 등을 확인할 수 있다. equals 재정의에 대한 경우 객체 식별성이 아닌, 논리적 동치성을 검사하는데 상위 클래스에서 재정의 되지 않은 경우 값 클래스의 경우 Map의 키와 Set의 원소로 활용되는 경우 싱글턴 객체의 경우는 정의가 필요없다. equals 재정의 규약 반사성 : 같은 인스턴스는 같다. 대칭성 : x.equals(y)..
Effective JAVA를 Spring 프로젝트에 적용해보자 (Item 6~9) Item 6 : 불필요한 객체 생성을 피하라 기본적으로 자바에서 객체의 낭비를 피하는 것이 일반적이다. 가장 큰 예시가 String이다. 생성자를 통해 객체를 생성하지 않는 이상 같은 문자 리터럴에 대해서 같은 머신에 대해 같은 객체를 사용한다. 사용하는 경우는 다음과 같다. 1. 불변 객체 (예 : String) 2. 불변 객체가 아니더라도 프로그램 도중 변경되지 않을 객체 3. 어댑터 (예 : Map의 keySet) Spring에 적용 그렇다면 Spring 프로젝트에는 어떻게 적용이 가능할까? 첫번째 예시인 불변객체는 기본적으로 해당 객체가 불변객체인지 아닌지 확인 후 그대로 사용하면 된다. 또한 세번째 예시도 마찬가지로 적용이 가능하다. 두번째 예시인 프로그램 도중 변경되지 않을 객체가 프로그램 중..
Effective JAVA를 Spring 프로젝트에 적용해보자 (Item 1~5) Item1 : 생성자보다 정적 팩터리 메서드 사용을 고려하자. 기본적으로 spring에서 클래스에 대한 인스턴스 생성경우는 여러가지가 존재한다. - Controller, Service, DAO 등 기본적인 베이스 클래스에 대한 생성 => Spring에서는 해당 클래스의 인스턴스 생성을 관리해준다. 따라서 인스턴스 생성에 대해 많은 부분을 고려할 필요가 없다. - DTO, Entity 등 클래스 => 클라이언트에 요청에 맞게 생성하는 경우에는 사용이 불필요하다. (통신에서 기본생성자와 getter/setter를 통해 인스턴슬 생성하기에 생성자 생략이 어렵다.) => 개발자가 프로그램 중간에 임의로 인스턴스를 생성하는 경우에 사용한다. 적용 사례 MemberDTO : 회원가입 관련 DTO public cla..
이코테 - 커리큘럼 with JAVA 해결 기본적으로는 위상정렬 알고리즘을 사용한다. 하지만, 주의할 점은 다음 노드를 방문할 때이다. 예를 들어, 3번 과목은 1, 2번 과목을 선수행해야하고 2번은 1번과목을 선수행해야한다고 가정하자. 이 때, 3번과목의 비용은 (2번과목까지 선수행 비용 + 3번 비용) vs (1번과목까지 선수행 비용 + 3번 비용) 중 큰 것으로 매겨진다. 코드 import java.util.*; // 커리 큘럼 public class Practice3 { public static void main(String[] args){ Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[] graph = new int[n]; int[] times = new int[n]..
이코테 - 도시 분할 계획 with JAVA 해결 아이디어 : 크루스칼 알고리즘으로 노드들을 비용이 적은 간선부터 연결을 한다. 이 때, 사이클 발생시에는 간선을 설치를 하지 않는다. 그렇게 진행한다면 모든 노드들이 연결이 되는데 마지막 가장 비용이 큰 노드를 제거하여 그룹을 두개로 나누면 된다. 코드 import java.util.*; // 도시 분할 계획 public class Practice2 { public static int[] parent; public static void main(String[] args){ Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int m = sc.nextInt(); // 부모 리스트 갱신 parent = new int[n+1]; for(int i=1..
Git Branch 전략 1. 개요 - 한 프로젝트를 개발하는데는 많은 개발자가 동원되어 코드를 수정하는 작업을 하는 것이 일반적이다. 혼자서 진행하는 개인프로젝트인 경우에는 master 브랜치에 수정 후 commit을 하거나 하나의 브랜치만 제작해 수정 후 삭제하더라도 크게 문제되는 부분은 없다. 하지만 개발자가 늘어날수록 브랜치간 충돌, 브랜치가 너무 많아지거나 의미를 파악하기 어려운 상황을 겪게 될 것이다. 따라서 프로젝트나 기업마다 브랜치 전략을 사용해 이를 해결한다. 2. Branch 전략 종류 Github flow Git flow GitLab flow 3. Github Flow - 깃허브에서 만든 단순하고 간결한 브랜치 구조를 의미한다. - Master 브랜치를 중심으로 운영 - 기능 추가, 버그 수정 등 간단한 브랜..
Git Basic 이번 포스트에서는 Git 사용에 대한 전체적인 기본 개념들에 대해서 정리해보고자 한다. 1. GIt 저장소 생성 깃허브를 사용하기 위해서는 기본적으로 회원가입을하고 저장소를 생성한다. 기초 용어 - Repository Name : 저장소 이름 - Description : 저장소 설명 - Public/Private : 오픈소스로 설정할 것인지, 공개하지 않을 것인지 설정 - README : 저장소 상세 설명 - .gitignore : 올리지 않을 파일 설정 - license : 해당 저장소의 라이센스 -> 해당 오픈소스 사용시 자신의 저작물 또한 공개할지 안할지 등을 결정한다. 이 후, 깃을 내 컴퓨터에 설치해 git 명령어를 사용하게 설정을하면 기본적인 세팅이 끝난다. 추가용어 정리 컨트리뷰터 : 해당 ..