전체 글90 [Kotlin] Kotlin의 Null 안전성 완전 정리: ?, !!, ?: 그리고 Java Optional과의 차이 코틀린의 ?, !!, ?:는 왜 필요할까?자바와 비교해 보는 Null 안정성 설계1. 코틀린의 ?, !!, ?: 연산자는 무엇이고 왜 쓰는가?코틀린은 NullPointerException(NPE)을 방지하기 위해 설계 단계에서부터 null 처리를 강제한다.이를 위해 대표적으로 다음 세 가지 연산자를 제공한다.? : null이 될 수 있는 타입을 선언할 때 사용한다. 예: String?!! : null이 아님을 단언할 때 사용한다. null이면 런타임 예외가 발생한다.?: : null일 경우 대체 값을 제공할 때 사용한다. 엘비스 연산자라고도 불린다.2. 실제 예시로 이해하기var name: String? = nullprintln(name?.length) // null 안전 접근 → 출력: nul.. Kotlin 2025. 9. 3. [Kotlin] 백준 3967 - 매직 스타 1. 문제 요약헥사그램 모양의 12칸에 1~12를 배치여섯 개의 줄마다 서로 다른 4칸의 합이 모두 26이어야 한다. 입력은 5×9 보드: A~L은 숫자 1~12를 의미 x는 빈칸 .는 모양 유지용 가능한 해 중 사전순으로 가장 앞서는 보드를 출력 항상 해가 존재하는 경우만 입력으로 주어진다. 2. 접근법이 문제는 백트래킹(DFS) 으로 해결. 기본 아이디어12칸을 순서대로 채워나간다. 이미 채워진 칸은 건너뛰고, 빈칸(x)은 아직 쓰지 않은 숫자 중 하나를 넣는다. 여섯 개 줄의 합이 26인지 체크한다. 사전순 최소 해를 보장하는 방법입력 보드를 행 → 열 순서로 스캔하여 12칸의 인덱스를 매긴다. DFS에서 숫자를 배치할 때는 1부터 12까지 오름차순으로 시도한다.→ 최초로 완성되.. 카테고리 없음 2025. 8. 29. [Kotlin] BOJ 1263 - 시간 관리 문제 요약작업마다 (소요시간, 마감시간)이 주어진다. 모든 작업을 순차적으로 처리할 때, 가능한 가장 늦은 시작 시각을 구하는 문제이다. 만약 마감 내에 끝낼 수 없다면 -1을 출력한다.풀이 아이디어각 작업을 마감 시각 기준 내림차순으로 정렬한다.현재 가능한 가장 늦은 시작 시각 curTime을 유지한다.각 작업을 순회하면서curTime = min(curTime, endTime) - processTime으로 갱신한다.만약 curTime 이 되면, 더 이상 모든 작업을 마감 내에 끝낼 수 없으므로 -1을 출력한다.알고리즘 절차입력을 받아 (processTime, endTime)으로 저장한다.endTime 기준 내림차순 정렬을 한다.curTime을 첫 작업의 endTime으로 초기화한다.정렬된 작업을 순회하.. Algorithm, Problem Solving/백준(boj) 2025. 8. 28. [Kotlin] BOJ 16927 - 배열 돌리기 2 문제 소개주어진 N×M 배열을 반시계 방향으로 R번 회전시킨 결과를 출력하는 문제다. 배열은 여러 겹의 “테두리(ring)”로 구성되어 있고, 각 ring을 독립적으로 회전시키면 된다.접근 방법1. 단순 시뮬레이션처음엔 그냥 한 칸씩 R번 회전을 구현해보았다.R이 작다면 문제없지만, 입력 제한을 보면 R ≤ 10^9.→ 이렇게 하면 시간 초과가 발생한다.2. 모듈러 연산으로 최적화한 ring의 길이가 L일 때 R번 돌린 것은 사실상 R % L번 돌린 것과 같다.예를 들어, 길이가 12인 ring을 1,000,000,007번 회전시키는 건 7번 회전과 동일하다.이 아이디어로 “큰 R”을 줄여 시간 초과 문제는 해결할 수 있다.3. 하지만 여전히 비효율적여전히 R % L번 한 칸씩 이동을 해야 한다.최악의 .. Algorithm, Problem Solving/백준(boj) 2025. 8. 28. Entity와 DTO, 어디까지 분리해야 할까? 서비스를 설계할 때 흔히 접하는 질문 중 하나가 바로 “Entity와 DTO를 어디까지 분리해야 하는가?”이다. 프로젝트 초반에는 모든 계층에서 Entity를 직접 사용하는 방식으로 시작하기 쉽지만, 시간이 지날수록 데이터 흐름이 복잡해지고, 여러 계층에서 도메인 객체를 공유하는 구조는 다양한 문제를 초래한다.이 글에서는 Entity와 DTO의 역할을 명확히 나누는 이유와, 이를 어떤 기준으로 설계해야 하는지 단계적으로 정리해본다.1. Entity와 DTO는 역할부터 다르다개념목적책임EntityDB 매핑, 영속성 관리도메인 상태를 표현하고 저장DTO (Data Transfer Object)계층 간 데이터 전달외부와의 인터페이스, 직렬화/역직렬화, UI 모델Entity는 비즈니스 로직과 밀접한 관계를 가지.. spring 2025. 8. 8. JPA 설계를 시작할 때 꼭 알아야 할 다섯 가지 원칙 JPA 설계를 시작할 때 꼭 알아야 할 다섯 가지 원칙JPA는 Java 진영에서 널리 사용되는 ORM 프레임워크다. 코드 몇 줄만으로 테이블을 매핑하고, 복잡한 SQL 없이도 객체 단위로 데이터를 다룰 수 있다는 점에서 생산성이 높다. 하지만 구조와 동작 원리를 충분히 이해하지 않은 채 사용하는 경우, 데이터 정합성 오류나 성능 문제를 겪게 된다.이 글에서는 JPA를 도입할 때 반드시 고려해야 할 설계 원칙 다섯 가지를 정리한다. 단순한 사용법보다는, 왜 그렇게 설계해야 하는지, 그리고 그렇지 않았을 때 발생하는 문제를 중심으로 설명한다.1. Setter는 최소화하고 생성자 또는 정적 팩토리 메서드를 사용하자JPA에서는 엔티티의 모든 필드를 @Entity에 선언하면 매핑이 완료된다. 이때 흔히 모든 필드.. spring 2025. 8. 6. [Kotlin] lateinit vs lazy 정리 Kotlin에서는 변수를 나중에 초기화하는 방법으로 lateinit과 lazy를 사용할 수 있다. 둘 다 선언 시 즉시 초기화하지 않고 나중에 값을 설정하거나 계산할 때 사용하지만, 용도와 동작 방식이 다르다. 1. lateinit개념초기화 지연 변수(Delayed Initialization)주로 var(가변 변수)에 사용null을 사용하지 않고 늦게 초기화할 수 있도록 해준다.특징nullable을 피할 수 있음 (var str: String? = null 대신 lateinit var str: String)초기화를 보장하지 않으면 런타임 에러 발생 (UninitializedPropertyAccessException)기본 타입(Int, Boolean 등)에는 사용 불가→ non-null 객체 타입에서만 .. Kotlin 2025. 5. 12. [백준][Java] 2585 - 경비행기 문제 정보https://www.acmicpc.net/problem/2585 난이도 : G2유형 : 이분탐색, BFS문제 풀이S에 T로 갈 때 연료 급료 횟수가 K이하가 되도록 최적의 연료통의 크기를 구하면 된다. 연료통의 크기에 따라 'K 이하로 도착할 수 있다' VS 'K 이하로 도착할 수 없다'즉, 두 가지 경우가 발생하며 연료통의 크기에 따라 결과는 N, N , N,.... Y, Y Y 이런 형태가 나온다.위의 형태에 따라 연료통의 크기는 이분탐색을 통해 찾아낼 수 있다. 이분탐색으로 얻은 연로통의 크기를 기준으로시작점부터 시작하여 도착점까지 경유지를 포함하여 BFS 탐색을 진행하면 된다.BFS 결과를 통해 매번 이분탐색으로 연로통의 크기를 조절하며 최적의 값을 찾을 때까지 BFS을 진행하면 된다... Algorithm, Problem Solving/백준(boj) 2025. 3. 11. [백준][Java] 15732 - 도토리 숨기기 문제 정보https://www.acmicpc.net/problem/15732 난이도 : G2유형 : 이분탐색문제 풀이주어진 도토리를 주어진 규칙들을 통해서만 박스에 모두 담을 때 마지막 박스 번호를 찾아야 한다.즉 박스를 왼쪽부터 사용하되 가장 적게 사용하여야 하며 마지막으로 사용한 박스 번호를 찾으면 된다.최적의 박스 번호는 이분 탐색으로 찾을 수 있다. 시간 복잡도는 박스의 개수인 N을 기준으로 O(NlogN) 걸린다. left 포인터는 규칙 값으로 입력되는 A의 최솟값으로 설정right 포인터는 규칙 값으로 입력되는 B의 최댓값으로 설정 각 구간에서 도토리 개수를 구하는 공식public int getCount(int target) { if (target (target -> left와 rig.. Algorithm, Problem Solving/백준(boj) 2025. 3. 10. [Spring-OAuth2] OAuth2AuthorizationServerConfiguration.applyDefaultSecurity - Deprecated 해결 문제 상황Spring Boot로 OAuth2 인가서버를 만드는 과정에서 문제 발생OAuth2AuthorizationServerConfiguration 설정에서 문제applyDefaultSecurity(http) 정적 메소드가 deprecated 되었다1.4 버전 이후로 deprecated// DeprecatedOAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http); 해결 방법OAuth2AuthorizationServerConfigurer 직접 적용: applyDefaultSecurity 대신 OAuth2AuthorizationServerConfigurer를 HttpSecurity 객체에 직접 적용@Beanpublic SecurityFilter.. spring 2025. 1. 18. [백준][Java] 28118 - 안전한 건설 계획 1. 문제정보https://www.acmicpc.net/problem/28118난이도 : G4유형 : 분리 집합2. 문제풀이문제 조건 "서로 다른 두 기둥을 연결하는 빔이 항상 존재하도록 보강 작업을 진행할 수 있음이 보장된다."을 통해 a 작업은 발생할 수 없음을 알 수 있다.서로 빔으로 연결된 기둥들을 한 개의 기둥으로 변환하여 이렇게 변환된 기둥들을 서로 연결되도록 간선을 이어주면 된다.서로 이어진 기둥들의 집단 개수 - 1 = 간선 수(정답)3. 코드uion by rank 기법을 사용하였지만 기본 disjoint set을 사용해도 무방import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;im.. Algorithm, Problem Solving/백준(boj) 2024. 7. 17. [백준][Java] 2288 - 격자의 분리자 1. 문제 정보https://www.acmicpc.net/problem/2288난이도 : G5유형 : BFS, DFS, DP시간 : O(S)2. 문제 풀이최단 경로를 찾기 위해 위아래로 연결되어 있는 S 집합의 좌우 폭을 넓혀야 한다.넓히는 이유는 S로 이루어진 길에서 탐색의 경로의 경우의 수를 늘려 최소 거리를 찾기 위함이다. 문제 조건을 보면 B는 S로 변경할 수 있다, 단 왼쪽에 S가 있는 B만 변경할 수 있다.즉 S와 B가 붙어 있는 경우에만 B를 S로 변경할 수 있다 입력된 문자열을 통해 테이블을 초기화할 때각 줄마다 처음 등장하는 B를 S로 바꾼다 결과적으로 기존의 테이블에서 변경된 테이블의 S의 모양은 오른쪽으로 1칸씩 확장된 모양이다.(단, 문제의 제약사항에 따라 테이블의 꼭짓점에는 S.. Algorithm, Problem Solving/백준(boj) 2024. 5. 1. 이전 1 2 3 4 ··· 8 다음