분자(numerator)와 분모(denominator)라는 두 개의 숫자가 있고, 이 두 수가 분자 / 분모 형태의 유리수를 나타낸다고 가정해 봅시다. 이 유리수를 소수(decimal) 문자열 형태로 변환해야 하며, 만약 순환하는 자릿수(반복되는 숫자)가 있다면 해당 부분을 괄호로 묶어서 표시해야 합니다.예를 들어, 분자 = 164, 분모 = 3이 입력으로 주어지면 출력은 54.(6)이 됩니다. 즉, 164 ÷ 3 = 54.6666...이므로 무한히 반복되는 6을 괄호로 감싸 표현하는 것입니다.해결 접근 방법이 문제는 실제 나눗셈(
문제 이해하기두 개의 문자열 S와 T가 주어졌을 때, S를 T로 변환하는 가장 짧은 연산 시퀀스를 찾아야 합니다. 여기서 허용되는 연산은 다음 두 가지입니다.삭제(-): 문자열에서 문자 하나를 제거합니다.삽입(+): 문자열에 새로운 문자 하나를 추가합니다.예를 들어 입력이 S = xxxy, T = xxyy라면 출력은 [x, x, -x, y, +y]가 됩니다. 이는 처음 두 개의 x를 그대로 유지하고, 세 번째 x를 삭제한 뒤, y를 유지하고 마지막에 새로운 y를 추가한다는 의미입니다.접근 방법: 동적 계획법(DP)이 문제는 메모이제
문제 개요단어 목록이 주어져 있다고 가정해 봅시다. 두 명의 플레이어가 참여하는 고스트(Ghost) 게임을 생각해 보겠습니다. 이 게임의 규칙은 다음과 같습니다.두 플레이어는 번갈아 가며 문자열 끝에 글자를 하나씩 추가합니다.만들어지는 문자열은 항상 단어 목록에 있는 어떤 단어의 유효한 접두사(prefix)여야 합니다.목록 속 단어 하나를 완성해서 말하게 된 플레이어가 패배합니다.양쪽 플레이어 모두 최적의 전략으로 플레이한다고 할 때, 첫 번째 플레이어가 승리할 수 있는지 확인해야 합니다.예를 들어 입력이 words = ["
문제 개요 무방향 그래프의 간선 목록이 주어져 있다고 가정해 보겠습니다. 각 간선은 [u, v, w] 형태로 표현되며, 여기서 u는 출발 정점, v는 도착 정점, w는 해당 간선의 가중치를 의미합니다. 이와 함께 동일한 형식 [u, v, w]를 가지는 쿼리 목록도 주어집니다. 각 쿼리는 정점 u에서 정점 v로 가는 경로가 존재하며, 경로에 포함된 모든 간선의 가중치가 w 이하인 경우가 있는가?라는 질문을 나타냅니다. 우리의 목표는 이러한 쿼리 중 참(true)인 것의 개수를 구하는 것입니다. 예를 들어 입력이 다음과 같다고 합시다.
문제 개요 [시작, 끝] 형태의 구간 리스트가 주어진다고 가정해 보겠습니다. 각 구간은 걸고 싶은 배너의 시작 지점과 끝 지점을 나타냅니다. 배너를 걸기 위해서는 최소 한 개의 핀이 필요하며, 하나의 핀으로 여러 개의 배너를 동시에 걸 수도 있습니다. 이때 구해야 할 것은 모든 배너를 걸기 위해 필요한 최소 핀 개수입니다. 예를 들어 입력이 [[2, 5], [5, 6], [8, 10], [10, 13]]이라면 결과는 2입니다. 위치 5와 위치 10에 두 개의 핀을 두면 네 개의 배너를 모두 걸 수 있기 때문입니다. 접근 방법 이
문제 소개숫자로만 구성된 문자열이 하나 주어져 있다고 가정해 보겠습니다. 이 문자열을 재구성하여 만들 수 있는 모든 유효한 IP 주소 조합을 찾아야 합니다. 여기서 유효한 IP 주소란 정확히 네 개의 정수(각 정수는 0부터 255 사이의 값)가 마침표(.)로 구분되어 있는 형태를 의미합니다.예를 들어 입력이 ip = 25525511136라면, 출력은 다음과 같습니다.[255.255.11.136, 255.255.111.36]해결 접근 방법이 문제는 백트래킹(backtracking) 기법을 활용하면 효율적으로 해결할 수 있습니다. 알고
문제 개요 숫자 목록 jobs와 정수 k가 주어졌다고 가정해 보겠습니다. 우리는 모든 작업을 정확히 k일에 걸쳐 완료해야 합니다. 작업은 반드시 주어진 순서대로 수행해야 하며, 각 날에는 하나 이상의 연속된 작업을 처리해야 합니다. i번째 작업의 난이도는 jobs[i]에 저장되어 있고, 특정 하루의 난이도는 그날 수행한 작업 중 가장 높은 난이도로 정의됩니다. 따라서 우리가 구해야 하는 것은 k일에 걸쳐 모든 작업을 수행할 때의 난이도 총합의 최솟값입니다. 입력 예시 예를 들어 입력이 jobs = [2, 3, 4, 6, 3], k
문제 소개 단어 목록과 고정 너비 k가 주어졌을 때, 각 줄이 정확히 k개의 문자를 포함하도록 텍스트를 배치하고 완전히 양쪽 정렬(full justify)된 결과를 만들어야 합니다. 한 줄에는 들어갈 수 있는 만큼 최대한 많은 단어를 담고, 남는 자리는 추가 공백( )으로 채워 모든 줄의 길이를 k자로 맞춥니다. 단어 사이의 여분 공백은 최대한 균등하게 분배해야 합니다. 공백 수를 단어 사이에 균등하게 나눌 수 없는 경우에는 왼쪽 빈 슬롯이 오른쪽 슬롯보다 더 많은 공백을 할당받습니다. 마지막 줄은 왼쪽 정렬을 하며, 단어 사이에
문제 개요 숫자로 이루어진 리스트 nums와 정수 k가 주어집니다. 이때 서로 겹치지 않으면서 비어 있지 않은 k개의 부분 리스트(연속된 구간)를 선택하여, 각 부분 리스트 합의 총합이 최대가 되도록 만들어야 합니다. 단, k는 nums의 크기보다 작거나 같다고 가정합니다. 예를 들어 입력이 nums = [11, -1, 2, 1, 6, -24, 11, -9, 6]이고 k = 3이라면 출력은 36이 됩니다. [11, -1, 2, 1, 6], [11], [6] 세 구간을 선택하면 각각의 합이 19, 11, 6이 되어 총합 36을 얻을
문제 개요 숫자로 이루어진 목록 nums와 정수 k가 주어졌을 때, nums를 각 부분집합의 원소 합이 모두 동일해지도록 k개의 서로 다른 부분집합으로 나눌 수 있는지 판별하는 프로그램을 만들어 보겠습니다. 예를 들어 입력이 nums = [4, 2, 6, 5, 1, 6, 3], k = 3이라면 결과는 참(True)입니다. 전체 합이 27이므로 각 부분집합의 합은 9가 되어야 하는데, 실제로 [6, 3], [6, 2, 1], [4, 5]처럼 분할하면 세 부분집합 모두 합이 9로 같습니다. 풀이 접근: 백트래킹(DFS) 이 문제는 대표
숫자 목록 nums가 주어졌을 때, 원소들을 두 집합으로 나누어 각 집합의 합이 서로 같아지도록 만들고, 그중 합이 가장 큰 경우의 값을 구하는 문제입니다.예를 들어 입력이 nums = [2, 5, 4, 6]이라면 결과는 6이 됩니다. [2, 4]와 [6]이라는 두 집합의 합이 모두 6으로 동일하기 때문입니다.알고리즘 접근 방식이 문제는 동적 계획법(Dynamic Programming)으로 해결할 수 있습니다. 핵심 아이디어는 두 집합의 합 차이를 DP 테이블의 인덱스로 활용하는 것입니다. 배열의 중심을 전체 합(sum)으로 잡으면
문자열 s가 주어졌을 때, 자기 자신을 제외하고 s의 접두사이면서 동시에 접미사가 되는 가장 긴 부분 문자열을 찾는 문제입니다. 만약 그러한 접두사가 존재하지 않는다면 빈 문자열을 반환하면 됩니다.예를 들어 입력 문자열이 madam이라면 결과는 m입니다. madam에는 자기 자신을 제외한 4개의 접두사(m, ma, mad, mada)와 4개의 접미사(m, am, dam, adam)가 있으며, 이 중 접두사이면서 접미사이기도 한 가장 긴 문자열은 m이기 때문입니다.해결 접근 방식이 문제는 KMP 알고리즘에서 사용되는 LPS(Longe
서로 겹칠 수 있는 닫힌 구간(closed interval)들의 목록이 주어져 있다고 가정해 봅시다. 여기서 구간 하나를 삭제한 후, 나머지 구간들을 모두 병합하고, 마지막으로 남은 구간의 개수를 센다는 연산을 생각할 수 있습니다. 우리가 구해야 하는 값은 바로 이 삭제 과정에서 얻을 수 있는 남은 구간 개수의 최댓값입니다. 예를 들어 입력이 intervals = [[5, 8], [6, 7], [7, 10], [9, 11]]이라면 출력은 2입니다. 그 이유는 다음과 같습니다. [5, 8]을 삭제하면 병합 결과는 [6, 11]이
문제 소개어떤 수 n이 주어졌을 때, 자릿수를 재배열하여 만들 수 있는 숫자 중 현재 값보다 바로 다음으로 큰 순열을 구하는 프로그램을 작성해야 합니다. 만약 n이 이미 내림차순으로 배치된, 즉 가장 큰 순열이라면 다시 가장 작은 순열(오름차순)로 되돌려 순환시킵니다.예를 들어 입력이 n = 319라면, 자릿수 {3, 1, 9}로 만들 수 있는 조합 중 319 다음으로 큰 수는 391이므로 출력은 391이 됩니다.해결 전략이 문제는 널리 알려진 다음 순열(Next Permutation) 알고리즘을 응용하여 해결할 수 있으며, 세 가
숫자 n이 하나 주어집니다. 우리는 다음 세 가지 연산 중 하나를 자유롭게 선택해 수행할 수 있습니다.n에서 1을 뺀다.n이 짝수라면 n / 2만큼 뺀다.n이 3으로 나누어 떨어지면 2 * (n / 3)만큼 뺀다.최종 목표는 위 연산들을 반복 적용하여 n을 0으로 만들 때 필요한 최소 연산 횟수를 구하는 것입니다.예를 들어 입력이 n = 16이라면 출력은 5가 됩니다. 16은 짝수이므로 n/2씩 네 번 감소시켜 1을 만들고, 마지막으로 1을 빼서 0이 되기 때문입니다. 따라서 총 5번의 연산이 필요합니다.접근 방법이 문제는 단순히
두 개의 리스트 sales와 buyers가 주어졌다고 가정해 보겠습니다. sales의 각 요소는 [day, price] 형태의 두 값으로 구성되며, 해당 패키지가 지정된 날에만 특정 가격으로 판매된다는 의미입니다. buyers의 각 요소는 [payday, amount] 형태로, 해당 구매자가 payday 당일부터 amount만큼의 금액을 사용할 수 있음을 나타냅니다. 각 구매자는 최대 한 개의 패키지만 구매할 수 있고, 각 패키지 역시 한 명에게만 판매될 수 있습니다. 이 조건에서 성사될 수 있는 거래, 즉 판매될 수 있는 패키지의
문제 개요 패턴 p와 문자열 str이 주어졌을 때, str이 해당 패턴을 정확히 따르는지 확인하는 프로그램을 만들어 보겠습니다. 여기서 패턴을 따른다는 것은 패턴의 각 문자와 문자열 내 비어 있지 않은 단어 사이에 전단사(bijection), 즉 일대일 대응 관계가 성립한다는 의미입니다. 예를 들어 패턴이 cbbc이고 문자열이 word pattern pattern word라면 결과는 True(1)입니다. 첫 번째 문자 c는 word에, 두 번째 문자 b는 pattern에 각각 일관되게 대응되기 때문입니다. 해결 전략 핵심 아이디어는
이 문제에서는 N개의 정수로 이루어진 배열 arr[]과 정수 m이 주어지며, 배열의 최댓값에 접근할 때마다 해당 값이 1씩 감소한다는 조건 하에 최댓값들의 합을 구하는 프로그램을 작성해야 합니다. 문제 설명 배열에서 최댓값을 하나씩 꺼내 합계에 더하고, 꺼낸 값은 1만큼 감소시켜 다시 배열에 넣는 작업을 총 m번 반복했을 때 얻을 수 있는 최댓값들의 합(maxSum)을 구하는 것이 목표입니다. 예제로 이해하기 입력 arr[] = {3, 6, 7, 8, 8}, m = 3 출력 23 풀이 과정 1번째 반복: 갱신 전 배열 = {3
문제 이해원형으로 배치된 노드의 개수를 나타내는 숫자 n이 주어진다고 가정해 봅시다. 우리가 구해야 하는 것은 모든 노드가 간선으로 연결되면서, 간선들이 서로 교차하지 않도록 n/2개의 간선을 배치하는 방법의 수입니다. 답이 매우 커질 수 있으므로 최종 결과는 10^9 + 7로 나눈 나머지를 반환해야 합니다.예를 들어 입력이 n = 4라면 출력은 2가 됩니다. 4개의 노드를 서로 교차하지 않게 두 쌍으로 묶는 방식은 정확히 두 가지이기 때문입니다.접근 방법이 문제는 동적 계획법(Dynamic Programming)을 활용해 효율적으
이 문제에서는 n개의 정수로 이루어진 배열 arr[]과 각각 정수 k를 담고 있는 Q개의 쿼리가 주어집니다. 우리의 목표는 배열 접미사(Suffix) 구간에 존재하는 고유한 정수의 개수를 구하는 쿼리를 처리하는 프로그램을 작성하는 것입니다. 문제 설명 각 쿼리마다 인덱스 k부터 n까지, 즉 arr[k]부터 arr[n]까지 범위 안에 포함된 서로 다른 원소(고유한 값)의 개수를 찾아야 합니다. 배열은 1부터 시작하는 인덱스(1-indexed)를 사용합니다. 예제로 문제 이해하기 입력 arr[] = {5, 1, 2, 1, 6, 5},