두 개의 숫자 리스트 L1과 L2가 있다고 가정해 보겠습니다. 각 리스트의 길이는 n이며, 모든 값은 자신이 속한 리스트 안에서 유일하고, 값의 범위는 1부터 n까지입니다. 이때 L1을 L2로 변환하는 데 필요한 인접 요소 교환(swap)의 최소 횟수를 구해야 합니다.예를 들어 입력이 L1 = [0, 1, 2, 3], L2 = [2, 0, 1, 3]이라면 출력은 2가 됩니다. 먼저 1과 2를 교환하면 L1은 [0, 2, 1, 3]이 되고, 이어서 0과 2를 교환하면 [2, 0, 1, 3]이 되어 L2와 같아지기 때문입니다.문제 해결
문제 개요정렬된 숫자 리스트 days가 주어진다고 가정해 봅시다. 이 리스트는 버스를 반드시 타야 하는 날짜들을 의미합니다. 우리는 이 모든 날에 걸쳐 여행할 때 드는 최소 비용을 구해야 합니다.버스 승차권은 다음 세 가지 종류가 있습니다.1일권: 2달러7일권: 7달러30일권: 25달러예를 들어 입력이 days = [1, 3, 5, 6, 28]이라면 출력은 9가 됩니다. 처음에 7일권을 구매하고, 29일째 되는 날 1일권을 하나 추가로 구매하면 총 9달러로 모든 여행 일정을 커버할 수 있기 때문입니다.풀이 접근 방식: 동적 계획법(
문제 정의문자열 s에 "and"와 "or" 연산자로 구성된 부울 표현식이 담겨 있다고 가정해 보겠습니다. 이 표현식을 평가하여 그 결과를 반환하는 것이 목표입니다. 단, 표현식에는 괄호가 포함될 수 있으며, 괄호 안의 식은 항상 가장 먼저 계산해야 한다는 점에 유의해야 합니다.예를 들어 입력이 s = "T and (F or T)"라면, 괄호 안의 "F or T"가 먼저 참으로 평가되고, 이어서 "T and True"가 계산되어 최종 출력은 Tr
숫자로 이루어진 리스트 candies가 주어지고, 두 친구가 캔디 제거 게임을 한다고 가정해 보겠습니다. 각 라운드마다 플레이어는 값이 같은 인접한 두 개의 캔디를 제거할 수 있습니다. 그리고 더 이상 제거할 캔디가 없는 플레이어가 지며, player1이 먼저 시작합니다. 우리가 확인해야 할 것은 player1이 최종적으로 승리하는지 여부입니다.예를 들어 입력이 nums = [2, 2, 5]라면 결과는 True가 됩니다. player1이 먼저 연속된 두 개의 2를 제거하면 상대방에게는 캔디 5 하나만 남기 때문에, 상대방은 어떤 캔
로마 숫자가 주어졌을 때 이를 정수로 변환해야 하는 경우가 있습니다. 로마 숫자는 일반적으로 왼쪽에서 오른쪽으로 큰 값부터 작은 값 순서로 기호를 배치하며, 유일한 예외는 어떤 기호보다 1 작은 값을 나타낼 때입니다. 주요 로마 숫자 기호와 그 의미는 다음과 같습니다.M: 1000D: 500C: 100L: 50X: 10V: 5I: 1예를 들어 입력이 MCLXVI라면 출력은 1166이 됩니다. M = 1000, C = 100으로 합계는 1100이 되고, 여기에 L = 50, X = 10, VI = 6을 더하면 총 1166이 됩니다.문
각 항목이 [시작(start), 끝(end)] 두 개의 값으로 구성된 상자 리스트가 있다고 가정해 봅시다(단, start < end). 한 상자의 끝값과 다른 상자의 시작값이 같다면 두 상자를 연결할 수 있습니다. 이때 우리가 구해야 할 것은 이렇게 연결하여 만들 수 있는 가장 긴 상자 체인의 길이입니다.예를 들어 입력이 다음과 같다고 해보겠습니다.blocks = [[4, 5], [5, 6], [4, 8], [1, 2], [2, 4]]이 경우 출력은 4가 됩니다. [1, 2] → [2, 4] → [4, 5] → [5, 6] 순서로
[시작 시간, 종료 시간] 형태의 구간(interval) 리스트가 주어졌을 때, 각 구간은 하나의 강의(코스)의 시작 시간과 종료 시간을 나타냅니다. 이때 동시에 한 과목만 수강할 수 있고, 다음 강의의 시작 시간은 반드시 이전 강의의 종료 시간보다 늦어야 한다는 조건에서, 수강할 수 있는 최대 강의 수를 구하는 문제입니다.예를 들어 입력이 times = [[3, 6], [6, 9], [7, 8], [9, 11]]이라면, [3, 6], [7, 8], [9, 11] 세 개의 강의를 차례로 수강할 수 있으므로 결과값은 3이 됩니다.해결
이진 행렬(binary matrix)이 하나 있다고 가정해 보겠습니다. 우리는 주어진 행렬에서 원하는 만큼의 열을 선택하고, 해당 열에 속한 모든 셀의 값을 뒤집을(flip) 수 있습니다. 여기서 셀을 뒤집는다는 것은 셀의 값을 반전시키는 것, 즉 0을 1로, 1을 0으로 바꾸는 것을 의미합니다.목표는 몇 번의 열 뒤집기를 수행한 후, 모든 값이 동일한 행의 최대 개수를 찾는 것입니다.예를 들어 다음과 같은 행렬이 있다고 해봅시다.000001110이 경우 출력 결과는 2입니다. 앞의 두 열을 뒤집으면 두 번째와 세 번째 행이 각각
문제 개요문자열 리스트 words가 주어졌을 때, 리스트의 부분 수열을 골라 이어 붙여 하나의 문자열을 만든다고 가정해 봅시다. 이때 최종 문자열에는 동일한 문자가 두 번 이상 나타나서는 안 되며, 즉 모든 문자가 고유해야 합니다. 우리가 구해야 하는 값은 이러한 조건을 만족하는 연결 문자열 중 가장 긴 것의 길이입니다.예를 들어 입력이 words = ["xyz", "xyw", "wab", "cde"]라면 정답은 9입니다. "xyz", &quo
문제 개요숫자로 이루어진 리스트 nums가 주어졌다고 가정해 보겠습니다. 우리가 구해야 할 것은 리스트 안의 모든 숫자 쌍을 이어 붙인(concatenation) 값들의 총합입니다. 이때 쌍 (i, j)와 쌍 (j, i)는 순서가 다르므로 서로 다른 조합으로 간주합니다.예를 들어 입력이 nums = [5, 3]이라면 결과는 176이 됩니다. 만들 수 있는 모든 연결 조합은 다음과 같습니다.(nums[0], nums[0]) → 5와 5를 이어붙임 → 55(nums[0], nums[1]) → 5와 3을 이어붙임 → 53(nums[1],
문제 소개2차원 행렬이 하나 있다고 가정해 보겠습니다. 여기서 matrix[r, c]는 도시에 있는 각 콘도미니엄(건물)의 높이를 나타냅니다. 동서 방향의 스카이라인은 행렬에서 각 행(row)의 최댓값을 구하면 확인할 수 있고, 남북 방향의 스카이라인은 각 열(column)의 최댓값을 구하면 확인할 수 있습니다. 이 문제의 목표는 동서·남북 스카이라인을 그대로 유지한 상태에서, 각 건물의 높이를 가능한 최대치까지 끌어올린 새로운 행렬을 찾는 것입니다.예를 들어 입력이 다음과 같다면,2345678910결과는 다음과 같습니다.44477
정수 리스트 sticks가 주어집니다. 각 요소는 양쪽 끝의 숫자(1~6)를 가진 막대 하나를 나타냅니다. 두 막대의 끝 숫자가 같으면 연결할 수 있으며, 연결된 막대의 양 끝은 남은 숫자가 되고 길이는 늘어납니다. 만들 수 있는 가장 긴 막대기의 길이를 구하는 문제입니다. 문제 이해하기 예를 들어 sticks = [[2, 3], [2, 4], [3, 5], [6, 6]]인 경우: [2, 3]과 [2, 4]를 2로 연결 → [3, 4] (길이 2) [3, 4]와 [3, 5]를 3으로 연결 → [4, 5] (길이 3)
이진 트리의 루트(root)가 주어졌을 때, 자식이 하나뿐인 노드를 모두 제거하는 문제를 살펴보겠습니다. 즉, 왼쪽 또는 오른쪽 자식 중 하나만 가지고 있는 노드는 트리에서 삭제하고, 리프 노드와 두 자식을 모두 가진 노드는 그대로 유지해야 합니다.문제 예시예를 들어 입력 트리가 다음과 같다면,출력 결과는 다음과 같습니다.풀이 접근 방식이 문제는 재귀(Recursion)를 활용하면 간단하게 해결할 수 있습니다. 각 노드를 방문하면서 자식 수를 확인하고, 조건에 맞지 않는 노드는 하위 트리로 치환하는 방식입니다.구체적인 알고리즘은 다
문제 개요2차원 이진 매트릭스가 주어졌다고 가정해 봅시다. 여기서 1은 살아있는 세포(live cell)를, 0은 죽은 세포(dead cell)를 의미합니다. 각 세포의 이웃(neighbors)은 해당 세포를 둘러싼 가로, 세로, 대각선 방향의 인접한 8개 칸을 말합니다.우리는 다음과 같은 규칙에 따라 매트릭스의 다음 상태(next state)를 계산해야 합니다.살아있는 세포의 경우, 살아있는 이웃이 2개 또는 3개라면 그대로 생존합니다.죽어있는 세포의 경우, 살아있는 이웃이 정확히 3개라면 새롭게 태어나 살아있는 세포가 됩니다.그
두 개의 자연수 A와 B가 주어집니다. 한 번의 연산에서는 두 수 중 아무거나 하나를 선택해 1만큼 증가시키거나 1만큼 감소시킬 수 있습니다. 이때 A와 B의 최대공약수(GCD)가 1이 되지 않도록, 즉 두 수가 서로소(coprime) 관계가 아니게 만드는 데 필요한 최소 연산 횟수를 구하는 것이 이 글의 목표입니다.예를 들어 입력이 A = 8, B = 9라면 정답은 1입니다. 9를 선택해 10으로 바꾸면 8과 10의 최대공약수는 2가 되어 두 수가 더 이상 서로소가 아니기 때문입니다.문제 해결 접근 방식이 문제는 경우의 수를 몇
문제 개요 숫자 n이 주어졌을 때, 아래 세 가지 연산을 정확히 n번 수행하여 화면에 나타낼 수 있는 최대 문자 개수를 구하는 것이 목표입니다. 문자 x 하나를 삽입한다. 화면에 있는 모든 문자를 복사한다. 복사해 둔 내용을 붙여넣는다. 예를 들어 n = 12가 입력으로 주어지면, 정답은 81입니다. 풀이 전략 이 문제는 n의 크기에 따라 두 가지 경우로 나누어 해결할 수 있습니다. 1. n이 4 이하인 경우 복사와 붙여넣기를 활용하려면 최소 2회 이상의 연산이 추가로 소모됩니다. 따라서 연산 횟수가 짧을 때는 매번 새로운
문제 개요숫자로 이루어진 리스트 stairs와 정수 k가 주어진다고 가정해 보겠습니다. 현재 우리는 0번째 계단에 서 있으며, 마지막 인덱스의 계단까지 올라가야 합니다. 여기서 stairs[i]는 i번째 계단에 도달할 때 드는 비용을 의미하며, 한 번에 1칸부터 k칸까지 자유롭게 점프할 수 있습니다. 목표는 마지막 계단에 도달하는 최소 비용을 구하는 것입니다.예를 들어, stairs = [4, 11, 11, 3, 2]이고 k = 3이라면 결과값은 9가 됩니다. 비용이 4, 3, 2인 계단만 밟고 올라가면 총 9의 비용으로 정상에 도
유효한 단어들의 목록과 하나의 문자열 s가 주어졌을 때, s에서 시작해 한 번에 한 글자씩 제거하면서도 그 결과가 여전히 목록에 포함된 유효한 단어가 되도록 만들 수 있는 가장 긴 감소 단어 체인의 길이를 구하는 것이 이번 문제의 목표입니다. 문제 이해하기 예를 들어, words = [lii, limit, limi, li, coffee, jug, pool, type]이고 s = limit라고 가정해 보겠습니다. 이때 출력은 4가 됩니다. limit에서 시작해 다음과 같은 체인을 만들 수 있기 때문입니다. limit → limi →
숫자로 이루어진 리스트 nums가 주어졌을 때, i < j를 만족하는 쌍 (i, j) 중에서 nums[i] + nums[j] + (i - j) 값이 최대가 되는 경우를 찾아야 합니다. 예를 들어 입력이 nums = [6, 6, 2, 2, 2, 8]이라면 결과는 11입니다. 인덱스 0과 1에 있는 두 개의 6을 선택하면 점수가 6 + 6 + (0 - 1) = 11이 되기 때문입니다. 문제 해결 접근 방식 가능한 모든 쌍을 일일이 확인하는 브루트 포스 방식은 O(n²)의 시간이 걸려 비효율적입니다. 대신 식을 다음과 같이 변형하
문제 소개동전의 가치를 담은 리스트 coins와 같은 길이의 수량 리스트 quantities가 주어져 있다고 가정해 보겠습니다. i번째 동전의 가치는 coins[i]이며, 현재 i번째 동전을 quantities[i]개만큼 가지고 있습니다.이때, 가지고 있는 동전들 중 비어 있지 않은 그룹을 선택하여 만들 수 있는 서로 다른 합계 값의 개수를 구하는 것이 이 문제의 목표입니다.예시입력이 coins = [1, 2, 5], quantities = [1, 2, 1]이라면 출력은 10이 됩니다. 만들 수 있는 고유한 합계는 다음과 같습니다.