숫자 n이 주어졌을 때, 아래 세 가지 규칙을 모두 만족하는 수열을 찾아야 합니다.1은 수열 안에 정확히 한 번만 등장합니다.2부터 n 사이의 모든 숫자는 각각 두 번씩 등장합니다.2부터 n까지의 각 숫자 i에 대해, i가 등장하는 두 위치 사이의 거리는 정확히 i여야 합니다.여기서 수열 내 두 숫자 a[i]와 a[j] 사이의 거리는 |j − i|로 정의됩니다. 그리고 이러한 조건을 만족하는 수열 중 사전순(lexicographically)으로 가장 큰 수열을 구하는 것이 목표입니다.예를 들어 입력이 n = 4라면 출력은 다음과 같
리스트 L이 주어졌을 때, 다음 알고리즘을 통해 특수 값 S를 계산할 수 있습니다.while size of L > 1 is non-zero, do a := L[0] b := L[1] remove L[1] L[0] := a + b + a*b return L[0] mod (10^9 + 7)즉, 리스트의 앞에서부터 두 원소를 꺼내 a + b + a×b 연산을 적용하고, 그 결과를 다시 리스트에 넣은 뒤 원소가 하나만 남을 때까지 이 과정을 반복하는 방식입니다. 마지막에 남은 값을 10^9 + 7로 나눈
몇 개의 요소로 이루어진 배열이 주어졌을 때, 배열을 회전시켜가며 얻을 수 있는 최대 가중치 합(maximum weighted sum)을 구하는 문제를 살펴보겠습니다. 배열 nums의 가중치 합은 다음과 같이 계산됩니다.$$\mathrm{𝑆=\sum_{\substack{𝑖=1}}^{n}𝑖∗𝑛𝑢𝑚𝑠[𝑖]}$$즉, 각 요소에 자신의 위치 인덱스(1부터 시작)를 곱한 값을 모두 더한 것이 가중치 합입니다.문제 이해하기예를 들어 입력이 L = [5, 3, 4]라면, 가능한 회전 상태별 가중치 합은 다음과 같습니다
문제 개요 반지름 r 이내의 주변 환경을 감시할 수 있는 센서 모듈이 있다고 가정해 봅시다. 이 센서의 감시 원(원주) 위에는 반드시 감시해야 하는 격자점(lattice point)들이 몇몇 존재합니다. 이때 저전력 모듈 k개를 배치하여 해당 지점들만 감시하도록 구성하려고 합니다. 반지름의 제곱과 저전력 모듈의 개수 k가 주어졌을 때, 모든 지점을 올바르게 감시할 수 있는지 판별하는 프로그램을 작성해야 합니다. 감시가 가능하면 True를, 그렇지 않으면 False를 반환합니다. 입출력 예시 예를 들어 반지름의 제곱 j = 4, 감시
문제 개요연결 리스트 L과 정수 k가 주어졌을 때, 앞에서 k번째 노드와 뒤에서 k번째 노드의 값을 서로 교환한 후 최종 리스트를 반환하는 프로그램을 만들어 보겠습니다.예를 들어 입력이 L = [1,5,6,7,1,6,3,9,12], k = 3이라면 출력은 [1,5,3,7,1,6,6,9,12]가 됩니다. 앞에서 3번째 노드는 6이고 뒤에서 3번째 노드는 3이므로, 이 두 값이 서로 맞바뀌게 됩니다.해결 접근 방법이 문제는 투 포인터(two pointer) 기법을 활용하면 리스트를 한 번만 순회하면서도 효율적으로 해결할 수 있습니다.
문제 이해하기숫자 리스트 nums가 주어져 있다고 가정해 보겠습니다. 그리고 각 쿼리 queries[i]가 세 개의 값 [k, p, r]을 담고 있는 쿼리 리스트도 함께 제공됩니다. 각 쿼리에 대해 kpr_sum을 계산해야 하며, 그 공식은 다음과 같습니다.$$\mathrm{kpr\_sum} = \sum_{i=P}^{R-1}\sum_{j=i+1}^{R}(K \oplus (A[i] \oplus A[j]))$$계산 결과가 너무 커질 경우에는 10^9+7로 나눈 나머지를 반환하면 됩니다.예를 들어 입력이 nums = [1,2,3], qu
숫자 n이 주어졌을 때, 이 수가 이상한(Weird) 수인지 아닌지 판별하는 문제입니다. 어떤 수가 Weird로 분류되는 조건은 다음과 같습니다.그 수가 홀수인 경우그 수가 짝수이면서 6 이상 20 이하 범위에 속하는 경우반대로, 그 수가 짝수이면서 2~5 범위에 있거나 20보다 크다면 Not Weird로 분류됩니다.예를 들어 입력이 n = 18이라면, 18은 짝수이면서 6~20 범위에 포함되므로 출력 결과는 Weird가 됩니다.해결 접근 방법이 문제는 다음 단계를 따라 해결할 수 있습니다.n이 홀수이면 Weird를 반환합니다.그렇
문제 소개 길이가 같은 두 개의 정수 배열 src와 tgt가 있다고 가정해 봅시다. 추가로 allowedSwaps 배열이 주어지는데, allowedSwaps[i]는 쌍 (ai, bi)를 담고 있으며, 이는 src 배열의 ai번 인덱스 원소와 bi번 인덱스 원소를 서로 교환할 수 있음을 의미합니다. 특정 인덱스 쌍은 원하는 만큼 몇 번이든, 어떤 순서로든 교환이 가능합니다. 여기서 해밍 거리(Hamming Distance)란 길이가 같은 두 배열에서 원소가 서로 다른 위치의 개수를 뜻합니다. 우리가 구해야 하는 것은 src 배열에 임
세 개의 숫자 i, j, k와 또 하나의 숫자 n이 주어져 있다고 가정해 보겠습니다. 이때 i + j + k가 n과 같지 않은 모든 삼중항(i, j, k)의 목록을 찾아야 합니다. 이 문제는 파이썬의 리스트 컴프리헨션(list comprehension) 기법을 사용하면 매우 간결하게 해결할 수 있습니다.예를 들어 입력이 i = 1, j = 1, k = 2, n = 3일 때 출력은 다음과 같습니다.[[0, 0, 0], [0, 0, 1], [0, 0, 2], [0, 1, 0], [0, 1, 1], [1, 0, 0], [1, 0, 1],
문제 이해하기 서로 다른 양의 정수로만 구성된 배열 nums가 주어집니다. 이때 a × b = c × d를 만족하는 튜플 (a, b, c, d)의 개수를 구하는 것이 목표입니다. 여기서 a, b, c, d는 모두 nums의 원소여야 하며, 네 값은 서로 달라야 합니다. 예를 들어 입력이 nums = [2, 3, 4, 6]이라면 정답은 8입니다. 실제로 만들 수 있는 튜플은 다음과 같습니다. (2, 6, 3, 4), (2, 6, 4, 3), (6, 2, 3, 4), (6, 2, 4, 3), (3, 4, 2, 6), (4, 3, 2,
문제 설명m x n 크기의 이진 행렬(binary matrix)이 주어졌다고 가정해 봅시다. 우리는 이 행렬의 열(column)을 임의의 순서대로 자유롭게 재배열할 수 있습니다. 목표는 몇 번의 열 교환 작업을 수행한 뒤, 행렬 내에서 모든 요소가 1로 이루어진 가장 큰 부분행렬(submatrix)의 넓이를 구하는 것입니다.예를 들어, 입력 행렬이 다음과 같다고 해보겠습니다.101111열을 적절히 교환하면 아래와 같은 형태가 됩니다.110111위 예시에서 빨간색으로 표시된 영역은 2 x 2 크기의 정사각형 부분행렬로, 네 개의 요소
격자(grid) 안의 각 셀에는 X, O, *, #와 같은 다양한 기호가 들어 있으며, 각 기호는 서로 다른 의미를 가집니다.#은 우리가 도달하고자 하는 목표(goal) 셀입니다.O는 자유롭게 이동할 수 있는 셀로, 이 셀을 경유해 목표 셀에 도달할 수 있습니다.*는 현재 우리가 위치한 셀입니다.X는 막혀 있는 셀로, 통과할 수 없습니다.이 문제의 목표는 격자 위에서 현재 위치(*)로부터 목표 셀(#)까지 도달하는 데 필요한 최소 이동 횟수를 구하는 것입니다. 만약 목표 셀에 도달할 수 없다면 -1을 반환해야 합니다. 격자는 프로그
문제 개요기숙사에 번호가 0부터 n-1까지 매겨진 n개의 방이 있다고 가정해 봅시다. 각 방에 살고 있는 학생들은 다른 방으로 옮기고 싶어 하며, 여러 개의 이동(전송) 요청을 제출합니다. 단, 기숙사에는 빈자리가 하나도 남아서는 안 되며, 어떤 학생이 방을 옮기려면 반드시 다른 학생이 그 자리를 대신 차지해야만 요청이 처리됩니다.이렇게 주어진 요청 목록에서 실제로 처리할 수 있는 요청이 최대 몇 개인지 구하는 것이 우리의 과제입니다.예를 들어 입력이 n = 3, requests = [[0,2],[1,0],[2,1]]이라면 출력은
문제 소개정수 n이 주어졌을 때, 아래 두 가지 연산을 원하는 만큼 반복 적용하여 n을 0으로 변환해야 하는 문제입니다.연산 1: n의 이진수 표현에서 가장 오른쪽 비트(0번째 비트)를 변경합니다. (0은 1로, 1은 0으로)연산 2: (i-1)번째 비트가 1이고, (i-2)번째부터 0번째까지의 모든 비트가 0일 때, i번째 비트를 변경할 수 있습니다.최종적으로 구해야 할 것은 n을 0으로 만들기 위해 필요한 최소 연산 횟수입니다.예제로 이해하기예를 들어 입력이 n = 6이라면 출력은 4가 됩니다. 6의 이진수 표현은 110이며,
문제 개요 모든 문자열의 길이가 동일한 문자열 리스트 words와 하나의 문자열 target이 주어졌다고 가정해 보겠습니다. 아래 규칙에 따라 주어진 단어들을 사용해 target을 생성해야 합니다. target은 반드시 왼쪽에서 오른쪽 순서로 생성합니다. target의 i번째 문자(0부터 시작하는 인덱스)를 만들려면, target[i]가 words[j][k]와 일치할 때 words의 j번째 문자열에서 k번째 문자를 선택하면 됩니다. 일단 어떤 문자열의 k번째 문자를 사용했다면, 이후에는 모든 문자열에서 k번째 위치와 같거나 앞에
문제 개요 정수 배열 nums가 주어지며, 서로 다른 값은 최대 50개까지만 존재한다고 가정합니다. 또 하나의 배열 quantity가 있고, quantity[i]는 i번째 고객이 주문한 아이템의 개수를 의미합니다. 우리는 nums의 값을 다음 조건을 모두 만족하도록 분배할 수 있는지 확인해야 합니다. i번째 고객은 정확히 quantity[i]개의 아이템을 받아야 합니다. i번째 고객이 받는 아이템들의 값은 모두 같아야 합니다. 모든 고객이 만족해야 합니다. 예를 들어 입력이 nums = [5,1,2,2,3,4,4,3,3], qu
문제 설명 배열 nums가 주어졌다고 가정해 보겠습니다. 이 배열의 임의의 원소에는 다음 두 가지 연산을 원하는 만큼 반복해서 적용할 수 있습니다. 짝수 원소라면 2로 나눕니다. 홀수 원소라면 2를 곱합니다. 여기서 배열의 편차(deviation)란 배열 안에서 두 원소 간의 최대 차이, 즉 최댓값과 최솟값의 차이를 의미합니다. 우리가 구해야 할 값은 위 연산들을 적절히 수행한 후 배열이 가질 수 있는 최소 편차입니다. 예를 들어 입력이 nums = [6,3,7,22,5]라고 해보겠습니다. 첫 번째 연산에서 홀수인 3에 2를
문제 개요n개의 노드로 이루어진 무방향 가중치 그래프가 edgeList로 주어집니다. edgeList[i]는 세 개의 값 (u, v, w)을 가지며, 이는 u에서 v로 연결되는 거리 w의 경로가 존재함을 의미합니다.또한 별도의 queries 배열이 주어지는데, queries[i]는 (p, q, lim) 형태입니다. 이 질의는 p에서 q까지 직접 또는 다른 노드를 거쳐 도달할 수 있는 경로 중, 총 거리가 lim보다 작은 경로가 존재하는지를 묻습니다. 우리는 각 질의에 대해 True/False 결과를 담은 배열을 반환해야 합니다.입력
문제 개요이진(binary) 배열 nums와 값 k가 주어졌다고 가정해 봅시다. 한 번의 이동(move)에서는 인접한 두 인덱스를 선택해 그 값을 서로 교환(swap)할 수 있습니다. 이때 배열 nums에 k개의 연속된 1이 존재하도록 만들기 위해 필요한 최소 이동 횟수를 구하는 것이 목표입니다.예를 들어 입력이 nums = [1,0,0,1,0,1,0,1], k = 3이라면 출력은 2가 됩니다. 첫 번째 스왑으로 배열을 [1,0,0,1,0,1,0,1]에서 [1,0,0,0,1,1,0,1]로 바꾸고, 두 번째 스왑으로 [1,0,0,0,
문제 설명음이 아닌 정수로 구성된 배열 nums와 쿼리 배열 queries가 주어집니다. 각 쿼리 queries[i]는 (xi, mi) 형태의 쌍으로 이루어져 있으며, i번째 쿼리의 답은 nums의 원소 중 mi 이하인 값과 xi를 XOR 연산했을 때 얻을 수 있는 최댓값입니다. 만약 nums의 모든 원소가 mi보다 크다면 해당 쿼리의 답은 -1이 됩니다. 즉, 쿼리 개수와 같은 크기의 답 배열을 만들어 각 쿼리의 결과를 순서대로 반환해야 합니다.예를 들어 입력이 다음과 같다고 가정해 보겠습니다.nums = [0,1,2,3,4],