++ 51

[TIL] CS공부 5일차

Annotation이란 무엇이고 구체적으로 어떤 것이 있는지 예시를 들어 설명해주실 수 있을까요? 어노테이션은 주석이라는 의미로, 다른 프로그램에 유용한 정보를 제공하기 위해 사용됩니다. 프로그램 빌드 시 코드를 자동으로 생성할 수 있도록 정보를 제공하고, 런타임에 특정 기능을 실행하도록 정보를 제공합니다. 어노테이션을 사용함으로써 코드를 더 간결하게 하여 코드작성 시 생산성이 증가하며 유지보수하기 쉽다는 장점이 있습니다. 종류 및 예시 @Component 개발자가 직접 작성한 클래스를 인스턴스화하여 Bean으로 등록하기 위해 사용합니다. 실제로 프로젝트에서 토큰을 생성하고 인증하는 TokenProvider 클래스와 JwtAuthenticationFilter에 적용하여 사용하였습니다. @Bean 개발자가..

++/CS 2024.03.09

[TIL] CS공부 4일차

Java Map의 내부 구현은 어떻게 이루어져 있을지 추측해보실 수 있을까요? Map은 기본적으로 key-value를 쌍으로 데이터를 저장하는 자료 구조로, 순서가 보장되지 않으며 key값의 중복은 불가능 합니다. HashMap key를 이용하여 key에 해당하는 value값을 빠르게 찾기 위해 사용됩니다. 해시 함수를 이용해 각 key를 index로 변환하고, index를 통해 bucket에 접근, 해당 index에 key와 value 값을 저장합니다. TreeMap 이진 검색 트리 기반으로 구현되며 각 Node들이 연결된 형태로, 모든 key-value 쌍은 정렬되어 있어 범위 검색이나 정렬이 필요한 경우에는 TreeMap을 사용하는 것이 좋습니다. LinkedHashMap HashMap을 상속받아 ..

++/CS 2024.03.08

[TIL] CS공부 3일차

JVM의 스택과 힙 메모리 영역에 대해 아는 만큼 설명해 주실 수 있을까요? 자바 프로그램이 실행되면 JVM은 OS로부터 메모리를 할당받아 용도에 따라 여러 영역으로 나누어 관리합니다. 스택 메모리 영역은 정적으로 할당된 메모리 영역으로 기본 자료형 데이터 값이 저장되는 공간이며 각 스레드마다 별도로 할당됩니다. 후입선출(LIFO)의 형태로 동작하며, 메서드가 호출되면 필요한 메모리 공간을 할당받고 메서드가 종료되면 사용하던 메모리를 반환합니다. 힙은 동적으로 할당하여 사용하는 영역으로 모든 스레드에서 공유됩니다. new 연산자에 의해 생성되는 참조형 데이터 타입의 객체나 배열이 생성되는 공간으로 객체를 참조하는 레퍼런스 변수는 stack 영역에 저장됩니다. Heap 영역과는 달리 호출이 끝나더라도 삭제..

++/CS 2024.03.07

[TIL] CS공부 2일차

JPA의 더티 체킹이란 무엇인가요? Dirty는 데이터의 변경된 부분을 뜻하며 Dirty Checking은 데이터의 변경된 부분을 검사하는 것을 뜻합니다. 대표적으로 데이터 update 시 사용되는데, 따로 update에 관한 쿼리를 작성하지 않아도 dirty checking을 통해 변경된 부분을 감지하여 데이터 업데이트를 수행하기 때문에 코드의 복잡성을 줄일 수 있습니다. 더티 체킹은 영속성 컨텍스트가 관리하는 엔티티에만 적용되며, Transaction이 커밋되기 전까지 변경사항을 추적하여 스냅샷을 만들어놓고 Transaction이 커밋된 시점에서 스냅샷과 비교해 변경된 사항이 감지되면 update 쿼리를 데이터베이스로 전달하여 엔티티의 변경된 상태를 반영합니다. 하지만 Dirty Checking으로 ..

++/CS 2024.03.06

[TIL] CS공부 1일차

Call by reference란 무엇이고 보통 어떻게 쓰이나요? Call by reference는 함수 호출 방법 중 하나로 참조에 의한 호출이라고 합니다. 함수 호출 시 인수로 전달되는 변수의 값 주소를 참조하는 방식으로 별도 메모리를 사용하지 않고 주소만 참조하기 때문에 빠르다는 장점이 있으나, 호출된 함수에서 해당 값이 변경될 경우 원래 값에도 영향을 준다는 단점이 있습니다. Call by reference와 달리 Call by value는 값에 의한 호출로, 값을 복사하여 처리하는 방식입니다. 원래 값이 보존될 수 있다는 장점이 있지만 복사로 인해 메모리 사용량 증가한다는 단점이 있습니다. C언어에서는 포인터 변수(*)를 파라미터로 지정하고 함수 호출 시 주소연산자(&)를 이용해 매개변수의 주소..

++/CS 2024.03.05

[baekjoon] 2212. 센서

✅ 문제 💡 문제 이해 최대 k개의 집중국의 수신 가능 영역 길이의 합의 최솟값을 구하는 문제 1. 센서를 묶어 k개의 집중국으로 나눔 2. 각 집중국 내의 센서 간 수신거리의 합이 최소가 되는 경우 = 집중국간 경계의 거리가 최대가 되는 경우 ✅ 풀이 문제 자체를 이해하는데 한참 걸렸다. 그리디 알고리즘 방식으로 접근하면 된다고는 생각했지만 실제적으로 구현이 좀 어려웠음 💡 문제 풀이 Point 1. 집중국이 k개일 때 집중국 경계 영역은 k-1개 2. 원점으로부터 거리 -> 오름차순 정렬 후 인근 센서 사이 거리 구하기 3. 센서 간 거리를 배열에 담고 오름차순하여 가장 큰 수 k-1개를 제외한 나머지 합을 구하기 아래에 예제 입력 2가지 경우를 모두 그림으로 그려 보았다. 각 센서간 거리를 구한 다..

[baekjoon] 10026. 적록색약

✅ 문제 💡 문제 이해 1. 섬 개수 구하기와 비슷하지만 R, G, B로 섬 구분 2. 적록색약의 경우 R, G 구분이 안가므로 R+G / B로 구분 3. 각 구역 수 count 후 출력 ✅ 나의 코드 💡 문제 풀이 Point 1. 적록색약의 여부를 isblind로 구분해서 dfs 탐색시 같이 넘김 2. dfs 탐색 시 2-1) 적록색약인 경우 B인 경우와 B가 아닌 경우를 나누어서 탐색 2-2) 적록색약이 아닌 경우 일반적인 dfs 탐색 import sys input = sys.stdin.readline sys.setrecursionlimit(10000) def dfs(x, y, color, isblind): for i in range(4): nx = x+dx[i] ny = y+dy[i] if 0

[baekjoon] 7562. 나이트의 이동

✅ 문제 원하는 위치로 나이트를 이동시킬 때의 최단 거리를 구하는 문제 최단 경로를 구하는 문제라서 bfs 방식으로 풀었다. ✅ 나의 코드 import sys from collections import deque input = sys.stdin.readline # 이동 좌표 dx = [-2, -1, 1, 2, -2, -1, 1, 2] dy = [1, 2, 2, 1, -1, -2, -2, -1] def bfs(x, y, x2, y2, visited): q = deque() q.append((x,y)) while q: currentX, currentY = q.popleft() if currentX == x2 and currentY == y2: # 이동이 끝나면 이동거리 -1 반환(현재 위치 제외) print..

[leetcode] 543. Diameter of Binary Tree

✅ 문제 - 두 정렬 리스트의 병합 이진트리에서 두 노드 간 가장 긴 경로의 길이를 출력하는 문제! ✅ 풀이 💡 Point 1. 1부터 시작해서 각 노드별로 좌, 우 서브트리를 dfs 방식으로 확인 2. 더이상 서브트리가 없을 경우 0 반환하고 부모 노드로 다시 올라감 3. 부모노드 기준 좌, 우 서브트리 확인하여 더 깊은 쪽 길이에 +1 4. 항상 최댓값을 반환하므로 가장 긴 길이를 출력할 수 있다. 출력 샘플 그림으로 그려보며 이해해 봤다. 1부터 시작하여 서브트리 순회를 각각 하는데, 2로 내려가면 또 4, 5 서브트리가 있으니 더 이상 서브트리가 없을 때까지 dfs 탐색을 한다. 서브트리가 없으면 0을 반환하며 다시 부모 노드로 올라가는데 이때 좌 우 트리깊이 중 더 깊은 값에 +1을 해준다. 2..

[baekjoon] 2493. 탑

✅ 문제 ✅ 풀이 solution 1) 힙 이용 - 시간 초과 💡 Point 1. 인덱스와 함께 리스트를 힙 정렬함(최소 순으로 정렬) 2. 조건 확인 후 1) 현재 탑보다 숫자가 커야 함(숫자가 작으면 송신 불가) 2) 최초 리스트 기준 왼쪽으로 순회한다는 말 = 현재 탑보다 인덱스가 작아야 함 3. 결과 리스트 0으로 세팅해 두고, 현재 탑의 자리에 발사한 레이저를 송신한 탑의 인덱스+1 값을 넣어줌 n = int(input()) top = list(map(int, input().split())) # 송신탑 자리번호를 매겨 최소힙으로 만들어 정렬 top_list = [(num, i) for i, num in enumerate(top)] heapq.heapify(top_list) result = [0]..