최신 글
-
[Algorithm] CCW
CCW란?세 점 A, B, C가 이루는 회전 방향을 벡터의 외적($\times$, cross product) 부호로 판별하는 기하학적 판별식판별식의 결과에 따라 세 점이 이루는 회전 방향은 아래와 같습니다.$u \times v > 0$반시계(CCW, counterclockwise)$u \times v = 0$일직선(collinear)$u \times v 시계(CW, clockwise)동작 원리CCW는 세 점의 각도를 직접 계산하지 않고, 두 벡터 $u, v$가 이루는 상대적인 방향을 외적($\times$) 부호로 판단합니다.점 A를 기준으로 두 벡터 $u, v$를 정의합니다.$\vec{AB} = u, \vec{AC} = v$이때 2차원 벡터의 외적은 다음과 같이 계산됩니다.$u \times v = u_x..
-
[백준 23792] K번째 음식 찾기 2 [Java]
문제http://boj.ma/23792요약3개 그룹에서 K 번째로 맛있은 음식의 종류와 번호를 구하자.N, Q ≤ 1e5풀이 과정아이디어3개의 그룹을 합쳐 정렬 후 K번째 음식을 찾는다면, $O(3NQ) = 3e10$으로 시간초과가 발생한다.따라서 그룹을 합치치 않고, K번째 음식이 아닌, 어떤 음식 x에 대해 전체에서 x보다 작은 음식이 몇 개 인지 구 하는 문제로 재해석할 수 있다.현재 그룹에 K번째 음식이 존재할 것으로 기대하며, 다른 그룹에는 K번째 음식보다 음식 맛이 작은 음식이 K - 1개 존재하는지 확인하면 된다.현재 그룹의 임의의 음식(A[mid])에 대해 다른 그룹 내 음식(lowerBound(B, y, A[mid]) + lowerBound(C, z, A[mid]))과 현재 그룹의 음식 ..
-
[백준 23823] 초코칩케이크 [Java]
문제http://boj.ma/23823 23823번: 초코칩 케이크 boj.ma 요약한 행/열의 모든 조각에 초코칩을 1개씩 올릴 때, 초코칩이 가장 많이 있는 조각의 수를 구하자.$n ≤ 3e4, q ≤ 1e5$풀이 과정아이디어케이크의 모든 조각에 초코칩을 올리는 갱신 과정 $O(nq)$이므로 시간 초과가 발생한다.임의의 칸(i, j)에 있는 초코칩 개수는R[i] : i 번째 가로 줄에 초코칩을 올린 횟수C[j] : j 번째 세로 줄에 초코칩을 올린 횟수의 합으로 표현할 수 있다.따라서 초코칩이 가장 많이 놓인 조각의 수는 R[i]와 C[j]가 최대인 교차점이 된다.각 쿼리마다 R[i] + C[j] = maxRow + maxCol를 만족하는 칸의 수를 구하면 되며, 이는 maxRow인 행의 수 * ma..
-
[백준 25393] 교집합 만들기 [Java]
문제http://boj.ma/25393요약구간의 시작과 끝이 동일한 교집합 구간을 만들기 위해, 사용된 구간의 최소 수를 구하자.N ≤ 300,000 , Q ≤ 300,000풀이 과정아이디어단순히 구간 내의 교집합이 아닌, 구간의 시작과 끝이 일치하면서 교집합인 구간을 찾아한다.질의 구간 $[ l, r ]$은 주어진 구간 $[ l, r ]$과 일치할 수 있다.질의 구간 $[ l, r ]$은 주어진 구간 $[ l, R ] (R > r), [ L, r ] (L 그 외에는 질의 구간을 만족하는 구간은 존재하지 않는다.(1)은 주어진 구간을 그대로 Set에 저장하고, 질의 구간과 비교하면 된다.// 구간 저장String in = br.readLine();set.add(in);// 구간 탐색if (set.cont..
-
[백준 34817] 쉬운 정렬 문제 [Java]
문제http://boj.ma/34817요약인접한 요소가 K이하일 때만 swap해서, 오름차순 정렬이 가능한 배열인지 확인하자.N ≤ 200,000풀이 과정아이디어정렬을 위해 순서를 뒤집어야 하는 쌍 중, 두 값의 차이가 K를 초과하지 않으면 정렬이 가능함을 알 수 있다.아래는 문제 조건에서 정렬이 가능한 예시이다.K = 0, A = [ 0, 9, 9999 ]K = 1, A = [ 1, 0, 9999 ]임의의 위치 i에서 오른쪽에 있는 값 중 가장 작은 값 A[j]가 A[i]의 차가 K를 초과한다면, 그 배열은 정렬이 불가능하다.인접한 두 요소만 뒤집어 정렬해야 하지만, N ≤ 2e5 이므로, 매 번 오른쪽의 값 중 가장 작은 값을 구할 수 없으므로, 미리 구하자.int[] suffixMin = new i..
-
[백준 11944] NN [Java]
문제http://boj.ma/11944요약주어진 N을 N번 출력하자.완성된 문자열이 M보다 길다면, 앞 M자리만 출력하자.풀이 과정아이디어N번 만큼 반복한 문자열을 만들고, 길이가 M보다 크다면 앞 M자리까지 잘라서 출력하면 된다.// SolveString ori = in[0].repeat(N);if (ori.length() > M) { ori = ori.substring(0, M);}최적화N번 만큼 반복한 문자열의 최대 길이는 $2^{13}$이다.M은 최대 $2^{11}$이므로, 불필요한 문자열을 생성 후 자르게 된다.반복한 문자열의 길이가 M보다 클 때, 필요한 최소 반복 횟수만큼 생성 후 문자열을 잘라도 된다.final int len = in[0].length();final int oriLen = ..
-
[백준 12946] 육각 보드 [Java]
문제http://boj.ma/12946요약N * N 육각보드의 주어진 위치를 칠하기 위해 필요한 최소 색상의 수를 구하자.한 변을 공유하는 두 칸은 다른 색상을 사용해야 한다.풀이 과정아이디어인접한 칸은 현재 칸과 다른 색상을 사용해야 하므로, 그래프 탐색을 통해 주어진 위치에 RED - GREEN을 번갈아가며 부여하면 된다.if (board[nx][ny] == 'X' && visited[nx][ny] == NOT_VISITED) { cnt = Math.max(cnt, dfs(nx, ny, mark == RED ? GREEN : RED));}색상 부여 후, 현재 칸과 인접한 칸이 동일한 색상을 가진다면 (RED-RED or GREEN-GREEN) 두 색상 외에 또 다른 색상(BLUE)가 필요하다.3..
-
[React] Hooks
이 글에서는 React의 Hook의 개요와 등장 배경, 동작 원리, Hook Rule 등에 대해 학습한 내용을 정리하고 공유합니다.Hook동작 원리Hook Rule렌더링 프로세스와 Hook 실행 시점회고정리Hook함수형 컴포넌트가 상태 및 기타 React 기능을 사용할 수 있도록 하는 함수ex) useState, useEffect, useCallback, useMemo 등Hook을 통해 클래스형 컴포넌트처럼 상태 관리 및 기타 React 기능을 사용할 수 있습니다.use로 시작하는 JS 함수이지만, 정해진 규칙을 따르지 않을 경우 React가 올바르게 동작하지 않을 수 있습니다. 등장 배경Hook은 React 16.8에 추가된 기능으로, 이전에는 컴포넌트의 상태 관리, 라이프 사이클 제어 등을 수행하기..
-
[React] LifeCycle
이 글에서는 React의 LifeCycle(Mount, Update, Unmount)의 각 단계에서 어떤 작업을 수행하는지, 클래스형 컴포넌트와 함수형 컴포넌트의 차이에 대해 학습한 내용을 공유합니다.LifeCycleMountUpdateUnmount클래스형(Class) vs 함수형(Function) 컴포넌트 비교정리회고LifeCycle컴포넌트의 생성, 갱신, 소멸 과정을 단계별로 관리하는 React 동작 흐름React는 LifeCycle를 기반으로 컴포넌트의 동작을 관리합니다.이를 통해 각 시점에 필요한 로직(데이터 불러오기, 정리 작업, 이벤트 등록/해제 등)을 수행할 수 있습니다.LifeCycle은 크게 아래와 같은 과정으로 구성됩니다.생성(Mount)갱신(Update)소멸(Unmount)Mount컴..
-
[React] State
이 글에서는 React의 State의 개요와 동작 원리, 최소 사용 기준과 이유 등을 정리 후 공유합니다.State사용 방법State의 비동기적 처리State 최소화 전략정리회고State컴포넌트 내부에서 소유하고 관리하는 동적 데이터State는 부모가 내려주는 Props와 달리, 컴포넌트 스스로가 가진 내부 상태입니다.컴포넌트가 mount → unmount 되는 생명주기 동안 메모리에서 유지되며, 시간의 흐름, 사용자 입력, 이벤트 등 다양한 상호작용 트리거에 의해 값이 교체(업데이트)되고 UI를 다시 렌더링하도록 React에 요청할 수 있습니다.즉 컴포넌트가 직접 소유하면서도, 상태 변경에 따라 UI를 동적으로 제어하기 위해 사용됩니다.사용 방법useState Hook을 사용해 선언하고, 함께 제공되는..
-
[React] Props
이 글에서는 React의 Props, Props Drilling가 무엇인지, 이를 해결하기 위해 어떤 방법이 있는지 다루며, 리스트 렌더링 식에는 Key를 어떤 기준으로 부여해야하는지에 대해 학습한 내용을 공유합니다.PropsReact에서 Props의 역할Props Drilling리스트 요소 식별자: Key정리회고Props부모 컴포넌트에서 자식 컴포넌트로 단방향 전달되는 불변 데이터Props는 객체 형태로 전달되며, 자식 컴포넌트의 매개변수를 통해 사용할 수 있습니다.컴포넌트 재사용 및 유연한 UI 구성을 위해 사용됩니다. 일반적으로 부모 컴포넌트가 리렌더링 될 경우, 자식 컴포넌트도 리렌더링 됩니다.이를 해결하기 위해서는 props를 얕은 비교하거나 React.memo를 사용하는 등 불필요한 렌더링 최..
-
Swagger에서 CSRF 토큰 자동 전송이 되지 않는 문제
이 글에서는 Spring Security의 Swagger에서 API 테스트 시, CSRF 토큰을 자동으로 포함되지 않아 403 Forbidden이 발생하는 문제 해결 방법을 공유합니다. 문제 상황: Swagger → 백엔드 간 요청에서 CSRF 헤더 누락해결 방법: Springdoc Swagger UI에 CSRF 설정 추가회고참고문제 상황: Swagger → 백엔드 간 요청에서 CSRF 헤더 누락Spring Security의 CSRF가 활성화된 환경에서는 GET·HEAD·OPTIONS 외의 요청(PUT/POST/PATCH/DELETE)을 보낼 때반드시 다음 둘 중 하나가 필요합니다.요청 헤더에 X-XSRF-TOKEN혹은 hidden form field 기반의 _csrf 필드(2)번 방법은 Spring M..
-
[React] Component
이 글에서는 React의 Component 기반 설계 방식, 단방향 데이터 흐름, 컴포넌트 분리 기준, 리스르 렌더링과 key의 역할 등에 대해 학습한 내용을 공유합니다.Component특징단방향 데이터 흐름 (One-way Data Flow)Presentational Container Component사용 방법: 컴포넌트 생성사용 방법: 상태/컴포넌트 전달사용 방법: 전달 받은 상태/컴포넌트 사용이벤트 함수 전달조건부 렌더링리스트 표현회고Component입력(props)을 기반으로 UI(JSX)를 반환하는 React UI 설계의 최소 단위React에서는 컴포넌트(Component)기반의 아키텍처와 개발을 지향합니다.JSX 문법을 사용해 컴포넌트를 정의하고 JSX 내에서 태그처럼 호출하는 방식으로, 재사..
-
Refresh Token이 CSRF 보호가 필요한 이유와 설정 방법
CORS 허용 설정을 통해 다른 출처(Origin)의 접근을 허용할 수 있습니다.하지만 GET외의 요청은 CSRF 차단하므로, 사용자 인증/인가와는 별개로 403 Forbidden이 발생합니다.이번에는 CSRF가 무엇인지 되짚어보고, Spring Security에서의 기본 CSRF 동작 이해와 Refresh Token에 CSRF 설정이 필요한 이유 및 설정 방법에 대해 다룹니다. CSRF (Cross Site Request Forgery) 란?Refresh Token의 CSRF 보호가 필요한 이유Spring Security의 CSRF 기본 설정REST + JWT(Refresh Token Rotation)의 CSRF 설정CSRF 핸들러 설정: CsrfTokenRequestHandler회고참고 CSRF (C..
-
[백준 24938] 키트 분배하기 [Java]
문제http://boj.ma/24938요약진단키트를 N개의 균등하게 분배하기 위한 최소 혼잡도를 구하자.모든 진단 키트의 합은 int로 표현할 수 없다.풀이 과정아이디어현재 보유한 진단 키트의 수 $A[i]$ 가.균등하게 필요한 진단 키트의 수 $need$ 보다 많으면 다른 방에 넘겨주고, 적다면 받아야 한다.문제에서는 항상 정답이 보장되기 때문에, 진단 키트의 수가 많거나 적은 것에 대한 책임을 다음 방에 위임할 수 있다.// Solvefinal long sum = Arrays.stream(A).sum();final int need = (int) (sum / N);long result = 0;for (int i = 0; i 성능 분석시간 복잡도: $O(N)$제출결과: Accepted / 356ms / ..
-
[백준 02262] 토너먼트 만들기 [Java]
문제http://boj.ma/2262요약토너먼트 결승전까지 각 두 선수의 랭킹 차이의 총 합 최소를 구하자.초기에 주어진 선수의 순서는 불변하고, 대진표가 교차되지 않도록 구상해야 한다.풀이 과정아이디어초기 선수의 순서가 불변하고, 대진표가 교차되지 않으면서도 랭킹 차이의 총 합을 최소로 해야한다.경기가 진행됨에 따라 높은 순위(1에 가까운)들만 남게 되며, 낮은 순위의 선수들이 조기에 탈락(?)되어야 랭킹 차이의 총 합이 최소가 된다.순위가 N위인 선수부터, 2위인 선수들이 문제의 조건을 준수하며 랭킹 차이가 최소가 되도록 대진표를 구성하면 된다.// Solveint sum = 0;for (int rank = N; rank >= 2; --rank) { int lastRankIdx = R.index..
-
[백준 32142] 서바이벌 [Java]
문제http://boj.ma/32142요약순서대로 주어지는 학생들의 위치로 다각형을 만들자.거리가 가장 가까운 학생이 여러 명일 경우, 번호가 가장 큰 학생의 위치를 선택하자.풀이 과정아이디어순서대로 주어지는 학생들의 위치로 다각형을 구성하되, 거리가 가장 가까운 학생의 위치를 선택해야 합니다.s(i) → s(i+1)의 거리는 s(i + 1) → s(i + 2)간의 거리보다 작을 때, s(i+1)에서 가까운 거리인 s(i + 2)를 선택함으로써, 단순 다각형 형성을 기대할 수 있습니다.순서대로 주어지는 학생들의 위치 간 거리는 점점 작아져야 하며 결국 s(n - 1) → s(n)의 거리는 s(n) → s(1)보다 작아지게 됩니다.이 때 시작 점 s(1)은 역설적으로 s(2)가 아닌, s(n)을 선택하게 ..
-
[Spring Security] Spring Security
이 글에서는 Spring Security에 대한 개요 및 주요 구성과 관련 정보에 대해 학습한 내용을 공유합니다.Spring Security주요 구성 요소관련 정보회고Spring Security인증/인가 등 보안 전반을 표준화해 애플리케이션을 안전하게 보호하는 스프링 기반 보안 프레임워크Spring Security는 지속적인 보안 업데이트를 제공하고, 실제 사용되는 검증된 보안 기능을 제공합니다.개발자는 복잡한 보안 로직을 직접 구현하지 않아도 높은, 수준의 보안 설정이 가능하며 비즈니스 로직에 집중할 수 있습니다.세션 관리, 암호화, CSRF 방어, CORS 정책 적용, 보안 이벤트 처리 등 실무에서 필요한 공통 보안 기능 내장OAuth2, JWT, LDAP 등 현대화된 보안 방식을 제공합니다.이 가능..
-
[백준 30014] 준영이의 사랑 [Java]
문제http://boj.ma/30014요약원의 모든 요소에 대해, 인접한 쌍의 곱들의 합이 최대가 되도록 요소를 재배치하자.주어진 입력에 대한 최댓값 X는 int로 표현 가능하다.풀이 과정아이디어원의 모든 요소에 대해, 인접한 쌍의 곱들의 합이 최대가 되도록 하기 위해서는 큰 값들이 인접하도록 배치하면 된다.이를 위해서 우선 정렬 후, 큰 값부터 덱(Deque)의 좌우에 번갈아 넣어주자.// SolveArrays.sort(P);Deque deque = new ArrayDeque();for (int i = N - 1; i >= 0; --i) { if (i % 2 == 0) deque.addLast(P[i]); else deque.push(P[i]);}덱에서 요소를 하나씩..
-
[백준 01424] 새 앨범 [Java]
문제http://boj.ma/1424요약주어진 노래를 담기 위해 필요한 최소 앨범의 수를 구하자.노래와 노래 사이에는 1초의 공백 시간이 들어가야 한다.하나의 앨범에 들어간 노래의 수가 13의 배수이면 안된다.풀이 과정아이디어아래와 같이 주어진 규칙대로 조건 분기를 구성했다.1초의 공백을 더한 노래의 총 길이로, 앨범의 용량을 나누어 들어갈 수 있는 노래의 수를 구하자.int maxSongCount = C / (L + 1);int cdFreeSpace = C % (L + 1);if (cdFreeSpace == L) { ++maxSongCount;}한 앨범이 모든 노래를 저장할 수 있는 경우 13배수 규칙에 따라 필요한 최소 앨범의 수를 반환하자.maxSongCount = Math.min(N, max..
-
[JavaScript] Prototype
이 글에서는 JavaScript의 프로토타입 기반 객체 생성과 상속 구조에 대해 배운 내용을 공유합니다.Prototype상속: Prototype Chain회고Prototype객체 생성 시 기본적으로 상속받는 속성과 메서드의 집합Java 클래스는 new 키워드로 인스턴스화를 수행할 때, 실제 객체가 생성됩니다.반면 JS 엔진은 클래스 선언 시, 객체 간 공통 기능 재사용을 위한 프로토타입 객체를 생성합니다.function Member(name) { // 클래스 선언 시 프로토타입 객체 생성! this.name = name;}console.log(Member.prototype) // 객체를 생성하지 않아도 프로토타입 객체는 호출 가능/*{ constructor: f Member(name), ..
-
[JavaScript] Scope
이 글에서는 JavaScript의 Scope를 중심으로 전역 / 함수 / 블록 스코프의 차이를 살펴보고, var와 let/const 키워드가 스코프를 어떻게 결정하는 지 학습하고, 서로 다른 스코프에서 발생하는 오류를 해결하는 방법을 공유합니다.Scope전역 스코프 (Global Scope)함수 스코프 (Function Scope)블록 스코프 (Block Scope)스코프 문제 코드 예시회고Scope변수/함수에 접근할 수 있는 범위JS 엔진은 어떤 변수를 찾을 때, 전체 코드를 탐색하는 것이 아닌 정해진 규칙(ex: 스코프)에 따라 탐색합니다.[ Scope 사용 이유 ]변수 충돌 방지 : 서로 다른 스코프에서 동일한 이름의 변수를 독립적으로 사용할 수 있습니다.메모리 효율성 : 유효하지 않은 스코프가 메..
-
[JavaScript] Execution Context
이 글에서는 JavaScript의 Execution Context(실행 컨텍스트)를 중심으로, 전역 / 함수 / 블록 단위 코드가 실행될 때 JS 엔진이 어떤 환경을 생성하고, 변수·함수·this 값을 관리하는지 학습한 내용을 공유합니다.Execution Context생성 규칙 및 구조동작 방식 + 코드 예시블록 스코프에서의 함수 선언회고Execution Context“코드 실행에 필요한 환경 정보”를 모아둔 “객체”JS에서는 코드 실행에 필요한 환경 정보(스코프, 변수, this 등)를 저장하는 내부 객체를 생성합니다.생성된 실행 컨텍스트는 코드의 환경과 순서를 보장하기 위해 CallStack에 쌓아 올린 후 실행됩니다.예측 가능한 코드를 작성, 디버깅 능력 향상, 무분별한 전역 변수 사용 방지를 위해..
-
[백준 02141] 우체국 [Java]
문제http://boj.ma/2141요약일직선 상에 A[i]명이 X[i]에 위치할 때, 인원 수를 고려한 중앙값을 구하자.N ≤ 100,000, 시간 제한 ≤ 2s풀이 과정아이디어N이 1e5이므로, 완전 탐색으로 모든 위치 또는 마을로부터의 거리를 구한다면 시간 초과가 발생한다.우선 어떤 풀이를 사용하든, 마을의 위치가 오름차순으로 정렬되어 있지 않으니 정렬을 해주자.Arrays.sort(villages, (a, b) -> { return Integer.compare(a[0], b[0]);});A[i]명이 X[i]에 위치할 때, 인원 수를 고려한 중앙값은, X에 대한 가중 중앙값을 구하는 것으로 풀이할 수 있다.전체 인원(total)의 과반수가 되는 사람이 위치한 마을을 출력하면 된다.for (in..
-
검색창 하나도 전략이다: 디바운스·스로틀이 만든 UX 격차
사용자가 검색창에 글자를 입력할 때 어떻게 검색어 제안 기능이 동작할까?지도를 사용하면서 지도 정보를 불러오느라 불편했던 경험이 없었던 이유는 무엇일까? 검색창이나 지도와 같은 서비스의 "입력 이벤트 → 상태 업데이트 → 네트워크 요청 → UI 렌더링"라는 흐름에서 왜 불편함을 느끼지 못했을까?사용자의 행동이 빠르고 연속적일 때, API 호출이나 렌더링 비용은 증가합니다.만약 사용자의 모든 입력에 즉시 반응하도록 한다면, 검색창 하나만으로 서버를 괴롭힐 수 있습니다. 비동기 UI는 사용자의 체감 속도와 시스템의 실제 처리 속도 사이의 간극을 조정하는 역할을 합니다.단순히 비동기로만 처리하는 것이 아닌, 사용자의 행동 리듬에 맞춰 호출 시점 자체를 설계해야 합니다. 이번 글에서는 다음을 다룹니다.비동기 U..
-
[JavaScript] Promise
이 글에서는 JavaScript의 Callback함수의 Callback Hell문제를 해결하기 위한 방법과, 더욱 명확한 예외 처리 방법은 없는지 알아보고자 Promise에 대해 학습하고 정리한 내용을 공유합니다. Promise사용 방법Promise의 상태Promise ChainPromise CombinatorsPromise Hell / Nested Promise회고Promise비동기 작업의 결과를 명확하게 처리할 수 있도록 도와주는 객체여러 비동기 작업을 체이닝(Chaining)으로 구성해 콜백 지옥(CallBack Hell)을 방지하고 유지보수성을 높일 수 있습니다.Promise.all() 로 병렬 비동기 처리를 할 수 있습니다..then(), .catch() 등을 통해 비동기 작업 결과를 명확히 처..
-
[백준 16719] ZOAC [Java]
문제http://boj.ma/16719요약주어진 문자열을 만들기 위해, 문자를 추가해 만들어진 문자열들의 순서가 사전순이 되도록 만들자.문자열의 길이 ≤ 100풀이 과정아이디어만들어지는 문자열들의 순서가 사전순이 되기 위해서는, 사용하지 않은 문자 중 적절한 문자를 선택하는 기준은 아래와 같다.전체 문자 중 사전순으로 가장 앞서는 문자사전 순으로 동일한 문자 중 문자열의 앞에 위치한 문자int idx = left;for (int i = left + 1; i 이전에 선택한 문자보다 뒤에 있는 문자이전에 선택한 문자보다 앞에 있는 문자recursive(idx + 1, right);recursive(left, idx - 1);문자열의 길이는 최대 100이므로, 완전 탐색이 가능하다. 재귀를 통해 이전에 선택한..
-
[JavaScript] Callback Function
이 글에서는 JavaScript의 비동기 작업 처리를 위한 방법 중 CallBack 함수에 대해 알아보고, 사용 방법과 특징들에 대해 정리한 내용을 공유합니다.비동기 작업 처리 방법CallBack FunctionCallback Hell / Pyramid of Doom회고비동기 작업 처리 방법JS에서 논블로킹 + 비동기 처리를 위해서는 아래 3가지 방법을 사용할 수 있습니다.CallBackPromiseAsync / AwaitCallBack Function다른 함수의 인자로 전달되어 실행되는 함수콜백 함수는 함수의 정의 방식이 아닌, 실행 시점에 따라 동기/비동기 콜백으로 분류되며, 일반적으로 비동기 콜백을 많이 사용합니다. [ 동기 콜백 ]msg_list = ["hello", "world"]function..
-
[JavaScript] 블로킹 논블로킹, 동기 비동기
이번 글에서는 JavaScript의 외부 작업 수행 간 작업 위임 및 결과 처리 방식, 싱글스레드 JS엔진이 논블로킹+비동기 작업을 처리하는 방법 및 작업의 우선순위 결정 방식에 대해 학습하고 정리한 글을 공유합니다.입출력 모델작업 완료 처리 모델JS의 기반 모델싱글스레드 JS 엔진이 비동기를 처리하는 방법TaskQueue, MicrotaskQueue의 실행 우선 순위회고입출력 모델[ 블로킹(Blocking) ]작업 위임과 함께 제어권을 넘겨, 작업이 끝날 때 까지 스레드가 멈춰 대기하는 방식현재 스레드의 제어권을 넘김으로써 작업의 순차적 실행이 보장되며, 제어권을 위임받은 스레드의 작업 종료까지 현재 스레드는 멈춘 상태로 대기합니다.프로그램 실행 흐름 이해와 디버깅이 용이합니다. [ 논블로킹(Non-B..
-
[백준 01022] 소용돌이 예쁘게 출력하기 [Java]
문제https://boj.ma/1022 1022번: 소용돌이 예쁘게 출력하기 boj.ma 요약중심지(0, 0)에서부터 반시계방향으로 숫자가 증가하면서 채워진 10,001칸인 모눈 종이에서, (r1, c1) ~ (r2, c2)의 영역을 예쁘게 출력하자.제한 시간 ≤ 2s, 메모리 제한 128 MB풀이 과정아이디어모든 칸에 숫자를 채워 넣는것은 시간적으로 가능하지만, 공간적으로는 불가능하다. 따라서 모든 칸을 계산하지 않고도 주어진 영역의 값을 구해야 한다.이를 위해서는 소용돌이의 규칙을 찾아야 한다. 우선 주어진 입력은 왼쪽 상단 좌표, 오른쪽 하단 좌표인데 오른쪽 하단 좌표가 $1^2, 3^2, 5^2, 7^2...$로 규칙성을 띈다.임의의 좌표 $(x, y)$가 속한 소용돌이의 정사각형 경계선(leve..
-
[JavaScript] First-Class Function
이 글에서는 JavaScript의 일급 함수(First-Class Function)와 고차 함수 생성 및 동작 원리 등에 대해 학습한 내용을 정리하고 공유합니다.일급 함수(First-Class Function)일급 시민(First class citizen)사용 방법정리회고일급 함수(First-Class Function)일급 시민(First-Class Citizen)으로 취급되어, 변수처럼 사용할 수 있는 함수JS의 함수는 일급 시민으로 취급되며 변수처럼 사용할 수 있습니다.const run = () => console.log("run!"); // 함수를 값으로 할당run(); // 값으로 할당된 함수 실행이는 아래와 같은 이점이 있습니다.재사용성 향상 & 유연한 함수 처리: 함수를 변수에 저장하며, 중복..
-
[JavaScript] Pure Function
이 글에서는 JavaScript의 순수 함수(Pure Function)의 결정적 특성(Deterministic)과 참조 투명성, 부수 효과의 문제점 등을 학습 후 정리한 내용을 공유합니다.순수 함수참조 투명성부수 효과(Side-Effects)의 문제점정리회고순수 함수 (Pure Function)동일 입력에 동일 결과를 반환하며, 부수 효과가 없는 함수예측 가능하도록 동작하는 결정적(Deterministic)함수로, 구성요소들이명확한 구성 요소 : 파라미터(입력), 로직(처리), 반환(출력)이 명확하게 정의되어 있어야 합니다.부수 효과 없음(No Side-Effects) : 함수 외부의 상태를 변경하지도, 외부에 의존하지도 않아야 합니다.일반적으로 외부 상태에 의존하지 않는 결정적 동작 보장을 위해 순수함..
-
[JavaScript] Function
이번 글에서는 이전에 학습했던 함수형 프로그래밍 패러다임에 대한 탐구를 바탕으로 정리한 자바스크립트에서 함수를 정의하고 다루는 여러 방법을 공유합니다.Function함수 선언문(Functional Declearation)함수 표현식(Functional Expression)화살표 함수(Arrow Function)구조 분해 할당(Destructuring Assignment)Function재사용하기 위한 코드 집합JS에서는 여러 명령을 함수라는 단위로 묶고 이름을 부여할 수 있습니다.코드의 재사용성이 높아지며, 중복되는 코드를 줄일 수 있어 유지 보수성이 증가합니다.[ JS의 함수 작성 방법 ]아래의 함수 작성 방식은 문법적 차이 뿐 아니라 내부 동작에도 차이를 가지고 있습니다.함수 선언문(Functional..
-
프로그래밍 패러다임(Programming Paradigm)
이 글에서는 절차 / 객체 지향 프로그래밍과 함수형 프로그래밍의 개요를 정리한 글입니다.프로그래밍 패러다임절차 지향 프로그래밍 (Procedural Programming)객체 지향 프로그래밍 (Object-Oriented Programming, OOP)함수형 프로그래밍 (Functional Programming, FP)프로그래밍 패러다임(Programming Paradigm)코드를 바라보는 관점이자, 프로그램을 구성하는 사고 방식[ 프로그래밍 패러다임의 이점 ]복잡성 관리 : 프로그램이 커져도 규칙대로 나누고 관리할 수 있습니다.협업 용이성 : 모두가 동일한 방식과 규칙을 기반으로 코드를 작성해 협업이 원활해집니다.예측 가능한 코드 : 정해진 규칙을 따라 코드를 작성하므로 동작 예측이 수월합니다.[ 프로..
-
[JavaScript] namespace
이 글에서는 JavaScript의 Namespace에 대한 개요와 구현 방식과 은닉 방안을 정리한 글 입니다.Namespace구현 방법모듈 패턴과 IIFE을 활용한 네임스페이스 은닉Namespace식별자(변수/함수 명 등)가 충돌하지 않도록 그룹화 하는 방법식별자가 중복될 경우 추가적인 식별자가 필요하며, 네임스페이스는 식별자들을 그룹화해 문제를 해결할 수 있습니다. 관련된 기능과 데이터를 그룹화 할 수 있으며, 유지보수성을 향상시킬 수 있습니다.구현 방법JS에는 C++의 namepsace와 같은 키워드가 없으며, 주로 객체를 이용해 네임스페이스를 구현합니다.엔티티를 전체를 포함하는 객체를 선언함으로써, 네임스페이스 처럼 사용할 수 있습니다.const 네임스페이스명 = { 전역데이터: 값, 메서드명:..
-
[JavaScript] 객체
이 글에서는 함수형 패러다임을 따르는 JavaScript 객체가 가지는 정의와 생성 방식, 특징에 대해 정리한 내용을 공유합니다.객체객체 생성 방식동적 속성/메서드 추가캡슐화추가 정보: JSON과 JavaScript 객체의 차이회고객체키(Key)와 값(Value)으로 구성된 속성(Property)의 집합JS의 객체는 원시 타입을 제외한 나머지로 구성되며, 키(Key)와 값(Value)으로 프로퍼티(Property)와 메서드(Method)를 정의할 수 있습니다. 아래 3가지 방법으로 객체를 정의 및 사용할 수 있습니다.객체 리터럴생성자 함수클래스 객체 생성 방식[ 객체 리터럴 ]가장 단순하고 직관적인 방식으로, 단일 객체의 빠른 생성 및 초기화가 가능합니다.중괄호( { } )를 사용해 객체를 생성하고, 내..
-
티스토리 블로그에 LaTeX 수식 적용하기
이 글에서는 티스토리 블로그 게시글에 LaTeX 수식을 적용하는 방법을 소개합니다.수학식이나 알고리즘 공식을 표현할 때, 노션이나 마크다운에서 $로 감싼 수식을 그대로 붙여넣으면 LaTex로 렌더링됩니다. 예시: 노션에서 작성한 LaTeX 수식아래는 노션(Notion) 에서 작성한 글을 그대로 복사·붙여넣기한 결과입니다.LaTeX 수식이 적용되었던 영역은 $로 감싸진 부분입니다. 티스토리에서는 기본적으로 $으로 이루어진 영역을 인식하지 않으며, LaTex를 지원하지 않습니다.아래 과정을 통해 LaTeX를 적용해야 합니다. 1. mathjax-init.js 파일 작성HTML 내부에 3. 우측 상단의 “적용” 버튼을 눌러 저장합니다. 4. 적용 결과 확인적용 결과는 다음과 같습니다티스토리 게시글에도..
-
[백준 12943] 턴 게임 [Java]
문제http://boj.ma/12934요약i번째 턴을 승리하면 i점을 얻을 때 정확히 x, y점을 만들 수 있는지 확인 후 x를 만들기 위한 최소 승리 횟수를 구하자.불가능한 경우에는 -1을 출력하자.0 ≤ x, y ≤ $10^{12}$풀이 과정아이디어x, y가 유효하기 위한, $x + y = \frac{n(n+1)}{2}$를 만족하는 $n$을 찾아야 합니다.final long N = (long) Math.sqrt(2 * (x + y));if (N * (N + 1) / 2 != x + y) { return -1;}x를 만들기 위한 최소 승리 횟수를 구하기 위해서는, n ~ 1을 순차 탐색하며 x를 만들기 위한 수를 차례대로 선택하면 됩니다.x보다 큰 수가 만들어지면 안되는 점에 유의해야 합니다.long ..
-
[백준 15226] House of Cards [Java]
문제http://boj.ma/15226요약네 종류의 카드를 균등하게 사용해, 쌓을 수 있는 h0 이상의 타워 높이 h를 구하자.입력 조건이 최대 $10^{1000}$으로 Java의 BigInteger 또는 Python풀이 권장풀이 과정아이디어높이가 h인 타워를 만들기 위해 필요한 최소 카드 수 $f(n)$은 $\frac{2n(n+1)}{2} + \frac{(n-1)n}{2}$ 이다.네 종류의 카드를 균등하게 사용해, $h_0$이상의 타워를 만들어야 한다.따라서 $f(H)(H ≥ h_0)$에 대해 $3H^2 + H = 0 \pmod 8$, 을 만족하는 $H$를 찾으면 된다.private static BigInteger f(BigInteger n) { return n.multiply(n).multipl..
-
[백준 01034] 램프 [Java]
문제http://boj.ma/1034 1034번: 램프 boj.ma 풀이문제 요약50x50으로 이루어진 램프에 대해, 스위치를 K번 눌러 한 행의 램프 전체가 켜진 행의 최대값을 구하자.아이디어한 행에 대해 K번 눌러 램프를 전부 켜야하므로 행에 존재하는 0의 개수와, K를 2로 나눈 값이 동일해야 한다.0의 개수와 K를 2로 나눈 값이 동일할 때, 전체 행에서 현재 행과 동일한 행을 찾으면 된다. int max = 0; if (zeroCnt 풀이 시간10분소스코드https://github.com/rogi-rogi/problem-solving/blob/main/baekjoon-online-judge/normal/01034.java problem-solving/baekjoon-online-judge..
-
[백준 15550] if 2 [Java]
문제http://boj.ma/15550풀이문제 요약a == b, b == c, a ≠ c를 만족하는 자료형과 값을 찾자.아이디어정수의 부동소수점으로의 묵시적 변환에 따른 비교로 문제를 해결할 수 있습니다.float의 가수부 23비트와 숨은 1비트로 총 24비트의 정밀도를 가집니다. 첫 25비트를 가지는 16777216는 1.0 * 2^24로 정확한 표현이 가능하지만, 16777217는 정확한 표현이 불가능해, 표현 가능한 가장 가까운 수(16777216)로 반올림되어 표현됩니다. 따라서 float 16777216 == int 16777217 는 성립합니다.int 16777216float 16777216int 16777217풀이 시간10분소스코드https://github.com/rogi-rogi/probl..
-
[백준 09272] 상근이의 아이디어 [Java]
문제http://boj.ma/9272 9272번: 상근이의 아이디어 boj.ma 풀이문제 요약n1, n2가 주어졌을 때, R(n1, n2)를 구하자.아이디어S(n1, n2)는 Fermat Number의 집합이며, 서로 다른 두 Fermat Number는 항상 서로소이므로, R(n1, n2)은 1부터 (n2 - n1)까지의 합이 된다. // Solve & Output System.out.println((n2 - n1) * (n2 - n1 + 1) / 2);풀이 시간3분소스코드https://github.com/rogi-rogi/problem-solving/blob/main/baekjoon-online-judge/easy/09272.java problem-solving/baekjoon-online-judg..
-
[백준 23350] K 물류창고 [Java]
문제http://boj.ma/23350 23350번: K 물류창고 boj.ma 풀이문제 요약우선순위가 낮은 박스들을 무거운 순서대로 놓도록 박스를 돌려보내거나, 나머지 공간에 쌓았다가 다시 쌓는 비용을 계산하자.아이디어레일에 존재하는 박스 중 우선순위가 가장 낮은 박스먼저 쌓아야 한다.가장 낮은 우선순위가 아니라면 뒤로 보내자.현재 처리해야 하는 우선순위의 박스에 대해, 이미 쌓여있는 동일한 우선순위의 박스의 무게와 비교해 무거운 박스가 먼저 쌓이도록 가벼운 박드를 나머지 공간으로 이동 후 쌓아주자.1 ~ M의 우선순위에 대해 박스는 적어도 하나 존재하므로 별도의 예외 검증없이, 우선 순위 빈도만큼 박스를 쌓았다면, 다음 우선 순위는 현재 우선순위 - 1이 된다. private static int mov..
-
[백준 29891] 체크포인트 달리기 [Java]
문제http://boj.ma/29891 29891번: 체크포인트 달리기 boj.ma 풀이문제 요약주어진 N개의 체크포인트 중 한 번에 최대 K개씩 체크할 수 있을 때, 모두 왕복하기 위한 최소 이동 비용을 구하자.아이디어주어진 모든 체크포인트를 들러야하므로, 절댓값이 큰 체크포인트부터 K개의 체크포인트를 체크하며 왕복해, 전체 이동 비용을 낮춰야 한다.양수/음수는 따로 계산해야한다는 점에 유의하자. // Solve Arrays.sort(A); long sum = 0; for (int i = 0; i = 0 && A[i] > 0; i -= K) { sum += A[i]; } // Output System.out.println(sum * 2);풀이 시간10분소스코드https://github...
-
[백준 09440] 숫자 더하기 [Java]
문제http://boj.ma/9440 9440번: 숫자 더하기 boj.ma 풀이문제 요약N개의 수를 사용해 합이 최소인 두 수를 만들자.아이디어두 수의 합이 최소가 되기 위해서는, 주어진 수를 오름차순으로 정렬 후 번갈아 사용해 두 수를 만들면 된다.두 수의 큰 자릿수에 작은 수를 부여해야 두 수의 합이 작아지기 때문이다.N개의 수의 빈도를 구하고,0이 아닌 가장 작은 수를 두 수에 부여한 후,남은 수들을 번갈아가며 부여하면 된다.public class Main { private static int solve(int[] A, int N) { ... int[] nums = new int[2]; for (int idx = 0; idx 0) { ..
-
[백준 16927] 배열 돌리기 2 [Java]
문제http://boj.ma/16927 16927번: 배열 돌리기 2 boj.ma 풀이문제 요약배열을 반시계방향으로 R번 회전하자.아이디어R을 회전하려는 부분 배열의 전체 길이로 나눈 만큼만 회전해도 된다.어차피 제자리로 되돌아오기 때문이다. Max(N, M)개의 부분 배열에 대해 각각 회전을 해주자.처음 풀어보는 유형이라면 구현에 시간이 좀 걸린다. private static void rotate(int start, final int LEN) { int r = R % LEN; while (r-- > 0) { final int temp = board[start][start]; int x = start, y = start; int d = 0; while (d 풀이 시간40분소스코드http..
-
[백준 15927] 회문은 회문아니야!! [Java]
문제http://boj.ma/15927 15927번: 회문은 회문아니야!! boj.ma 풀이문제 요약문자열 S의 팰린드롬이 아닌 가장 긴 부분 문자열의 길이를 구하자.아이디어팰린드롬이 아닌 가장 긴 부분 문자열의 길이는 아래와 같이 구할 수 있다.S가 팰린드롬이고, 모두 동일한 문자라면, -1S가 팰린드롬이고, 모두 동일한 문자가 아니라면, N - 1S가 팰린드롬이 아니라면, Npublic class Main { private static int solve(char[] S) { boolean isPalindrome = true; for (int i = 0; i > 1); ++i) { if (S[i] != S[S.length - 1 - i]) { isPalindrome = false; b..
-
[백준 25046] 사각형 게임 (Small) [Java]
문제http://boj.ma/25046 풀이문제 요약민우가 행을 고르고, 진우가 열을 골랐을 때, 겹침 정도에 따라 자신의 점수로 만들 수 있다. 이 때 민우의 최대 점수를 구하자.아이디어격자판에는 음수가 존재할 수 있으며, 민우 다음에는 진우가 고르므로 최종 점수를 결정하는 것은 진우의 선택에 달려있다.때문에 진우가 최선의 선택을 하더라도, 가장 작은 점수를 가지도록 민우는 유도해야 한다.민우와 진우의 선택은 비트마스킹을 통해 표현하고, 둘의 선택이 겹친 경우에는 진우의 점수가 된다.민우의 선택 이후 진우의 선택에 대한 모든 최댓값 중 최솟값이 진우가 가지는 가장 작은 점수고, 전체 합과의 차는 민우가 가지는 최댓값이 된다. // Solve long resultOfJongjinMaxScore = L..
-
[백준 02643] 색종이 올려 놓기 [Java]
문제http://boj.ma/2643 2643번: 색종이 올려 놓기 boj.ma 풀이문제 요약N개의 직사각형 종이를 자신보다 크거나 같은 종이 위에만 쌓아 가장 높게 쌓을 때의 높이를 구하자.아이디어종이는 서로의 변에 대해 평행하게만 놓을 수 있으므로 (작은 변의 길이, 큰 변의 길이)를 기준으로 입력받고, 오름차순으로 정렬하자.public class Main { private static class Point { int x, y; public Point(int x, int y) { this.x = Math.min(x, y); this.y = Math.max(x, y); } } A.sort((a, b) -> { if (a.x == b.x) { return Integer.compar..
-
[백준 25918] 북극곰은 괄호를 찢어 [Java]
문제http://boj.ma/25918 25918번: 북극곰은 괄호를 찢어 boj.ma 풀이문제 요약괄호로 이루어진 문자열을 만들기 위해 몇 번에 걸쳐 O와 X를 놓아야 하는지 계산하자.아이디어O 또는 X는 결국 ‘( )’ 또는 ‘) (’가 된다. 즉 어떤 괄호에 대해 이전 괄호와 같지 않다면 한 번에 놓을 수 있다.스택에 괄호를 쌓으며, 가장 큰 스택의 크기를 출력하자. 만약 스택에 괄호가 남았다면 원하는 문자열을 만들 수 없으니 -1을 출력하자. // Solve List stack = new ArrayList(); int cnt = 0; for (char ch : S) { if (stack.isEmpty() || stack.get(stack.size() - 1) == ch) { sta..
-
블로그 게시글 커스텀 테스트 페이지
한 줄 입니다.한 줄 입니다.긴 글 입니다. 긴 글 입니다. 긴 글 입니다. 긴 글 입니다. 긴 글 입니다. 긴 글 입니다. 긴 글 입니다. 긴 글 입니다. 긴 글 입니다. 긴 글 입니다. 긴 글 입니다. 긴 글 입니다. 긴 글 입니다. 긴 글 입니다. 긴 글 입니다.한 줄 입니다. 한 줄 입니다. 왼쪽 영역 입니다.긴 글 입니다. 긴 글 입니다. 긴 글 입니다. 긴 글 입니다. 긴 글 입니다. 긴 글 입니다. 긴 글 입니다. 긴 글 입니다. 긴 글 입니다. 긴 글 입니다. 긴 글 입니다. 긴 글 입니다. 긴 글 입니다. 긴 글 입니다. 긴 글 입니다. 긴 글 입니다. 긴 글 입니다. 긴 글 입니다. 긴 글 입니다. 긴 글 입니다. 긴 글 입니다. 긴 글 입니다. 오른쪽 영역 입니다.긴 글 입니다. 긴 ..
-
[백준 03614] 정사각형 [Java]
문제http://boj.ma/3614 3614번: 정사각형 boj.ma 풀이문제 요약한 대각선이 지나는 정사각형의 개수 f(R)이 N인, 직사각형의 수를 구하자. 직사각형 a x b와 b x a는 동일한 직사각형으로 취급한다.http://boj.ma/2168 2168번: 타일 위의 대각선 boj.ma 의 확장 문제다.아이디어직사각형에서 f(R)을 구하는 공식은 f(R) = f(x, y) = x + y - GCD(x, y) = N이다.변의 길이가 최대 1e6인 직사각형 중 N이 될 수 있는 모든 직사각형을 완전 탐색으로 구한다면 시간 초과가 발생하므로, x, y의 탐색 범위를 정해야 한다.x, y는 G(=GCD(x, y))에 대해, Ga, Gb로 나타낼 수 있다. 이때 두 약수는 공통 약수가 1외에는 존재..
-
[백준 27941] 하이퍼 가지 따기 [Java]
문제http://boj.ma/27941 27941번: 하이퍼 가지 따기 boj.ma 풀이문제 요약11차원 큐브의 2048개 꼭짓점 중 누락된 한 꼭짓점의 좌표를 구하자.아이디어11차원 큐브의 각 꼭짓점 좌표는 해당 차원의 양 끝값인 L과 R중 하나의 값을 가진다.주어지는 입력에는 L과 R이 1024, 1023개로 어느 한 좌표가 한 개 부족하게 주어진다.따라서 2047개의 좌표의 각 차원에 대한 XOR연산을 수행한다면, 교환 법칙과 자기 자신과의 연산에 의해 결국 필요한 좌표를 얻을 수 있다. int line = 2047; while (line-- > 0) { st = new StringTokenizer(br.readLine()); for (int i = 0; i 풀이 시간10분소스코드http..
-
[백준 20165] 인내의 도미노 장인 호석 [Java]
문제http://boj.ma/20165 20165번: 인내의 도미노 장인 호석 boj.ma 풀이문제 요약주어진 보드에서 도미노를 넘어뜨리고 세우고를 반복했을 때, 몇 개의 도미노가 넘어졌었는지 출력하자.아이디어요구 사항을 되짚어보자.도미노를 넘어뜨리려는 위치에 이미 넘어져 있다면 아무 일도 일어나지 않는다.넘어뜨린 도미노의 번호 K에 대해 동일한 방향으로 K - 1개 넘어뜨릴 수 있으며, 이는 다음 도미노에 의해 갱신될 수 있다.넘어뜨린 도미노는 다시 세울 수 있다. 이 때 도미노 번호 K를 다시 복구해야 한다.넘어뜨린 도미노는 음수로 표현했으며, 현재 쓰러트린 도미노의 번호에 의해 쓰러트릴 수 있는 도미노의 최대 길이를 갱신해주면서 시뮬레이션을 반복하면 된다. private static int atta..
-
[백준 31926] 밤양갱 [Java]
문제http://boj.ma/31926 31926번: 밤양갱 boj.ma 풀이문제 요약N에 대해 비례하는 규칙적인 문자열을 만들기 위해, 주어진 방법을 몇 번 사용해야 하는지 구하자.아이디어첫 dalididalo를 만들기 위해서는 { d, a, l, d, i, dal, g, o } 총 8번, 마지막 daldian을 만들기 위해서는 { daldia, n } 총 2번이 필요하다.중간에 반복되는 dalididalo는 이전에 만들어진 부분 문자열을 활용해 만들 수 있다.이때 추가로 필요한 dalididalo는 log(N)에 비례한다. // Solve & Output System.out.println(8 + (31 - Integer.numberOfLeadingZeros(N)) + 2);풀이 시간10분소..
-
[백준 17433] 신비로운 수 [Java]
문제http://boj.ma/17433 17433번: 신비로운 수 boj.ma 풀이문제 요약N개의 정수를 M으로 나눈 나머지가 동일한 최대 M을 구하자.아이디어어떤 수 $a_{1}$, $a_{2}$를 M으로 나눈 나머지가 r로 같아야 한다. 이때 두 수의 차는 $(q_{2} - q_{1})*M$으로 M의 배수가 된다.N개의 수의 차들에 대해 가장 큰 GCD는, N개의 수의 차들에 대한 가장 큰 공통 약수가 된다.이는 N개의 모든 수를 나누었을 때 나머지가 전부 같아지는 최대 M이 된다. Arrays.sort(A); int[] diff = new int[N - 1]; for (int i = 0; i 풀이 시간20분소스코드https://github.com/rogi-rogi/problem-solvi..
-
[백준 22973] 점프 숨바꼭질 [Java]
문제http://boj.ma/22973 22973번: 점프 숨바꼭질 boj.ma 풀이문제 요약0에서 K까지, 이전에 점프한 거리의 2배씩 점프해서 도달하기 위한 최소 횟수를 구하자.아이디어처음에는 1 그 다음에는 2, 4, … 씩 점프 거리가 늘어나므로, 만약 K가 짝수라면 도달할 수 없다.K가 음수라면 양수로 변환하고, 주어진 조건대로 점프 거리를 늘려가며 현 위치가 K가 될 때 까지 점프하면 된다. private static int solve(long K) { if (K == 0) { return 0; } if (K % 2 == 0) { return -1; } int cnt = 1; for (long cur = 1, jump = 1; cur 풀이 시간5분소스코드problem-solv..
-
[백준 06591] 이항 쇼다운 [Java]
문제http://boj.ma/6591 6591번: 이항 쇼다운 boj.ma 풀이문제 요약여러개의 N, K에 대해 C(N, K)를 구하자.아이디어C(N, K)는 N! / K!(N-K)! 이므로 한 번에 계산하기보다는, 분모에 의해 소거될 분자를 고려해 남는 수만 계산하면 된다.C(N, K) = C(N, N - K)와 같으므로, 만약 K가 N의 절반보다 크다면 K를 작게 만들어 연산 횟수를 줄여주자. if (K > N / 2) { K = N - K; } long result = 1; for (int i = 0; i 풀이 시간10분소스코드https://github.com/rogi-rogi/problem-solving/blob/main/baekjoon-online-judge/easy/0659..
-
[백준 13414] 수강신청 [Java]
문제http://boj.ma/13414 13414번: 수강신청 boj.ma 풀이문제 요약수강 신청 버튼을 클릭한 기록 L개 중 문제의 조건에 맞게 최대 K명의 수강 신청을 처리하자.아이디어수강 신청 버튼을 처음에 누른 후 또 눌렀다면 순서가 밀려야 한다. Map을 이용해 학번과 버튼을 누른 순서를 저장하고, 이미 저장이 되있더라도 새로 버튼을 눌렀다면 순서만 업데이트해주자.Map은 순서가 보장되지 않으므로, 리스트에 담아준 후 버튼을 누른 순서를 기준으로 정렬 후 최대 K명을 뽑으면 된다. // Solve Map map = new HashMap(); for (int i = 0; i > list = new ArrayList(map.entrySet()); list.sort((a, b) -> a.get..
-
[백준 03024] 선분 덮기 [Java]
문제http://boj.ma/2024 2024번: 선분 덮기 boj.ma 풀이문제 요약구간 [0, M]을 덮기 위한 선분의 최소 갯수를 구하자아이디어구간 내 여러 선분들이 끊기지 않고, 구간을 전부 덮을 수 있는지 확인해야한다.구간에 포함되거나 걸치는 선분의 시작점과 끝점을 오름차순으로 정렬 후, 중첩된 선분을 만들어가면 된다.만약 구간이 끝나지 않았는데, 현재 선분에서 더 이상 확장할 수 없다면 구간을 덮을 수 없는 경우다. while (cur 풀이 시간20분소스코드https://github.com/rogi-rogi/problem-solving/blob/main/baekjoon-online-judge/normal/03024.java problem-solving/baekjoon-online-judge..
-
[백준 15922] 아우으 우아으이야!! [Java]
문제http://boj.ma/15922 15922번: 아우으 우아으이야!! boj.ma 풀이문제 요약수직선 위 모든 선분의 총 길이를 구하자.아이디어선분은 정렬된 데이터로 제공되며, 만약 새로운 선분의 시작이 이전 선분의 끝 좌표보다 크다면, 겹치지 않는 선분임이다. 끝 좌표이하라면 겹치는 선분이므로 하나의 선분으로 판단하면 된다.선분이 끊기거나, 마지막 선분인 경우에 선분의 길이를 결과에 합하면된다. if (x 풀이 시간10분소스코드https://github.com/rogi-rogi/problem-solving/blob/main/baekjoon-online-judge/normal/15922.java problem-solving/baekjoon-online-judge/normal/15922.java ..
-
[백준 21968] 선린의 터를 [Java]
문제http://boj.ma/21968 21968번: 선린의 터를 boj.ma 풀이문제 요약$3^K$꼴의 자연수가 최대 한 번씩 사용되어 만들어진 가장 작은 N번째 수를 구하자.아이디어모든 $3^K$에 대해 적절히 사용한다면, 3진수3진수로는 사실 모든 수를 표현할 수 있다. 입력받은 수를 표현하는 각 비트에 대해 3진수로 보고, 3진수 값을 구하면된다. // Solve long res = 0; long powerOf3 = 1; while (N > 0) { if ((N & 1) == 1) { res += powerOf3; } powerOf3 *= 3; N >>= 1; }풀이 시간10분소스코드https://github.com/rogi-rogi/problem-s..
-
[Java] JVM(Java Virtual Machine)에 대하여
이 글에서는 Java의 JVM(Java Virtual Machine)의 정의와 구성, 구체적인 동작 원리, 관련 지식에 대해 다룹니다.JVM란 무엇인가?JVM을 사용하는 이유JVM의 동작 원리JVM: Class Loader Sub-SystemJVM: Memory Area Of JVM - RDAMethod AreaHeap AreaThreadJVM: Execution Engine관련 지식마치며.1. JVM란 무엇인가?JVM(Java Virtual Machine)은 자바 바이트 코드를 실행하는 가상머신입니다.자바 애플리케이션이 다양한 플랫폼에서 실행될 수 있도록 하는 핵심 실행 엔진으로 다음과 같이 구성됩니다.Class Loader Sub-SystemMemory Area Of JVMExecution Engin..
-
[Java] Java개발의 시작, JDK(Java Development Kit)에 대하여
이 글에서는 Java 애플리케이션 개발의 필수 요소인 JDK(Java Development Kit)의 정의와 구성, 그리고 JDK를 중심으로 한 개발 지식까지 함께 다룹니다.JDK란 무엇인가?JDK를 사용하는 이유JDK의 자동 빌드 시스템기타 관련 지식마치며1. JDK란 무엇인가?JDK(Java Development Kit)는 자바 애플리케이션을 개발하고 실행하는 데 필요한 모든 것을 담은 개발 도구 모음입니다.JDK는 크게 두 가지 요소로 구성됩니다.JRE(Java Runtime Environment)JRE는 자바 애플리케이션이 실행될 수 있는 환경입니다.실행에 필요한 가상 머신(Java Virtual Machine)과 표준 API를 제공하는 핵심 라이브러리(Java Class Library)로 구성되..
-
[Java] 자바 실행 환경, JRE에 대하여
이 글에서는 Java 애플리케이션 실행을 위한 JRE(Java Runtime Environment)의 정의와 구성, 사용하는 이유에 대해 다룹니다.JRE란 무엇인가?JRE를 사용하는 이유마치며1. JRE란 무엇인가?JRE(Java Runtime Environment)는 자바 애플리케이션 실행을 위해 JVM, JCL을 제공하는 소프트웨어 계층입니다. JRE는 다음과 같이 구성되어 있습니다.JVM(Java Virtual Machine)자바 바이트코드를 실행하는 가상 머신입니다.다양한 플랫폼에서 독립적인 실행을 가능하게 하며, 프로그램 실행 흐름을 제어합니다.JCL(Java Class Library)자바 애플리케이션이 자주 사용하는 기능을 표준 API로 제공하는 라이브러리 모음입니다.ex) java.io, j..
-
[백준 27737] 버섯 농장 [Java]
문제http://boj.ma/27737 27737번: 버섯 농장 boj.ma 풀이문제 요약M개 이하의 버섯 포자를 심어 모든 빈 공간에 버섯이 자라도록 하자.아이디어독립된 빈 공간을 탐색하며 최소한의 버섯 포자를 사용했을 때, 모든 영역에 버섯이 자라도록 할 수 있는지 확인해야 한다. 버섯 포자를 최소 1개 이상 사용해야하며, 모든 영역을 채우기 위해 필요한 버섯 포자의 수가 M보다 크다면 불가능하다. // Solve int m = M; for (int i = 0; i 풀이 시간10분소스코드https://github.com/rogi-rogi/problem-solving/blob/main/baekjoon-online-judge/easy/27737.java problem-solving/baekjoo..
-
루팅 없이 갤럭시 카메라 셔터음 끄기
이 글에서는 루팅(Rooting) 없이 갤럭시 카메라 셔터음을 끄는 간단한 스크립트를 소개합니다. 이 글에서는 루팅(Rooting) 없이 갤럭시 카메라 셔터음을 끄는 간단한 스크립트를 소개하고, 그 개발 과정을 짧게 회고합니다. 조용한 카페나 도서관에서 예고 없이 터지는 '찰칵' 소리에 당황했던 경험, 없으신가요? 이런 사소한 불편함에서 출발해, 누구나 쉽게 셔터음을 끌 수 있는 PowerShell 스크립트를 직접 만들게 되었습니다.그래서, 어떻게 사용하나요?방법은 간단합니다.아래 GitHub 링크에서 프로젝트 파일을 다운로드합니다. (Code -> Download ZIP)스마트폰의 '개발자 옵션'에서 'USB 디버깅'을 활성화하고 PC와 연결합니다.다운로드한 폴더에서 자신의 운영체제에 맞는 스크립트 파..
-
[IntelliJ] 인텔리제이(IntelliJ)에서 서블릿(Servlet) 템플릿 생성하기
이 글은 IntelliJ에서 Servlet 프로젝트를 생성하는 과정을 안내합니다.1. IntelliJ에서는 Servlet 프로젝트가 없나요?아래 글에 따르면 IntelliJ IDEA는 2023.01 버전 이후로는 Servlet 프로젝트 기본 생성이 제거되었음을 알 수 있습니다.Cannot create servlet, web filter, web listener after 2023.1 update : IDEA-316701 Cannot create servlet, web filter, web listener after 2023.1 update : IDEA-316701 youtrack.jetbrains.com잘 사용되지 않기 때문에 제거되었다고 하네요. 2. Servlet 코드 템플릿 찾기 기본 생성은 제거되..
-
[백준 11497] 통나무 건너뛰기 [Java]
문제http://boj.ma/11497 11497번: 통나무 건너뛰기 boj.ma 풀이문제 요약N개의 통나무를 원형으로 놓았을 때 인접한 통나무의 최대 높이차가 최소가 되도록 배치하자.아이디어통나무를 단순히 정렬하면 1, N 번 통나무의 높이차로 인해, 좋은 배치가 될 수 없다.우선 오름차순으로 정렬 후, 작은 요소부터 0번 인덱스의 양 옆에 번갈아가며 배치하면 된다. 번갈아 가는 순서는 동일하게 반복만 된다면 왼쪽/오른쪽 중 아무 방향으로 먼저 놓아도 된다. // Solve Arrays.sort(A); int[] B = new int[N]; for (int i = 0; i 풀이 시간10분소스코드https://github.com/rogi-rogi/problem-solving/blob/mai..
-
[백준 04307] 개미 [Java]
문제http://boj.ma/4307 4307번: 개미 boj.ma 풀이문제 요약길이가 L인 막대기 위에 있는 개미들이 1씩 이동해 막대기 끝까지 이동하면 떨어질 때, 모든 개미가 땅으로 떨어질 때 까지 걸리는 최소/최대 시간을 구하자.아이디어문제에서 요구하는 것은 모든 개미가 땅으로 떨어지는 상황이다. 개미가 서로 만나면 방향을 바꾼다는 조건은 서로를 무시하고 지나쳐 간다로 봐도 된다. 즉 모든 개미에 대해 막대기에서 떨어지기까지 걸리는 최소/최대 시간을 구해 모든 개미가 떨어지기 위한 최소/최대 시간을 갱신하면 된다. // Solve min = Math.max(min, Math.min(a, L - a)); max = Math.max(max, Math.max(a, L - a));풀이 시..
-
[백준 33925] 쿠키런 [Java]
문제http://boj.ma/33925 33925번: 쿠키런 boj.ma 풀이문제 요약주어진 스테이지에서 정해진 횟수만큼 장애물을 피하며 최대 체력으로 스테이지를 클리어할 수 있는지 확인하자.아이디어어떤 장애물이든 부딪히면 K만큼 체력이 감소하므로, 슬라이드는 가능한 전부 하는 것이 최선이다. 낮은 장애물을 우선적으로 점프하고, 가능한 점프 횟수가 남았다면 높은 장애물을 점프하는 것이 최선이다.이를 위해 장애물의 빈도를 파악해야 하며, 높은 장애물을 점프하기 위해서는 점프를 두 번 해야 한다는 점에 유의하자 int needS = 0, needDoubleJ = 0, needJ = 0; for (char c : board[0]) { if (c == 'v') ++needS; } for (int..
-
[IntelliJ] 인텔리제이(Intellij)에서 JDK가 인식되지 않을 때 해결 방법
이 글에서는 Java 프로젝트를 인텔리제이(IntelliJ IDEA)에서 열 때 JDK를 찾을 수 없는 문제의 원인과 해결 방법을 다루겠습니다.1. 왜 JDK를 직접 설정해야 할까요?JDK를 직접 설정해야하는 이유는 다음과 같습니다.여러 버전의 JDK 설치로 인한 충돌: JDK 8, 11, 15등 여러 버전이 설치된 경우 프로젝트가 요구하는 JDK 버전과, IntelliJ IDEA에서 사용하는 기본 버전이 다를 수 있습니다.비표준 경로 설치: C:\Program Files\java와 같은 표준 경로가 아닌 다른 곳에 JDK를 설치하거나, JAVA_HOME 환경 변수 설정이 없다면 IntelliJ IDEA가 JDK의 경로를 찾지 못할 수 있습니다.프로젝트별 다른 버전 요구: 프로젝트가 요구하는 JDK 버전..
-
[IntelliJ] 인텔리제이(IntelliJ) 로그인 및 JetBrains 계정 연동
이 글에서는 IntelliJ IDEA에 JetBrains 계정 연동하는 방법에 대해 다루겠습니다. 1. 도움말 - 구독 관리 - 로그인에디터 창의 상단에서 '도움말' - '구독 관리'를 열어줍니다.'JetBrains 계정 로그인' 버튼을 눌러 로그인을 진행합니다. 2. 웹 브라우저에서 로그인웹 브라우저로 열린 새로운 페이지에서 자신의 JetBrains 계정으로 로그인을 진행합니다.3. 구독 활성화인증에 성공했다면 IntelliJ IDEA에서 활성화 가능한 구독이 추가된 것을 확인할 수 있습니다.활성화 버튼을 누르면 끝납니다!
-
[Git] Git 설치 및 초기 설정 가이드
이 글에서는 버전 관리 시스템인 Git의 설치 방법과, 설치 후 협업을 위해 필요한 사용자 정보의 초기 설정 과정에 대해 다루겠습니다.1. Git 설치 파일 다운로드먼저 공식 웹사이트에서 자신의 OS에 맞는 설치 파일을 다운로드 합니다.Git - Downloads Git - DownloadsDownloads macOS Windows Linux/Unix Older releases are available and the Git source repository is on GitHub. Latest source Release 2.51.0 Release Notes (2025-08-18) Download Source Code GUI Clients Git comes with built-in GUI tools (git..
-
[IntelliJ] Gemini 플러그인 설치 오류 해결 (버전 충돌, 채팅 창 입력 불가능)
오늘은 Google의 Gemini를 intelliJ에서 사용하기 위해 플러그인을 설치했지만, 오류로 인해 사용하지 못하는 문제를 해결하는 방법을 알려드리고자 합니다.플러그인 재설치 또는 Intellij IDE재시작과 캐시 무효화 이후에도 오류가 해결되지 않았다면, 플랫폼과의 버전 호환성 문제가 주 원인일 가능성이 높습니다. Intellij IDE의 버전 변경 없이 내 버전에 맞는 Gemini 플러그인을 설치하는 방법에 대해 알아보겠습니다. 1. 내 컴퓨터에 설치된 Intellij 버전 확인하기가장 먼저 현재 내 컴퓨터에 설치된 Inrellij IDE의 버전을 확인해야 합니다.IDE 상단 메뉴 → 도움말(Help) → 정보(About)로 이동해 Build 번호를 확인합니다.아래 사진처럼 Build #IU-..
-
[IntelliJ] 인텔리제이(IntelliJ) IDEA 설치 가이드
이 글에서는 Java나 Kotlin 개발을 시작하는 분들을 위해, JetBrains에서 개발한 통합 개발 환경(IDE) 'IntelliJ IDEA' 의 설치 과정에 대해 다루겠습니다.1. 버전 선택 (Community or Ultimate)인텔리제이 IDEA는 두 가지 에디션을 제공하므로, 본인에게 맞는 버전을 선택하는 것을 권장합니다.Community Edtion: 무료 버전입니다. Java, Kotlin, Android 개발 등 대부분 개발의 필수 기능이 포함되어 있어 학생 또는 개인 개발자가 시작하기에 충분합니다.Ultimate Edtion: 유료 버전입니다. 커뮤니티 에디션의 확장판으로 Spring, Jakarta EE와 같은 웹 프레임워크, 데이터베이스 연동 등 다양한 기술을 지원합니다. 30일..
-
[백준 16924] 십자가 찾기 [Java]
문제http://boj.ma/16924 16924번: 십자가 찾기 boj.ma 풀이문제 요약주어진 격자판이, 문제의 규칙대로 만들어지는 십자가에 의해서만 만들어질 수 있는지 알아보자.아이디어격자판의 크기가 작으므로 모든 위치에 대해 십자가가 만들어질 수 있는지 전부 확인하면 된다. 단 문제의 규칙대로만 만들어지는 십자가에 의해서만 만들어지는 경우에만 방문 표시를 해주자.모든 위치에 대한 확인이 끝난 후 ‘*’인데 방문 표시가 안되었다면 십자가만을 이용해서 격자판을 만들 수 없는 경우로 -1을 출력하자.필요한 십자가의 수가 0일 수 있으니, ‘*’이 존재하지 않는다면 0을 출력해야 한다. private static int isCross(int x, int y, int size) { for..
-
[백준 12026] BOJ 거리 [Java]
문제http://boj.ma/12026 12026번: BOJ 거리 boj.ma 풀이문제 요약문자 ‘B’, ‘O’, ‘J’로만 이루어진 문자열에서 규칙을 준수하며 문자열의 처음부터 끝까지 이동하기 위한 최소 비용을 계산하자.아이디어문자열의 길이가 최대 1e3이므로 $O(N^2)$으로 풀이할 수 있다.점화식은 다음과 같다.dp[i] : i번째 보도 블록에 이동하기 위한 최소 에너지 양(도달하지 못하면 -1)i - 1 ~ 0번 블록 중 i번 보도 블록으로 점프할 수 있다면, 이전 블록 + 거리의 제곱의 값과, dp[i]를 비교해 최솟값을 저장하면 된다. // Solve if (A[0] != 'B') { System.out.println(-1); ..
-
[백준 24725] 엠비티아이 [Java]
문제http://boj.ma/24725 풀이문제 요약NM 배열에서 상하좌우, 대각선의 여러 방향에서 만들어지는 MBTI의 총 개수를 구하자.아이디어배열의 모든 위치를 돌아보며 8개의 방향에 대해 MBTI가 만들어지는지 확인하면 된다. MBTI를 Map 또는 bool 배열로 만들어두어 문자를 쉽게 비교할 수 있다.import java.io.*;import java.util.*;public class Main { static int[] di = {-1, -1, 0, 1, 1, 1, 0, -1}; static int[] dj = {0, 1, 1, 1, 0, -1, -1, -1}; public static void main(String[] args) throws Exception { ...
-
[백준 19843] 수면 패턴 [Java]
문제http://boj.ma/19843 19843번: 수면 패턴 boj.ma 풀이문제 요약민티의 수면 기록이 주어졌을 때, 주말에 몇 시간을 더 자야 한 주에 T시간을 잘 수 있는지 구하자.아이디어잠든/일어난 요일이 다르다면, 두 요일의 차 * 24 시간과 두 시간의 차를 빼주자. 요일이 같다면 두 시간의 차만 빼면 된다.만약 모든 수면 기록이 48시간 보다 크다면 주말 내내 자도 부족하다. 평일에 이미 T보다 많이 잤다면, 주말에는 잠을 자지 않아야 한다 List days = List.of(new String[]{"Mon", "Tue", "Wed", "Thu", "Fri"}); while (N-- > 0) { st = new StringTokenizer(br..
-
[백준 23885] 비숍 투어 [Java]
문제http://boj.ma/23885 23885번: 비숍 투어 boj.ma 풀이문제 요약체스판에서 비숍의 출발/도착 위치가 주어졌을 때 이동 가능한 위치인지 확인하자.아이디어비숍의 좌표값의 합(x + y)을 2로 나눈 나머지가 일치하다면 비숍이 이동할 수 있는 장소다. 출발지와 도착지가 다른데, 체스판의 한쪽 면의 길이가 1이라면 이동 불가능하다는 점에 유의하자. if ((sX != eX || sY != eY) && (N == 1 || M == 1)) { System.out.println("NO"); } else { System.out.println((sX + sY) % 2 == (eX + eY) % 2 ? "YES" : "NO"); ..
-
[백준 33941] 잔돈 싫어 [Java]
문제http://boj.ma/33941 33941번: 잔돈 싫어 boj.ma 풀이문제 요약조건을 만족하는 환불 가능한 교통 카드의 금액의 최대 합이 500으로 나누어 떨어지도록 적절하게 선택해야 한다.아이디어500으로 나누어 떨어지는 최대 합을 구해야 하므로, 환불 가능한 교통 카드의 금액을 500으로 나눈 나머지와, 환불 비용 500원을 제외한 금액에 대한 배낭문제로 볼 수 있다.점화식은 다음과 같다.dp[n][i]: n번째 환불 가능한 카드들의 잔액 합을 500으로 나눈 나머지가 i가 되는 환불 금액의 최대 합n - 1번째 상태 까지만 필요하므로 다음과 같이 축약할 수 있다.dp[i]: 환불 가능한 카드들의 잔액 합을 500으로 나눈 나머지가 i가 되는 환불 금액의 최대 합 long[] ..
-
[백준 16567] 바이너리 왕국[Java]
문제http://boj.ma/16567 16567번: 바이너리 왕국 boj.ma 풀이문제 요약길이가 N인 타일을 깨끗하게 하기 위해, M번의 시련에서 flip 최소 횟수를 빠르게 구하자.아이디어N, M이 최대 1e6이므로 완전 탐색은 시간 초과가 발생한다. i번째 칸을 더럽히는 시련에 대해 flip의 최소 횟수를 빠르게 구해야 한다.한 번의 flip은 연속된 타일을 청소할 수 있으므로, i번째 칸을 더럽힐 때 양 옆이 더럽혀진 적 없다면 새로운 flip이 된다. 만약 한 칸이라도 더럽혀져 있다면 기존에 계산한 한 번의 flip으로 청소할 수 있다.주어진 타일이 더럽혀진 경우에도 미리 flip을 계산해야 한다. 현재 타일을 기준으로 이전 타일의 더럽혀진 유무에 따라 최소 flip 횟수를 증가시키자. ..
-
[백준 08911] 거북이 [Java]
문제http://boj.ma/8911 8911번: 거북이 boj.ma 풀이문제 요약거북이가 이동한 영역을 감싸는 가장 작은 직사각형의 면적을 구하자.아이디어주어진 명령대로 거북이를 이동시켜 가장 큰/작은 x, y값을 기록한 후 두 차를 통해 최소 직사각형의 면적을 구할 수 있다. for (char command : commands) { switch (command) { case 'F': x += dx[dir]; y += dy[dir]; break; case 'B': ..
-
[백준 10384] 팬그램 [Java]
문제http://boj.ma/10384 10384번: 팬그램 boj.ma 풀이문제 요약문자열에 모든 알파벳이 등장하는 최소 횟수를 구해 적절한 문구를 출력하자.아이디어알파벳에 대한 빈도를 모두 기록 후 최소 빈도를 찾으면 된다.import java.io.*;public class Main { private static final String[] MSG = { "Not a pangram\\n", "Pangram!\\n", "Double pangram!!\\n", "Triple pangram!!!\\n" }; public static void main(String[] args) throws Exception { . . . ..
-
[백준 01374] 강의실 [Java]
문제http://boj.ma/1374 1374번: 강의실 boj.ma 풀이문제 요약강의 N개의 시작, 종료 시간이 주어졌을 때 모든 강의를 진행하기 위해 필요한 최소 강의실을 수를 구하자.아이디어가장 일찍 끝나는 강의 다음으로 또 다른 강의를 시작할 수 있는 지에 따라 필요한 강의실의 수가 결정된다.우선 강의 정보를 (시작, 종료)를 기준으로 오름차순 정렬 해주자.최소힙에 강의 종료 시간을 차례대로 넣어주며, 가장 일찍 끝나는 강의 시간과, 다음 강의의 시작 시간을 비교하면 된다. 최소힙의 각 노드수는 만약 연강이 가능하다면 루트 노드가 갱신 될 것이며, 결국 최소힙의 노드 수는 강의실 수가 된다. // Solve Arrays.sort(lectures, (a, b) -> { ..
-
[백준 10158] 개미 [Java]
문제http://boj.ma/10158 10158번: 개미 boj.ma 풀이문제 요약벽에 닿으면 이동 방향이 반사되는 W*H 공간에서 (X, Y)에서 우상향 대각선 방향으로 출발해 T시간 후의 위치를 출력하자.아이디어벽에 닿으면 이동 방향이 반사되므로, X와 Y를 각각 계산하면 쉽게 구할 수 있다.X + T 즉, 처음 X로부터 T만큼 이동한 거리를 W로 나누었을 때의 나머지가 벽면으로부터 떨어진 최종 좌표값의 X이며, 이는 X + T를 W로 나누었을 때의 나머지에 따라 왼쪽 또는 오른쪽 벽면을 알 수 있다.Y또한 동일하게 구하면 된다. // Solve int nx = (X + T) % W; nx = ((X + T) / W) % 2 == 1 ? W - nx : nx; ..
-
[백준 28359] 수열의 가치 [Java]
문제http://boj.ma/28359 28359번: 수열의 가치 boj.ma 풀이문제 요약주어진 수열이 증가하지 않는 부분 수열(P), 감소하지 않는 부분 수열(C)가 되도록 재배열하여 주어진 규칙대로 수열의 가치가 최댓값을 가지도록 하자.아이디어예제의 경우 P = {1, 2, 2}, Q = {3, 2, 2} 로 구성되며, {2, 2}가 중복되어 최대 가치 12를 가진다.수열의 가치에 중복 계산하는 수를 제외한다면, 수열을 재배열 할 때 P 또는 Q는 1개의 요소로도 충분하므로 정렬을 수행할 수 있다.P 또는 Q는 부분 수열이므로, 중복 계산되는 수를 포함하는 것으로 충분하다.중복 계산되는 수는 빈도와 값의 곱이 큰 수로 결정해주자. // Solve Arrays.sort(A);..
-
[백준 25185] 카드 뽑기 [Java]
문제http://boj.ma/25185 25185번: 카드 뽑기 boj.ma 풀이문제 요약주어진 4장의 카드가, 3가지 휴식 조건 중 하나라도 만족하는지 확인하는 문제아이디어주어진 휴식 조건을 만족하는 메서드(isStraight, isTripleOrMore, isTwoPairOrFour)를 작성해 휴일인지 판별하면 된다.문제 난이도에 비해 구현이 많은 편이다. /** * 1. 적힌 알파벳이 같으면서 숫자가 연속되는 세 장이 존재한다. * 연속한 세 숫자는 서로 다른 숫자여야 한다. */ private static boolean isStraight(String[] cards) { Map> map = new HashMap(); for (Strin..
-
[백준 10546] 배부른 마라토너 [Java]
문제http://boj.ma/10546 10546번: 배부른 마라토너 boj.ma 풀이문제 요약N명의 참가자 이름과, N - 1명의 완주자 이름을 비교해 마라톤을 완주하지 못한 사람의 이름을 출력하자.아이디어참가자 이름이 중복되는 경우가 있다. Map에 동명이인의 수를 누적해 참가자를 세주고, N - 1명의 완주자 만큼 값을 빼고나면 최종적으로 Map에는 미완주자만 남는다. for (int i = 0; i cur + 1); } for (int i = 1; i cur - 1 == 0 ? null : cur - 1); }풀이시간10분소스코드https://github.com/rogi-rogi/problem-solving/blob/..
-
[백준 33957] Golden Section Search [Java]
문제http://boj.ma/33957 33957번: Golden Section Search boj.ma 풀이문제 요약연속된 부분 수열의 하한/상한 난이도를 적절이 선택해 합이 동일한 두 그룹을 최대한 몇 개 만들 수 있는지 알아내자.아이디어N은 1e5로 완전 탐색은 불가능하다. 선형 탐색을 하며 부분합을 이용해 두 그룹의 하한/상한을 변경해가며 두 그룹의 범위가 겹치는지 확인하자. // Solve long part1_LSum = 0; long part1_RSum = 0; int cnt = 0; for (int i = 0; i 풀이시간20분소스코드https://github.com/rogi-rogi/problem-solving/blob/main..
-
[백준 01635] 1 또는 -1 [Java]
문제http://boj.ma/1635 1635번: 1 또는 -1 boj.ma 풀이문제 요약1 또는 -1로 이루어진 수열 A의 요소들과 차례로 곱할 또 다른 수열 B만들고, 합한 결과가 0이 되도록 하는 수열 B를 구하자.아이디어수열 A의 합이 0이라면 B는 1로만 이루어진 수열로 충분하다.만약 0이 아니라면, 그 수의 절반만큼 -1로 채워야 한다. 수열의 부분합이 0이 아닌 전체 합의 절반이 되는 지점을 찾아서 1로 채우고, 나머지는 -1로 채워주자. // Solve final int sum = Arrays.stream(A).sum(); if (sum == 0) { sb.append("1 ".repeat(Math.max..
-
[백준 10736] XOR삼형제 2 [Java]
문제http://boj.ma/10736 10736번: XOR삼형제 2 boj.ma 풀이문제 요약1 ~ N 중 임의의 3개의 수들의 XOR 연산 결과가 0이 되지 않도록 하는 최장 부분 수열을 구하자.아이디어임의의 3개의 수 A, B, C의 XOR 연산 결과가 0이 되지 않기 위해서는 A ^ B = C인 경우가 없어야 한다.0이 되는 상황을 위해서는 단 1개의 비트라도 1이면 된다. 문제를 쉽게 보기 위해, 최상위 비트가 1이 되도록 해보자.K는 $floor(log_2{N})$이라 할 때, $2^{K-1}$~ $2^K$ - 1 중 임의의 두 수의 XOR 연산은 최상위 비트가 사라지며, $2^{K - 1}$보다 항상 작다.$2^{K}$이상 $min(N, 2^{K} + 2^{K - 1} - 1)$인 두 수의 ..
-
[Code Tree] 배낭 채우기 [Python]
문제https://www.codetree.ai/ko/trails/complete/curated-cards/challenge-knapsack/description 배낭 채우기 설명 | 코드트리배낭 채우기를 풀며 문제 구성과 난이도를 파악해 적절한 알고리즘을 선정해보세요. 효율적인 코드 작성을 목표로 합니다.www.codetree.ai 풀이문제 요약N개의 보석 중 무게가 M이 넘지 않도록 적절히 골라 최대 값어치를 만드는 냅색 문제다.아이디어대표적인 냅색 문제다. N개의 보석에 대해 최대 무게 M ~ 현재 보석의 무게 W[i]에 대한 최댓값을 구해주자.for i in range(N): for m in range(M, w[i] - 1, -1): dp[m] = max(dp[m], dp[m - ..
-
[백준 22965] k개의 부분 배열 [Java]
문제http://boj.ma/22965 22965번: k개의 부분 배열 boj.ma 풀이문제 요약N개의 요소로 이루어진 배열 A를 K조각으로 나누어 정렬하기 위한 최소 K를 구하는 문제다.아이디어배열 A를 K조각으로 나누는 연산을 원하는 만큼 적용할 수 있다. 따라서 K는 최대 3이다.이제 K의 최소를 구해보자.오름차순으로 정렬된 경우: K = 1오름차순으로 정렬된 두 그룹에 대해, 한 그룹의 요소가 다른 그룹의 요소 중 가장 작은 값 보다 작은 경우: K = 2그 외: K = 3 // Solve int k = 1; boolean flag = true; for (int i = 1; i = 2 && A[i] > A[0]) { fl..
-
[백준 01612] 가지고 노는 1 [Java]
문제https://boj.ma/1612 1612번: 가지고 노는 1 boj.ma 풀이문제 요약주어진 N의 배수 중 1로만 이루어진 자연수의 길이를 출력하자. 만약 없다면 -1을 출력하자.아이디어N이 2 또는 5로 나누어 떨어진다면, 1로만 이루어진 자연수(=N*K)는 존재하지 않는다.따라서 N으로 나누어 떨어지는 NK를 찾으면 된다. NK가 너무 커질 수 있으니, N으로 나눈 나머지를 이용하자. private static int solve(int N) { if (N % 2 == 0 || N % 5 == 0) { return -1; } int likeNum = 0; int cnt = 0; do { l..
-
[백준 11947] 이런 반전이 [Java]
문제http://boj.ma/11947 11947번: 이런 반전이 boj.ma 풀이문제 요약두 수의 곱이 최대가 되도록 1 ~ N에 대해 “사랑스러운 N”을 적절히 구성해 출력하자.아이디어두 수가 4999…, 5000… 일 때 곱이 최대가 된다. 4999… 형태의 수를 “goodNum”이라 하자. N에 대한 goodNum이 N 이하라면, goodNum*(goodNum + 1)이 정답이 된다.만약 N이 goodNum보다 작다면, “사랑스러운 N”을 구한 후 N과 곱한 값을 출력하면 된다. // Solve long goodNum = 5 * (long) Math.pow(10, strN.length() - 1) - 1; if (N >= goodNum) ..
-
[백준 15311] 약 팔기 [Java]
문제http://boj.ma/15311 15311번: 약 팔기 boj.ma 풀이문제 요약길이가 최대 2,000인 수열의 연속된 부분 수열의 합으로 최대 1부터 N까지의 모든 수를 나타내야 한다.아이디어구성되는 수열이 꼭 최소일 필요가 없다. 또한 연속된 부분 수열로 1부터 100만 까지 표현해야 한다.동일한 수로 구성되지 않는다면 수의 위치에 따라 표현할 수 있는 수가 제한받는다.K는 최대 2000이며, 100만은 1,000*1,000으로 표현할 수 있다. 1000 단위보다 작은 수는 999개의 1로 표현할 수 있다.따라서 999개의 1과, 1,000개의 1,000으로 모든 수를 표현할 수 있다. // Solve int[] res = new int[1999]; Arr..
-
[백준 04446] ROT13 [Java]
문제http://boj.ma/4446 4446번: ROT13 boj.ma 풀이문제요약주어진 문장 중 알파벳에 대해 규칙대로 변환하자.아이디어주어진 규칙을 구현하면 된다. 대문자/소문자도 처리할 수 있어야 하며, 알파벳이 아니라면 변환없이 넘어가면 된다. if (!Character.isLetter(chr)) { sb.append(chr); continue; } boolean isUpper = Character.isUpperCase(chr); char lowerChr = Character.toLowerCase(chr); ..
-
[백준 30679] 별 가두기 [Java]
문제http://boj.ma/30679 30679번: 별 가두기 boj.ma 풀이문제 요약첫 번째 열에서 오른쪽으로 진입했을 때, 격자 밖으로 별이 나오지 않고, 무한하게 이동할 수 있는지 판단해야 한다.아이디어별이 이동 중 이미 방문한 곳에 도착했다 하더라도, 무한하게 이동할 수 있는지는 보증할 수 없다. 이미 방문한 곳의 좌표와, 방문할 때의 진입 방향이 모두 같아야 무한하게 이동하고 있음을 판단할 수 있다. private static boolean dfs(int x, int y, int d, boolean[][][] visited) { if (isValid(x, y)) { if (!visited[x][y][d]) { visited[x]..