오랜만에 손코딩 연습도 해볼겸 개념정리도 한번 할겸 자바로 링크드리스트를 구현해보았다. 링크드리스트는 노드가 연속적으로 다음 포인터를 가지고 있는 자료구조이다. 링크드 리스트의 개념이나 특징을 공부한 후에 구현해보는 것을 추천한다! 처음에는 데이터 타입을 그냥 가장 상위 클래스인 Object 클래스로 구현해보았다. 그렇게 하면 여러개의 다른 데이터 타입을 넣을 수는 있겠지만, 하나의 데이터 타입으로 고정할 수가 없었다. (예를 들면 자바 라이브러리 util에 있는 자료구조들처럼..) 그래서 제네릭 타입으로 구현하여 호출하는 쪽에서 타입을 지정하고, 다른 타입을 파라미터로 넣으면, 컴파일 오류가 나게하여 더 좋은 코드를 작성해보았다. 일반적으로, 컴파일 오류가 나게끔 하는 게 더 좋은 코드이다. 런타임 오..
요즘 프로젝트 리팩토링을 하면서, DTO에 작성하는 여러개의 lombok 어노테이션의 사용 이유를 정확히 알지 못하고 사용하는 것 같아서 하나하나 고찰(?) 해보기로 했다. 일단, DTO는 Data Transfer Object로, REST API 작성 시에 엔티티 대신에 DTO를 사용하여 컨트롤러에서 데이터를 주고받는 용도로 사용한다. DTO를 사용하면 엔티티에 변질을 막을 수 있고, 로직에 맞춰 필요한 필드만 주고받을 수 있어 DTO를 사용하는 것이 좋다. 컨트롤러에서 DTO를 주고받기 때문에 JSON 직렬화와 역직렬화가 일어난다. - 직렬화(serialization) : Java Object 가 JSON으로 변환되는 것으로, ResponseBody를 사용할 때 일어난다. (서버 -> 클라이언트) - ..
예전 프로젝트 리팩토링을 진행하다가 문득 궁금한 것들이 생겼다. JPA를 사용하면서 Entity, DTO 클래스에 꼭 여러가지 lombok 어노테이션을 달아왔었다. 예를 들어, @Builder, @NoArgsConstructor, @AllArgsConstructor, @Getter 등... 그런데 어느 순간부터 이 어노테이션이 왜 필요한지 어떻게 쓰이는지를 잊고 습관적으로 갖다 붙이고 있는 것 같았다. 알아도 정확히 알고 있는 듯한 느낌이 아니었다. 그래서 이에 대해 많이 검색해보고 알아보았다. 일단 Entity 클래스에는 @Entity 를 붙여야한다. 난 항상 이렇게 달아왔다. @Entity @Builder @AllArgsConstructor @NoArgsConstructor(access = Acces..
이 문제는 좀 문제(?)가 있는 문제라고도 할 수 있다. 시간복잡도적으로 더 효율적인 코드를 알게 되어서 그 내용을 정리해보려고한다. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/92343 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 내 풀이 일단, 재귀 + 백트래킹으로 풀 수 있는 문제다. 그렇게 풀어도 통과할 수 있다. 나 또한 그렇게 풀었다. class Solution { int answer = 0; public int solution(int[] info, int[][] edges) ..
해커랭크에 있는 Lily's Homework 문제에 대해 정리해보려고한다. 어떤 알고리즘을 써야 적합한지에 대해서는 생각해냈지만, 구현방식을 생각해내지 못해 몇개의 테스트케이스에서 시간초과가 났다. 해결 과정 먼저, 문제를 읽고 도출해야하는 것이 크게 두가지라고 생각한다. 1. "인접한 인덱스의 원소의 차가 가장 작게 만들어야한다" -> 오름차순이나 내림차순으로 정렬이 되어야한다는 말이다. 2. "두 인덱스를 최소 횟수로 swap하여 1번 상태를 만들어야한다." -> 정렬 방법 중에 선택 정렬을 한다. 그런데, 선택 정렬은 시간복잡도가 O(N^2)이다. 기준 인덱스를 모두 도는 것이 (N) * 나머지 인덱스 중에 가장 작거나 큰 값 찾기 (N-1) 이 문제의 N의 최대값은 10^5이기 때문에 시간초과가 ..
주소 바인딩 논리적 주소 = 가상 주소 : 프로세스의 주소공간 가상 메모리 : 메모리 관리 기법. 컴퓨터가 실제 이용가능한 메모리자원을 추상화하여 매우 큰 메모리로 보이게 만드는것 물리적 주소 : 물리적 메모리에 실제로 올라가는 위치 cpu가 기계어를 수행하기 위해 논리적(가상) 주소를 통해 물리적 메모리의 어느 위치에 있는 지 확인해야함. 이렇게 논리적 주소를 물리적 주소로 연결해주는 작업을 주소바인딩이라고함. 1) 컴파일 타임 바인딩 : 프로그램을 컴파일 할 때 물리적 메모리 주소가 결정되는 방식 물리적 메모리가 컴파일 시 알려짐 시작 위치 변경 시 재컴파일 절대주소로 적재된다는 뜻에서 절대코드를 생성하는 바인딩 방식 비현실적이고 현대의 시분할 컴퓨팅 환경에선 잘 사용안함 2) 로드 타임 바인딩 : ..
문제를 읽어봤을 때 대충 풀어봤던 백준 문제 중에 '치즈' 라는 문제와 비슷해보여서 쉬울 줄 알았다. 백조가 만나야한다는 요소만 추가된 문제인줄 알았다. 그렇지만 플레5인 이유가 있었다..! '치즈'에서 풀었던 방식으로 똑같이 풀으려했더니 시간초과가 났다. 그래서 다른사람들의 풀이를 참고하여서 다시 풀어보았다. https://www.acmicpc.net/problem/3197 3197번: 백조의 호수 입력의 첫째 줄에는 R과 C가 주어진다. 단, 1 ≤ R, C ≤ 1500. 다음 R개의 줄에는 각각 길이 C의 문자열이 하나씩 주어진다. '.'은 물 공간, 'X'는 빙판 공간, 'L'은 백조가 있는 공간으로 나타낸다. www.acmicpc.net 문제 더보기 문제 두 마리의 백조가 호수에서 살고 있었다...
그리디 문제다. 내가 푼 방법은 테스트케이스 17번 딱 하나가 시간초과로 절대 풀리지 않았다. 그러던 중 질문하기 탭에서 엄청난 풀이를 발견했다. !!! 그래서 그 풀이를 정리해보려고 한다. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/150369 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 더보기 당신은 일렬로 나열된 n개의 집에 택배를 배달하려 합니다. 배달할 물건은 모두 크기가 같은 재활용 택배 상자에 담아 배달하며, 배달을 다니면서 빈 재활용 택배 상자들을 수거하려 합니다..