문제 개요 길이가 n인 숫자 리스트 nums가 주어져 있다고 가정해 보겠습니다. 이 리스트의 각 요소는 수영 대회 참가 선수들의 현재 점수를 나타냅니다. 마지막 결승에서는 이번 라운드의 1위 선수가 n점, 2위 선수가 n-1점을 받는 식으로 순위에 따라 점수가 차등 지급됩니다. 우리가 구해야 할 값은 현재 라운드가 끝난 후, 결승이 종료되었을 때 여전히 우승할 수 있는 선수가 몇 명인지입니다. 단, 최고 점수가 동률인 경우에도 우승으로 간주합니다. 예제로 이해하기 입력이 nums = [9, 6, 11, 12]라고 해봅시다. 이때
문자열로 이루어진 리스트 ops가 있다고 가정해 보겠습니다. 이 리스트의 각 요소는 아래 연산 중 하나입니다.음수가 아닌 정수 값 — 해당 숫자를 스택에 push합니다.POP — 스택의 맨 위(top) 요소를 삭제합니다.DUP — 맨 위 요소를 한 번 더 삽입하여 복제합니다.+ — 맨 위 두 개의 요소를 pop한 뒤, 그 합을 다시 push합니다.- — 맨 위 두 개의 요소를 pop한 뒤, (맨 위 요소 − 그 아래 요소)의 결과를 push합니다.모든 연산을 차례대로 수행한 후, 스택의 맨 위에 남아 있는 요소를 구해야 합니다. 만
문제 설명비행기에 n개의 좌석이 있다고 가정해 봅시다. 첫 번째 승객은 항공권을 잃어버려서 남은 좌석 중 하나를 무작위로 선택합니다. 나머지 승객들은 각자 자신의 항공권을 가지고 있지만, 자신에게 배정된 좌석이 이미 다른 사람이 차지하고 있다면 비어 있는 좌석 중 하나를 무작위로 선택하게 됩니다. 이때 마지막 승객이 자신에게 배정된 좌석에 앉게 될 확률을 구하는 것이 이 문제의 목표입니다.예를 들어 입력이 n = 5라면 출력은 0.5(50%)입니다. 흥미롭게도 승객이 두 명 이상인 경우 답은 항상 일정합니다. 마지막 승객은 결국 제
문제 개요소문자로만 구성된 문자열 리스트 words가 주어지며, 모든 단어의 길이는 서로 같다고 가정합니다. 이때 우리가 확인해야 할 것은 이 단어들 중에서 딱 한 글자만 다른 두 문자열이 존재하는지 여부입니다.예를 들어 입력이 words = ["seed", "pick", "lick", "root", "live"]라면 결과는 True가 됩니다. "pick"과 "lick"은 첫 번째 글자만 다를 뿐 나머지 세
문제 개요소문자 알파벳으로 구성된 문자열 s와 쌍(pairs)이라는 리스트가 있다고 가정해 보겠습니다. pairs의 각 요소는 [a, b] 형태의 두 문자로 이루어져 있으며, 여기서 문자 a와 b는 서로 동일하다고 간주됩니다.만약 [a, b]와 [b, c]라는 두 쌍이 존재한다면, a와 b가 동등하고 b와 c도 동등하므로, 추이성에 의해 a와 c 역시 동등하다고 볼 수 있습니다. 또한 모든 값은 자기 자신과 항상 동등합니다. 이러한 동등 관계를 바탕으로 문자열 s가 회문(palindrome)인지 판별하는 것이 목표입니다.예시입력이
문제 개요길이가 같은 두 개의 리스트 customers(방문 고객 수)와 mood(기분 상태), 그리고 정수 k가 주어집니다. 매 분 i에 customers[i]명의 고객이 매장을 방문하며, mood[i]가 1이면 해당 고객들은 행복하고, 0이면 불행한 상태를 의미합니다.여기서 우리는 길이가 k인 연속된 구간의 mood 값을 모두 1로 변경할 수 있습니다(예: 프로모션 진행). 이 조건에서 행복하게 만들 수 있는 고객 수의 최댓값을 구하는 것이 목표입니다.입력 예시다음과 같은 입력이 주어졌다고 가정해 보겠습니다.customers =
숫자 리스트 nums와 쿼리 리스트 queries가 주어져 있다고 가정해 봅시다. 각 쿼리는 [i, j] 형태로 구성되며, 해당 쿼리는 nums의 i번째부터 j번째까지(양 끝 인덱스 포함) 부분 리스트가 산술 수열(arithmetic sequence)인지를 묻습니다. 우리의 목표는 참(true)을 반환하는 쿼리의 개수를 구하는 것입니다. 예제로 이해하기 예를 들어 입력이 다음과 같다고 해보겠습니다. nums = [2, 4, 6, 8, 7, 6, 5, 2] queries = [[3, 4], [0, 3], [2, 4]] 이때 출
문제 소개문자열 s가 주어지며, 이 문자열은 북(N), 남(S), 서(W), 동(E)을 나타내는 네 가지 방향 문자 N, S, W, E로만 구성되어 있다고 가정해 봅시다. 우리의 목표는 네 방향이 각각 정확히 n/4번씩(단, n은 문자열 s의 길이) 등장하도록 문자열의 일부를 교체할 때, 교체 대상이 되는 가장 짧은 부분 문자열의 길이를 구하는 것입니다.예를 들어 입력이 s = NNSWWESN라고 해보겠습니다. 이때 n은 8이므로 각 방향은 8 ÷ 4 = 2번씩 나타나야 합니다. 마지막 문자 N을 E로 단 한 글자만 바꾸면 모든 방
0과 1로만 구성된 이진 리스트 nums가 있다고 가정해 봅시다. 여기서 0은 빈 칸을, 1은 공이 놓여 있는 칸을 의미합니다. 우리의 목표는 nums와 같은 크기의 새로운 리스트 L을 만드는 것입니다. 이때 L[i]에는 모든 공을 i번째 위치로 이동시키는 데 필요한 총 거리가 저장됩니다. 인덱스 j에 있는 공을 인덱스 i로 옮길 때의 거리는 |j − i|로 정의됩니다. 문제 예시 예를 들어 nums = [1, 1, 0, 1]이 주어지면 결과는 [4, 3, 4, 5]가 됩니다. L[0] = |0 − 0| + |1 − 0| + |3
0과 1로만 이루어진 이진 리스트가 있다고 가정해 봅시다. 여기에 또 다른 입력값 k가 주어졌을 때, 합이 k와 같은 연속된 부분 리스트의 개수를 구하는 것이 목표입니다.예를 들어, 입력이 nums = [1, 0, 0, 1, 1, 1, 0, 1], k = 3이라면 출력은 8이 됩니다. 조건을 만족하는 부분 리스트가 [1,0,0,1,1], [0,0,1,1,1], [0,0,1,1,1,0], [0,1,1,1], [0,1,1,1,0], [1,1,1], [1,1,1,0], [1,1,0,1]로 총 8개이기 때문입니다.해결 방법이 문제는 누적
문제 이해두 값 start와 end가 주어졌을 때, [start, end] 범위(양 끝값 포함)에 속한 모든 숫자의 비트 AND 연산 결과를 구하는 것이 목표입니다.예를 들어 start = 8, end = 12가 입력으로 주어지면 출력은 8이 됩니다. 그 이유는 다음과 같습니다.8은 이진수로 10009는 이진수로 100110은 이진수로 101011은 이진수로 101112는 이진수로 1100따라서 1000 AND 1001 AND 1010 AND 1011 AND 1100의 결과는 1000, 즉 십진수로 8입니다.알고리즘 접근 방법이 문
문자열 s가 로봇의 이동 명령을 나타낸다고 가정해 보겠습니다. 로봇은 현재 좌표 (0, 0)에 위치하고 있으며 북쪽을 바라보고 있습니다. 이동 문자열 s에는 다음과 같은 문자들이 포함될 수 있습니다.F : 현재 바라보는 방향으로 한 칸 전진L : 왼쪽으로 90도 회전R : 오른쪽으로 90도 회전로봇이 문자열 s에 담긴 이동을 순서대로 무한히 반복한다고 할 때, 평면 위에 로봇이 절대 벗어날 수 없는 경계 상자(bounding box)가 존재하는지 확인하는 것이 문제입니다.예를 들어 입력이 s = FFRFRFFRF라면 출력은 True
두 개의 숫자 리스트 nums1과 nums2, 그리고 경계값 lower와 upper가 주어졌다고 가정해 봅시다. 이때 lower ≤ nums1[i]^2 + nums2[j]^2 ≤ upper 조건을 만족하는 쌍 (i, j)의 개수를 구하는 것이 문제입니다.예를 들어, 입력이 다음과 같다면,nums1 = [5, 3, 2]nums2 = [8, 12, 6]lower = 10upper = 50출력은 2가 됩니다. 조건을 만족하는 쌍은 (1, 2)와 (2, 2)이며, 각각 다음과 같이 계산됩니다.10 ≤ 3² + 6² ≤ 50 → 10 ≤ 4
숫자로 이루어진 리스트 bricks와 두 개의 값 width(너비), height(높이)가 주어졌다고 가정해 보겠습니다. bricks[i]의 각 원소는 길이가 bricks[i] 단위이고 폭이 1단위인 벽돌 하나를 나타냅니다. 목표는 주어진 너비와 높이에 맞게 벽돌로 공간을 빈틈없이 채우는 배치 방법이 총 몇 가지인지 구하는 것입니다. 이때 벽돌은 자유롭게 재사용할 수 있지만, 반드시 가로 방향으로만 놓아야 한다는 조건이 있습니다.예를 들어 bricks = [2, 1], width = 3, height = 2가 입력으로 주어지면 정답
소문자로만 이루어진 문자열 s와, s와 길이가 같은 정수 리스트 shifts가 있다고 가정해 보겠습니다. shifts[i]의 각 원소는 s의 첫 i + 1개 문자(인덱스 0부터 i까지)를 shifts[i]칸씩 밀라는 명령을 의미합니다. 이동 중 z를 넘어가면 다시 a로 순환됩니다. 목표는 모든 이동 명령을 s에 적용한 뒤의 최종 문자열을 구하는 것입니다. 예를 들어 입력이 s = "tomato", shifts = [2, 5, 2, 3, 7, 4]라고 해보겠습니다. 첫 번째 문자를 2칸 밀면 t가 v가 되어 문자열
문자열 s가 오직 세 가지 문자인 X, (, ) 로만 구성되어 있다고 가정해 보겠습니다. 이 문자열에는 균형이 맞는 괄호가 포함되어 있으며, 그 사이에 여러 개의 X가 존재하고, 괄호는 재귀적으로 중첩될 수도 있습니다. 우리의 목표는 문자열 s에서 가장 얕은 깊이부터 가장 깊은 깊이까지, 각 괄호 깊이별로 X가 몇 개 있는지 계산하는 것입니다. 예를 들어, 입력이 s = (XXX(X(XX))XX)라고 한다면, 출력은 [5, 1, 2]가 됩니다. 첫 번째 괄호 깊이(가장 바깥쪽)에는 5개, 두 번째 깊이에는 1개, 세 번째 깊이(가장
문제 소개 순환(circular) 리스트 nums가 있다고 가정해 보겠습니다. 순환 리스트는 첫 번째 요소와 마지막 요소가 서로 이웃하여 시작과 끝이 연결된 원형 구조를 말합니다. 임의의 인덱스 i에서 출발할 때, nums[i]가 양수이면 nums[i]칸 앞으로 이동하고, 음수이면 그만큼 뒤로 이동합니다. 이때 확인해야 할 것은 길이가 1보다 크면서 경로가 오직 한 방향(앞으로만 또는 뒤로만)으로 진행되는 사이클이 존재하는지 여부입니다. 예를 들어 입력이 nums = [-1, 2, -1, 1, 2]라면 결과는 True입니다. [1
문제 이해하기두 개의 리스트 cores와 tasks가 주어졌다고 가정해 보겠습니다. cores[i]는 i번째 서버에서 사용 가능한 코어 수를 의미하고, tasks[i]는 해당 작업을 실행하는 데 필요한 코어 수를 의미합니다. 각 작업은 반드시 단 하나의 서버에서만 실행되어야 하며, 하나의 서버는 여러 개의 작업을 동시에 맡을 수 있습니다. 이때 주어진 코어 용량만으로 모든 작업을 실행할 수 있는지 판단하는 것이 목표입니다.예를 들어 입력이 cores = [10, 7], tasks = [7, 3, 2, 2, 1]이라면 결과는 True
2차원 매트릭스가 주어지고, 각 셀 matrix[r, c]에는 그 위치에 놓인 코인의 개수가 저장되어 있다고 가정해 봅시다. 특정 셀 matrix[r, c]에서 코인을 가져가면, 바로 위 행(r - 1)과 아래 행(r + 1)의 모든 코인이 사라지며, 같은 행에 있는 좌우 이웃 셀인 matrix[r, c + 1]과 matrix[r, c - 1]의 코인 역시 함께 사라집니다. 이러한 규칙 속에서 우리가 수집할 수 있는 최대 코인 개수를 구하는 것이 목표입니다.예를 들어 입력이 다음과 같다고 해 보겠습니다.28761010425923이
유향 그래프(directed graph)의 간선 리스트가 주어졌다고 가정해 봅시다. 그래프에는 n개의 노드가 있으며, 노드 이름은 0부터 n-1까지 번호가 매겨져 있습니다. 또한 두 개의 정수 a와 b가 함께 주어집니다. 우리가 확인해야 할 것은 c에서 출발하여 a에 도달할 수 있고, 동시에 b에도 도달할 수 있는 노드 c가 존재하는지 여부입니다.예를 들어 위 그래프에서 a = 2, b = 3이라면 결과는 True가 됩니다. c = 0인 경우 0에서 2로 가는 경로와 0에서 3으로 가는 경로가 모두 존재하기 때문입니다.해결 전략: