문제 개요원형 튜브 안에 n개의 공이 들어 있다고 가정해 보겠습니다. 튜브의 길이는 100미터이며, 처음에 각 공은 시작점이라 부르는 기준 지점으로부터 i미터 떨어진 위치에 놓여 있습니다. 이후 공들은 제각각의 방향으로 튜브 안을 순환하며 이동하고, 이동 속도는 초당 0.1미터입니다.두 공이 같은 지점에서 만나면 충돌이 발생하며, 충돌한 공들은 서로 이동 방향을 바꿉니다. 이 과정이 아주 긴 시간, 예컨대 10^9 + 6초 동안 계속된다고 할 때, 그동안 공들이 충돌한 총 횟수를 구하는 것이 이 문제의 목표입니다. 각 공의 시작점으
크기가 각각 a, b, c인 여러 개의 정육면체(큐브)를 쌓아 가로 a, 세로 b, 높이 c인 새로운 직육면체 상자를 만들었다고 가정해 보겠습니다. 이때 a, b, c는 쌍별로 서로소(공약수가 1) 관계여야 합니다. 즉, gcd(a, b) = gcd(b, c) = gcd(a, c) = 1을 만족합니다. 그림과 같이 꼭짓점 P, Q, R을 지나는 하나의 평면으로 상자를 딱 한 번 절단하여 두 조각으로 나누어야 합니다. 이렇게 잘랐을 때 몇 개의 큐브가 두 조각으로 잘리는지 구하는 것이 바로 이 문제의 목표입니다. 가능한 세 변의
문제 개요 하이퍼렉탱글(초사각형)은 k개의 차원을 가진 직사각형의 일반화된 개념입니다. 각 차원의 길이는 n1, n2, n3, ..., nm으로 표현되며, 초사각형의 각 셀은 (p, q, r, ...) 형태의 좌표로 주소가 지정됩니다. 이때 각 셀의 값은 해당 좌표들의 최대공약수, 즉 gcd(p, q, r, ...)와 같습니다. 좌표 범위는 1 ≤ p ≤ n1, 1 ≤ q ≤ n2 등으로 제한되며, 인덱스는 1부터 시작합니다. 우리의 과제는 모든 셀 값 gcd(p, q, r, ...)의 총합을 계산한 뒤, 그 결과를 10^9 + 7
문제 개요 게임 쇼에 원형으로 배치된 2n개의 방이 있다고 가정해 보겠습니다. 이 중 한 곳에는 참가자가 찾아야 할 경품이 숨겨져 있습니다. 방들은 시계 방향으로 1, 2, 3, …, n, −n, −(n−1), …, −1 순서로 번호가 붙어 있습니다. 각 방에는 문이 하나씩 있으며, 이 문을 통해 다른 방으로 이동할 수 있습니다. 모든 문에는 x라는 표식이 적혀 있는데, 이는 현재 방에서 거리 x만큼 떨어진 방으로 연결된다는 뜻입니다. x가 양수이면 시계 방향으로 x번째 방을, x가 음수이면 반시계 방향으로 x번째 방을 가리킵니다.
정점이 n개인 트리가 있다고 가정해 보겠습니다. 각 정점에는 1부터 n까지 번호가 붙어 있고, 루트 정점의 번호는 1입니다. 또한 모든 정점은 고유한 가중치 wi를 가지고 있습니다.이때 n×n 크기의 행렬 A를 다음과 같이 정의할 수 있습니다. 행렬의 (x, y) 성분은 A(x, y) = Wf(x, y)인데, 여기서 f(x, y)는 정점 x와 y의 최소 공통 조상(LCA)입니다. 즉, 두 정점의 가장 가까운 공통 조상의 가중치가 행렬 성분이 되는 구조입니다. 이 글에서는 이렇게 만들어진 행렬 A의 행렬식(determinant)을 구
정수로 이루어진 배열이 하나 주어졌다고 가정해 보겠습니다. 먼저 이 배열에서 만들 수 있는 모든 연속 부분 배열(contiguous subarray)을 구한 뒤, 각 부분 배열을 그 안의 최댓값으로 바꿉니다. 그리고 숫자 k가 추가로 주어졌을 때, 바뀐 값이 k보다 큰 부분 배열이 몇 개인지 세는 것이 이 문제의 목표입니다.문제 예시입력이 다음과 같다고 해보겠습니다.input_array = [5, 6, 7, 8], k = 7이때 출력은 4가 됩니다.배열 [5, 6, 7, 8]에서 만들 수 있는 연속 부분 배열은 다음과 같습니다.{5
목표 파서(Goal Parser)가 주어진 문자열 명령을 해석하는 상황을 가정해 보겠습니다. 명령 문자열은 다음 세 가지 요소로만 구성됩니다.알파벳 G여는 괄호와 닫는 괄호 ()그리고/또는 (al) (순서는 임의)목표 파서는 G를 문자열 G로, ()를 o로, (al)을 al로 해석합니다. 해석된 결과들은 원래 등장한 순서대로 이어 붙여집니다. 따라서 명령 문자열이 주어졌을 때, 목표 파서가 해석한 최종 문자열을 구하는 것이 이 문제의 목표입니다.예를 들어 입력이 command = G()()()(al)(al)이라면, G는 그대로 G,
문제 소개서로 다른 문자들로만 구성된 문자열 s와 문자열 배열 words가 주어졌다고 가정해 봅시다. 어떤 문자열의 모든 문자가 문자열 s 안에 포함되어 있다면, 그 문자열을 일관된(consistent) 문자열이라고 정의합니다. 우리의 목표는 words 배열에 있는 문자열 중에서 일관된 문자열이 총 몇 개인지 찾는 것입니다.예를 들어, 입력이 다음과 같다면:s = pxwords = [ad, xp, pppx, xpp, apxpa]출력은 3이 됩니다. p와 x라는 두 문자만으로 이루어진 문자열이 [xp, pppx, xpp]로 세 개 존
문제 이해하기 숫자 n이 주어졌다고 가정해 봅시다. 토너먼트에는 n개의 팀이 참가하며, 다음과 같은 규칙이 적용됩니다. 현재 팀 수가 짝수라면, 각 팀은 다른 팀과 짝을 이루어 경기를 진행합니다. 총 (n/2)경기가 치러지고, 승리한 (n/2)개 팀이 다음 라운드로 진출합니다. 현재 팀 수가 홀수라면, 한 팀은 부전승으로 자동 진출하고 나머지 팀들은 서로 짝을 이룹니다. 따라서 총 (n-1)/2경기가 치러지며, (n-1)/2+1개 팀이 다음 라운드로 진출합니다. 우리의 목표는 최종 우승 팀이 가려질 때까지 치러진 총 경기 수를
전화번호가 문자열 형태로 주어져 있다고 가정해 봅시다. 이 전화번호는 숫자와 공백, 그리고 하이픈(-)으로 구성되어 있습니다. 우리는 이 전화번호를 정해진 규칙에 따라 새로운 형식으로 다시 포맷하려고 합니다. 규칙은 다음과 같습니다.문자열에 포함된 모든 공백과 하이픈을 제거합니다.남은 자릿수가 4개 이하가 될 때까지, 왼쪽부터 오른쪽 방향으로 숫자를 3자리씩 묶습니다.마지막에 남은 자릿수는 아래와 같이 그룹화합니다.2자리 남은 경우: 길이 2짜리 블록 하나로 구성합니다.3자리 남은 경우: 길이 3짜리 블록 하나로 구성합니다.4자리
길이가 짝수인 문자열 s가 주어졌다고 가정해 보겠습니다. 이 문자열을 길이가 동일한 두 부분으로 나누어야 하며, 앞쪽 절반을 a, 뒤쪽 절반을 b라고 부르겠습니다. 두 문자열이 포함하고 있는 모음(vowel)의 개수가 대소문자 구분 없이 서로 같다면, 우리는 이 두 문자열을 유사하다(alike)고 정의합니다. 즉, 이 문제의 목표는 a와 b가 유사한지 여부를 판별하는 것입니다. 예를 들어 입력이 s = talent라면 출력은 True입니다. 문자열을 나누면 tal과 ent가 되는데, 두 문자열 모두 모음이 하나씩, 자음이 두 개씩
박스 종류를 나타내는 2차원 배열 boxTypes가 있다고 가정해 보겠습니다. boxTypes[i]는 두 개의 요소, 즉 [i번째 타입 박스의 개수, 박스당 단위 수]로 구성됩니다. 여기에 트럭에 실을 수 있는 최대 박스 개수를 의미하는 값 k도 주어집니다. 실리는 박스 개수가 k를 초과하지 않는 한 어떤 박스든 자유롭게 선택할 수 있으며, 우리의 목표는 트럭에 실을 수 있는 최대 총 단위 수를 구하는 것입니다. 예를 들어 입력이 boxTypes = [[2,4],[3,3],[4,2]], k = 6이라면 출력은 19가 됩니다. 그
문제 개요첫날인 월요일에 은행에 1루피(Rs)를 입금했다고 가정해 보겠습니다. 그다음 날인 화요일부터 일요일까지는 매일 전날보다 1루피씩 더 많이 입금하고, 이후 매주 월요일에는 지난주 월요일보다 1루피씩 더 많이 입금하는 규칙입니다. 이때 정수 n이 주어지면, n일째 되는 날까지 은행에 총 얼마가 쌓이는지 구하는 것이 이 문제의 목표입니다.예시로 이해하기예를 들어 입력값이 n = 17이라면 출력은 75가 됩니다.첫째 주에는 월요일 1루피, 화요일 2루피처럼 하루씩 늘려 일요일에 7루피까지 넣습니다. 둘째 주 월요일에는 2루피, 화
숨겨진 배열 arr에 음수가 아닌 정수 n개가 들어 있다고 가정해 봅시다. 이 배열은 길이가 n-1인 또 다른 배열 enc로 인코딩되며, 각 원소는 enc[i] = arr[i] XOR arr[i+1] 관계를 만족합니다. 인코딩된 배열 enc와 실제 배열의 첫 번째 원소인 정수 first가 주어졌을 때, 원래 배열을 복원하는 것이 이 문제의 목표입니다. 예를 들어, 입력이 enc = [8, 3, 2, 7], first = 4라면 출력은 [4, 12, 15, 13, 10]이 됩니다. XOR 연산의 핵심 원리 이 문제는 XOR(배타적
rect라는 배열이 주어졌다고 가정해 봅시다. rect[i]는 두 개의 원소 [len_i, wid_i]를 가지며, 각각 i번째 직사각형의 가로 길이와 세로 길이를 나타냅니다. 이때 k <= len_i 그리고 k <= wid_i가 모두 성립한다면, i번째 직사각형을 잘라 한 변의 길이가 k인 정사각형을 만들 수 있습니다.예를 들어 직사각형 [4, 6]이 있다면, 이것을 잘라서 만들 수 있는 정사각형의 한 변 길이는 최대 4입니다. 여기서 maxLen은 주어진 직사각형들 중 어느 하나에서 얻을 수 있는 가장 큰 정사각형의 한
문제 이해하기로드 트립을 떠나는 자전거 타는 사람(바이커)이 있다고 가정해 보겠습니다. 그의 여행 경로에는 서로 다른 고도에 위치한 n개의 지점이 있으며, 바이커는 고도 0인 0번 지점에서 여행을 시작합니다.n개의 원소를 가진 배열 gain이 주어졌을 때, gain[i]는 i번째 지점과 i+1번째 지점 사이의 순수한 고도 변화량을 의미합니다(0 <= i < n). 우리가 구해야 하는 것은 지나간 모든 지점 중 가장 높은 고도입니다.예를 들어 입력이 gain = [-4, 2, 6, 1, -6]이라면 출력은 5가 됩니다. 각
문제 개요문자열 s가 hh:mm 형식의 시간을 나타낸다고 가정해 봅시다. 이 문자열에는 일부 숫자가 물음표(?)로 표시되어 숨겨져 있습니다. 24시간제를 기준으로 유효한 시간 범위는 00:00부터 23:59까지이며, 우리의 목표는 숨겨진 자리를 적절한 숫자로 대체하여 만들 수 있는 가장 늦은 유효 시간을 찾는 것입니다.예를 들어 입력이 s = 1?:?5라고 한다면 출력은 13:55가 됩니다. 시간 부분의 첫 자리는 이미 1로 확정되어 있고 두 번째 자리는 최대 3까지 허용되므로 13이 되며, 분 부분에서는 숨겨진 자리가 최대 5로
문제 개요공장에 번호가 l부터 r까지 매겨진 n개의 공이 있고, 1번부터 무한대까지 번호가 붙은 상자가 무한히 많다고 가정해 봅시다. 각 공은 공 번호의 자릿수 합과 같은 번호의 상자에 넣습니다. 예를 들어 번호가 123인 공은 1 + 2 + 3 = 6이므로 6번 상자에 들어갑니다.두 값 l과 r이 주어졌을 때, 우리가 구해야 하는 것은 가장 많은 공이 담긴 상자에 들어 있는 공의 개수입니다.예시입력이 l = 15, r = 25라면 출력은 2가 됩니다. 그 이유는 다음과 같습니다.15번 공 → 1 + 5 = 6번 상자16번 공 →
배열 nums에 중복된 요소와 고유한(한 번만 등장하는) 요소가 섞여 있을 때, nums에 포함된 모든 고유한 요소의 합을 구해야 한다고 가정해 보겠습니다.예를 들어 입력이 nums = [5,2,1,5,3,1,3,8]이라면 출력은 10이 됩니다. 고유하게 한 번만 등장하는 요소는 2와 8뿐이며, 이들의 합이 10이기 때문입니다.해결 접근 방법이 문제는 다음 단계를 따라 해결할 수 있습니다.count := 배열의 각 요소별 등장 횟수를 저장한 딕셔너리 생성ans := 0으로 초기화nums의 각 인덱스 i와 값 v에 대해 반복count
문제 개요배열 nums가 주어졌을 때, 이 배열이 원래 비내림차순(non-decreasing)으로 정렬되어 있다가 일정 횟수(0회 포함)만큼 회전된 상태인지 확인해야 합니다. 배열에는 중복된 값이 존재할 수도 있습니다.예를 들어 입력이 nums = [12,15,2,5,6,9]라면, 이 배열은 정렬된 상태 [2,5,6,9,12,15]에서 오른쪽으로 두 칸 회전된 것이므로 결과는 True가 됩니다.해결 접근 방법핵심 아이디어는 다음과 같습니다. 먼저 배열에서 오름차순이 유지되는 지점까지 탐색한 뒤, 그 지점을 기준으로 배열을 잘라 순서