전체 글 94

[백준 11275] 트리의 부모찾기

https://programmers-story.tistory.com/10 [백준 알고리즘] 메모리 초과 발생 이유 및 해결 방안 문제를 푸시다보면 다양한 에러를 만나실텐데요. 오늘은 백준알고리즘 1697번을 풀면서 발생한 메모리 초과에 대해서 글을 써보려고 합니다. 메모리 초과가 발생하는 이유를 간단히 말씀드리자 programmers-story.tistory.com 단순한 탐색 문제로 생각하고 인접행렬을 사용해 다음과 같이 풀었더니 메모리 초과가 나왔다. import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Stack; import java.util.StringT..

[Solved]/BOJ 2023.03.23

API 응답 ResponseDto 에서 ResponseEntity로 바꾸기

DB의 User 를 삭제하는 deleteUser 메서드가 Controller 계층, Service 계층에 아래와같이 정의되어 있고 이와 관련된 메서드들도 다음과 같다고 하자. @ApiOperation("회원 탈퇴") @DeleteMapping("/{userNo}") public UserDetailResponseDto deleteUser(@PathVariable Long userNo){ return userService.deleteUser(userNo); } Controller 단 deleteUser 메서드 @Transactional public UserDetailResponseDto deleteUser(Long userNo){ User user = findUserByUserNo(userNo); userR..

Heap

Heap Heap은 완전 이진트리를 기반으로 한다. 최대 힙(Max Heap)은 루트 노드로 올라갈수록 저장된 값이 커지는 구조이다. 최소 힙(Min Heap)은 루트 노드로 올라갈수록 저장된 값이 작아지는 구조이다. 최대 힙이든 최소 힙이든 모든 부모 노드의 우선순위는 자식 노드보다 크거나 같다. 구현의 용이함을 위해 root index는 1부터 시작한다. 위 조건을 만족하며 완전이진트리 형태로 채워나가면 된다. 즉, 형제노드간 우선순위는 고려하지 않아도 된다. Heap의 부모 노드와 자식 노드간 관계 부모 노드의 index = (왼쪽 자식 index) / 2 왼쪽 자식 index = (부모 index) * 2 오른쪽 자식 index = (부모 index) * 2 + 1 새로운 노드 추가 시 새로운 노..

Stack / Queue

Stack LIFO(Last In, First Out) 원칙을 따르는 선형 데이터 구조. 새로운 요소는 항상 최상위에 삽입되고, 삭제 역시 최상위에서만 이루어 진다. Stack의 주요 메서드 push( {value} ) : Stack의 맨 위에 element를 삽입한다. pop() : Stack의 맨 위에 있는 element를 삭제하고 반환한다. peek() : Stack의 맨 위에 있는 요소를 삭제하지 않고 반환한다. isEmpty() : Stack이 비어있는지 여부를 반환한다. empty() : Stack이 비어있는지 여부를 반환한다. search() : Stack에서 element가 몇 번째 위치에 있는지 반환한다. 1부터 시작한다. clear() : Stack의 모든 값들을 삭제한다. 이 때 em..

Java 클래스 작성

자바의 모든 코드는 클래스 내에 존재한다. 클래스 작성 방법은 다음과 같다. class ClassName { } class ClassName{ public static void main(String[] args){ } } 위 코드의 public static void main(String[] args) 는 프로그램 실행 시 java.exe에 의해 호출되는 프로그램의 시작점이다. Java 애플리케이션에는 main메서드를 포함한 클래스가 반드시 하나 있어야 한다. Java 애플리케이션을 실행할 때는 java.exe 다음 main 메서드가 포함된 클래스 이름을 적어준다. (시작점 역할) 하나의 소스파일에 둘 이상의 클래스를 정의하는 것은 가능하다. 소스파일의 이름은 public class의 이름과 같아야 한다...

[Java] 2023.03.19

Array / List / ArrayList / LinkedList

여러 데이터를 그룹화 해서 element로써 관리하기 위한 자료구조 Array Array 선언 시 고정된 크기의 메모리를(길이를) 할당한다. 선언시 정해진 메모리(길이)는 변하지 않는다. Array는 같은 자료형의 element만 포함할 수 있다. Array의 index는 각 value에 대한 유일한 식별자이다. (0부터 시작) 단순히 몇 번째인지를 나타내는 List의 index와는 다르다. 이 고정된 index를 사용해서 데이터에 대한 빠른 접근과 수정이 가능하다. (시간복잡도 O(1) ) Array 중간의 데이터를 삭제하면 삭제된 데이터의 index 위치에 그대로 빈 메모리가 생긴다. (메모리 낭비) 빈 메모리를 없애기 위해서는 빈 곳의 index+1 부터 한 칸씩 앞으로 재할당해줘야한다. Array..

Scanner vs BufferedReader

동아리 동기들과 스터디 그룹을 만들어 숙제 중 하나인 백준문제 풀이를 진행하던 도중 간단하게 생각했던 Stack 문제에서 시간초과가 발생했다. 옛날에도 비슷한 경험을 했던 적이 있어서 입력방법을 다르게 했더니 해결이 되었던 경험이 있었는데.. 싶어 찾아보니 Scanner 클래스보다 속도면에서 훨씬 우수한 BufferedReader 라는 것이 있다는 것을 알았다. Scanner BufferReader 패키지 java.util java.io 데이터 전송 타이밍 입력 받음과 동시에 즉시 전송. 개행문자 만날 때, Buffer 가득 찰 때 버퍼내용 한 번에 보냄. 속도 비교적 느림. 비교적 빠름. 데이터 파싱 별도의 형변환이 필요 없다. 모든 입력을 String으로 받으므로 별도의 형변환이 필요할 수 있다. 버..

트랜잭션과 @Transactional

Transaction이란 Spring은 @Transactional 어노테이션을 이용해 선언적 트랜잭션 처리를 할 수 있도록 지원한다. 그렇다면 먼저, 트랜잭션이란 뭘까? 트랜잭션이란, DB의 상태를 변화시키기 위해 진행하는 작업의 단위를 말한다. CRUD의 C U D에 해당하는 SQL 질의어(INSERT, DELETE, UPDATE)를 통해 DB에 접근하는 것을 말한다. 이 때, [SQL 질의어 하나 == 직업의 단위] 가 아니다. 예시 : 송금 A의 계좌에서 B의 계좌로 100만원을 송금한다고 가정하자. 그리고 프로세스는 다음과 같다고 하자. 출금 : A의 계좌에서 100만원이 차감된다. (UPDATE) 입금 : B의 계좌에 100만원을 추가한다. (UPDATE) 그런데 그 짧은 순간 네트워크에 문제가..