순열(permutation) 순열이란 서로 다른 n 개 중 r 개를 골라 순서를 고려해 나열한 경우의 수를 말합니다.예를들어, 집합의 원소가 {A, B, C} 일때, 3개의 원소를 모두 사용하여 순서를 고려해 나열하는 경우의 수는 A B C, A C B, B A C, B C A, C B A, C A B로 총 6가지 경우가 나오게 됩니다. 순열 알고리즘 순열의 모든 경우를 빼먹지 않고 고려하기 위해서는 아래와 같은 로직으로 찾아갑니다. 0번째 인덱스 원소를, 0번째 부터 n-1번째까지 위치를 바꿉니다. ( A B C를 기준으로 이 과정을 진행하면 A B C, B A C, C B A 가 됩니다.)1번 과정을 진행해서 나온 경우들을, 1번째 인덱스 원소를, 1번째 부터 n-1번째까지 위치를 바꿉니다.이러한 과..
프린터큐 ☞ 문제링크 Document를 클래스로 선언해야겠다는 생각만 했다면, 나머지는 큐의 기능을 문제 그대로 구현만 하면 되는 문제 였습니다. 문제 풀이 전략 (java) Document(문서) 클래스를 선언한다. class Document { } Document는 필드값으로 sequence(순서)와 importance(중요도)를 갖는다. class Document { private int sequence; private int importance; } 입력값을 기준으로 Document 인스턴스들이 담겨있는 큐를 정의한다. public static int solution(int N, int M, int[] importance) { Queue documentQueue = new LinkedList();..
개요 사용자가 기존 데이터를 수정하게 되었을 때, 기존 데이터를 수정된 데이터로 바꾸는 과정이 필요합니다. 이런 경우, 원본 Domain(혹은 DTO)에게 수정된 내용을 주입하기 위해서 Setter를 이용하는 방법이 진행됩니다. 다만, 필드가 많은 경우 무의미하게 Setter가 많아지게 되고 코드가 길어지게 되는 문제가 생깁니다. 이런 경우 Setter대신 BeanUtils.copyProperties() 메소드를 이용하면 단 한줄로 과정이 처리가 됩니다. Setter로 설정하는경우 public Book modifyBook(Book book) { Book bookById = bookRepository.findBookById(book.getId()); //기존 데이터 bookById.setName(book...
객체지향의 4대 특성? 캡슐화, 상속, 추상화, 다형성이 객체 지향의 4대 특성이라는 것은 개발자라면 한번 쯤은 들어본 내용 입니다. 4대 특성에 대한 내용은 다른 포스팅에 정리 해두었습니다.☞ 객체의 캡슐화(Encapsulation), 접근제어자☞ 객체의 추상화 (Abstraction)☞ 객체의 다형성(Polymorphism) 하지만 개인적으로 각각의 내용을 공부 하고 나서도 꼭 찝찝한 부분이 있었습니다. '이게 객체지향의 특성인데.. 뭐 어떻다는 거지?' 뭔가 와닿지 않고 별개의 개념을 말로써만 이어 붙였다는 기분이 들었습니다. 그리고 4대 특성에 대해 쉽게 이해할 수 없을지를 고민해 봤고 그 결과 한가지 키워드를 붙이면 아주 자연스럽다는 것을 알게 되었습니다. 바로 '~ 할 수 있다' 라는 키워드 ..
@OnDelete(action = OnDeleteAction.CASCADE) 설정 엔티티를 삭제할 때, FK로 연관 되어져 있는 엔티티가 있다면 삭제 시에 Constrain 에러가 발생한다. 해당 되는 엔티티를 직접 삭제 하는 방법도 생각해봤지만, (Result - Question - BookContent - Book) 이런식으로 연쇄적으로 연관 되어 있는 엔티티를 모두 삭제하는 것은 비효율적이라고 생각되어서 DB 테이블 상의 CASCADE 옵션을 고려 해봤다. 그러던 중, 테이블을 직접 설정하지 않고 JPA로만 설정 하는 방법을 찾으보니 역시 가능했다!! @OnDelete 설정으로 마치 DB 테이블상의 옵션처럼 FK로 연관되어져 있는 열을 삭제할때 같이 삭제되도록 설정이 가능했다. @ManyToOne(..
프로그래머스 알고리즘 - 네트워크 ☞ 네트워크 문제 링크 그래프 탐색을 코드로 구현 할 줄 알아야 풀 수 있는 문제였습니다. ☞ 그래프(Graph) DFS 탐색 구현하기 문제풀이코드의 전체적인 틀은 그래프 탐색을 응용합니다.네트워크망은 그래프로 치환하고, 각각의 컴퓨터를 노드로 치환합니다.class Network { class Computer { . . . } . . . } 탐색한 컴퓨터가 어떤 컴퓨터에도 연결되어 있지 않다면 네트워크의 숫자를 하나 증가시킵니다. class Network{ . . . void isNewNetwork(Computer computer) { if(!computer.connected) network++; } } 모든 컴퓨터를 탐색하기 위해서, 탐색은 모든 컴퓨터를 기점으로 시작..
URL 설계 URL naming convention을 찾다가 최근에는 RESTful 개념을 적용하여서 URL 설계를 하는 것을 알게 되었다. 확실히 세련된 웹에서는 쿼리 스트링을 남발 하기 보다는 깔끔하게 슬래쉬로 현재 페이지가 어떤 페이지인지 명시하는 것을 알 수 있었는데, 그러한 트렌드가 RESTful 개념에서 왔다는 것을 알 수 있었다. RESTful 하게 URL 설계해보기 기존 개발자들에게도 완벽하게 URL 설계를 완벽하게 한다는 것이 쉽지 않다는 것을 알게 되었다. 첫 설계이니 만큼 욕심 내지 말고 아래의 원칙만을 지키기로 정했다. CRUD키워드를 URL이나 쿼리 스트링에 명시하지 않는다. 같은 URL이라도 요청 메소드를 달리해서 구분한다.기존 변경 /book/list /books /book/d..
그래프와 BFS DFS의 개념, 그래프 구현방법은 이전 포스팅을 참고 ☞그래프(Graph)와 BFS, DFS☞그래프(Graph) 인접 리스트(adjacency list)로 구현하기그래프 생성하기 먼저 그래프를 생성하고 아래 그림과 같은 관계를 갖는 노드들을 만들겠습니다. (그래프와 구현은 이전 포스팅에 있습니다 ☞그래프(Graph) 인접 리스트(adjacency list)로 구현하기.) public class DFSBFS { public static void main(String[] args) { Graph graph = new Graph(5); graph.setNode(); graph.addEdge(0, 1); graph.addEdge(0, 4); graph.addEdge(1, 0); graph.add..