요소들이 저장된 단일 연결 리스트(singly linked list)가 있다고 가정해 봅시다. 여기에 삽입할 위치를 나타내는 값 pos와 새로 추가할 값 val이 주어집니다. 우리가 해야 할 작업은 연결 리스트의 pos 인덱스 앞에 val 값을 삽입하는 것입니다.예를 들어 입력이 다음과 같다면,nums = [1, 5, 3, 6, 8]pos = 3val = 7출력 결과는 [1, 5, 3, 7, 6, 8]이 됩니다. 즉, 인덱스 3에 있던 값 6 앞에 새로운 값 7이 삽입되는 것입니다.해결 알고리즘이 문제는 다음 단계를 통해 해결할 수
문제 개요숫자 n이 주어졌을 때, x = rand() mod n이라고 가정해 보겠습니다. 여기서 rand() 함수는 0부터 10^100까지(양 끝값 포함)의 정수를 균등한 확률로 무작위 생성합니다. 그리고 다음과 같은 무한 중첩 제곱근 형태의 변수 Y가 정의됩니다.$$Y = \sqrt{x+\sqrt{x+\sqrt{x+\sqrt{x+...}}}}$$목표는 이 Y의 기댓값을 구하는 것이며, n의 범위는 1 이상 5×10^6 이하입니다.예를 들어 입력이 n = 5라면 출력은 약 1.696이 됩니다.핵심 아이디어무한 중첩 제곱근 Y는 Y²
구간(interval) 리스트와 하나의 값 point가 주어졌을 때, 해당 지점에서 교차하는 구간의 개수를 구하는 프로그램을 만들어 보겠습니다. 각 구간 interval[i]는 [si, ei] 형태로 표현되며, si는 시작 시간, ei는 종료 시간을 의미합니다(시작과 종료 시간 모두 포함).문제 이해하기예를 들어, 구간 리스트가 [[2, 6], [4, 10], [5, 9], [11, 14]]이고 point가 5라고 가정해 봅시다. 이 경우 출력값은 3이 됩니다. 시점 5에서 [2, 6], [4, 10], [5, 9] 세 개의 구간이
문제 개요프로그램 이름들이 담긴 문자열 리스트 shows, 각 프로그램의 시청 시간을 담은 정수 리스트 durations, 그리고 정수 k가 주어졌다고 가정해 보겠습니다. 여기서 shows[i]와 durations[i]는 i번째 사용자가 시청한 프로그램과 그 시청 시간을 나타냅니다. 우리의 목표는 가장 많이 시청된 상위 k개 프로그램의 총 시청 시간을 구하는 것입니다.예를 들어, 입력이 다음과 같다면:shows = [The BGT, Jack jumper, The BGT, Jokers Company, Music magic]durati
문제 이해하기배열 A와 정수 k가 주어졌을 때, A의 원소들을 선택하여 크기가 k인 배열 arr를 만들고 불공정성(unfairness)을 최소화하는 프로그램을 작성해 보겠습니다. 여기서 불공정성은 다음 공식으로 계산합니다.(arr의 최댓값) − (arr의 최솟값)예를 들어 입력이 A = [25, 120, 350, 150, 2500, 25, 35]이고 k = 3이라면 출력은 10이 됩니다. [25, 25, 35]를 선택하면 max(arr) = 35, min(arr) = 25이므로 두 값의 차이가 10으로 가장 작기 때문입니다.해결 접
문제 개요음수가 아닌 숫자로만 구성된 리스트 nums가 주어졌다고 가정해 보겠습니다. 이때 nums 안에서 k보다 크거나 같은 요소가 정확히 k개 존재하는 값 k를 찾아야 합니다. 만약 그러한 값을 찾을 수 없다면 -1을 반환합니다.예를 들어 입력이 nums = [6, 4, 0, 8, 2, 9]라면 출력은 4입니다. 왜냐하면 4보다 크거나 같은 요소가 정확히 4개, 즉 [6, 4, 8, 9]가 존재하기 때문입니다.해결 접근 방법이 문제는 내림차순 정렬과 인덱스 비교를 활용하면 효율적으로 해결할 수 있습니다. 해결 과정은 다음과 같습
문제 이해하기0과 1로만 이루어진 이진 행렬(binary matrix)이 주어졌을 때, 다음 두 가지 조건을 동시에 만족하는 요소의 개수를 찾아야 합니다.matrix[r][c] = 1같은 행(r)의 다른 모든 열 j(j ≠ c)에 대해 matrix[r][j] = 0이고, 같은 열(c)의 다른 모든 행 i(i ≠ r)에 대해 matrix[i][c] = 0쉽게 말해, 자기 자신만 1이고 속한 행과 열의 나머지 값은 모두 0인 특수한 위치를 세는 문제입니다.예제 살펴보기예를 들어 다음과 같은 행렬이 입력으로 주어진다고 가정해 보겠습니다.
두 개의 정수 배열 nums와 values가 있다고 가정해 봅시다. 두 배열의 길이는 서로 같으며, nums의 원소들은 엄격하게 오름차순으로 정렬되어 있습니다. 이때 인덱스 쌍 i, j(단, i ≤ j)에 대해 다음 수식의 값 v를 최대화하는 것이 목표입니다. v = values[i] + values[j] + nums[j] - nums[i] 예를 들어 nums = [1, 2, 7], values = [-4, 6, 5]가 입력으로 주어지면 정답은 16입니다. i = 1, j = 2를 선택하면 6 + 5 + 7 − 2 = 16이 되기
문제 소개 정수로 이루어진 리스트 nums와 연산 횟수를 나타내는 값 k가 주어집니다. 여기서 연산이란 리스트에서 원소 하나를 선택해 부호를 반전시키는(양수→음수, 음수→양수) 동작을 의미합니다. 우리는 정확히 k번의 연산을 수행할 수 있으며, 그 결과로 만들 수 있는 최대 합을 구하는 것이 목표입니다. 예를 들어 입력이 다음과 같다고 가정해 보겠습니다. nums = [2, 1, -6, -2], k = 3 -6, -2, 그리고 1의 부호를 각각 반전하면 리스트는 [2, -1, 6, 2]가 되며, 이때의 합은 9입니다. 따라서 출
문제 설명세 개의 양수 n, lower, upper가 주어진다고 가정해 봅시다. 우리는 다음 조건을 모두 만족하는 리스트를 찾아야 합니다.리스트의 길이는 정확히 n이어야 합니다.먼저 엄격하게(strictly) 증가한 뒤, 엄격하게 감소하는 산(mountain) 형태여야 합니다.모든 원소는 [lower, upper] 범위(양쪽 경계값 포함) 안에 있어야 합니다.증가 구간과 감소 구간은 각각 비어 있으면 안 됩니다.이러한 조건을 만족하는 리스트 중 사전순으로 가장 큰(lexicographically largest) 리스트를 반환하고,
문제 이해하기세 개의 숫자 n, a, b가 주어진다고 가정해 봅시다. 우리는 n명이 한 줄로 서 있는 상황에 있지만, 정확히 어느 위치에 서 있는지는 알 수 없습니다. 다만 두 가지 단서는 알고 있습니다.우리 앞에는 최소 a명이 서 있다.우리 뒤에는 최대 b명이 서 있다.이 조건들을 만족하는 위치가 몇 곳인지 계산하는 것이 이 문제의 목표입니다.예제로 살펴보기입력이 n = 10, a = 3, b = 4라고 해봅시다. 즉, 줄에 총 10명이 서 있고, 앞에는 최소 3명, 뒤에는 최대 4명이 있다는 뜻입니다.이때 가능한 위치는 인덱스
Matplotlib에서 신호의 FFT(고속 푸리에 변환)를 그릴 때, X축에 올바른 주파수 값을 표시하는 것은 정확한 주파수 분석을 위해 매우 중요합니다. 이 글에서는 NumPy와 Matplotlib을 활용해 올바른 주파수 축과 함께 FFT 스펙트럼을 시각화하는 방법을 단계별로 살펴보겠습니다.구현 단계그림(figure) 크기를 설정하고, 서브플롯 사이 및 주변 여백(padding)을 조정합니다.샘플 개수 N과 주기 개수 m 변수를 초기화하여 정규화된 주파수 nu를 계산합니다.NumPy를 사용해 사인파 형태의 신호를 생성하고, np.
문제 개요소문자 알파벳 문자열로 이루어진 words 리스트가 주어졌다고 가정해 봅시다. 이때, 각 단어의 첫 글자가 모두 동일한 가장 긴 연속 부분 리스트(contiguous sublist)의 길이를 구하는 것이 목표입니다.예를 들어 입력이 다음과 같다고 해보겠습니다.words = [she, sells, seashells, on, the, sea, shore]이 경우 정답은 3입니다. 가장 긴 연속 부분 리스트는 [she, sells, seashells]이며, 세 단어 모두 첫 글자가 s로 같기 때문입니다.해결 접근 방식이 문제는
문제 개요정수 리스트 nums와 정수 k가 주어집니다. 우리는 리스트 안의 어떤 숫자든 다른 값으로 바꿀 수 있는 연산을 최대 k번까지 수행할 수 있습니다. 이때, 모든 원소가 동일한 숫자로 채워진 가장 긴 연속 하위 목록(부분 배열)의 길이를 구하는 것이 목표입니다.예를 들어, nums = [8, 6, 6, 4, 3, 6, 6]이고 k = 2라고 가정해 보겠습니다. 이 경우 정답은 6입니다. 값이 4와 3인 두 원소를 6으로 바꾸면 [8, 6, 6, 6, 6, 6, 6]이 되어, 숫자 6이 연속으로 6번 등장하기 때문입니다.접근
Python의 Matplotlib 라이브러리에서 곡선 그래프에 제목을 추가하는 것은 매우 간단합니다. plt.title() 메서드를 사용하면 되는데, 이 글에서는 단계별로 자세히 알아보겠습니다.구현 단계그림(figure) 크기를 설정하고 서브플롯 주변 및 사이의 여백(padding)을 조정합니다.그래프가 곡선 형태가 되도록 x, y 데이터 포인트를 생성합니다.생성한 x, y 데이터를 플롯합니다.plt.title() 메서드를 사용하여 곡선 그래프에 제목을 지정합니다.show() 메서드를 호출하여 그림을 화면에 표시합니다.예제 코드im
2차원 행렬이 하나 주어져 있다고 가정해 봅시다. 우리는 주어진 행렬과 크기가 같은 새로운 행렬 res를 만들어야 하며, 각 원소는 다음 조건을 만족해야 합니다.res[i][j] = r ≤ i 이고 c ≤ j를 만족하는 모든 matrix[r][c]의 합즉, 각 위치 (i, j)에는 해당 셀을 기준으로 왼쪽 위 영역에 속한 모든 원소들의 누적 합이 저장됩니다. 이러한 행렬을 흔히 2차원 누적 합(prefix sum) 행렬이라고 부르며, 이미지 처리나 구간 합 계산 등 다양한 분야에서 활용됩니다.예시입력 행렬이 다음과 같다면,8274출
Matplotlib에서 Pandas 데이터프레임의 시간(time)을 인덱스 값으로 사용하여 플로팅하려면 아래 단계를 따르면 됩니다.구현 단계그림(figure) 크기를 설정하고 서브플롯 사이 및 주변 여백(padding)을 조정합니다.time과 speed 두 개의 열을 가진 Pandas 데이터프레임을 생성합니다.기존 열을 활용해 DataFrame의 인덱스를 설정합니다.그래프를 화면에 표시하려면 show() 메서드를 사용합니다.예제 코드from matplotlib import pyplot as plt import pandas as pd
문제 개요이진 문자열(binary string) s가 주어졌다고 가정해 봅시다. 이 문자열을 두 개의 비어 있지 않은 부분 문자열 s1과 s2로 분할하는 연산을 수행합니다. 이때 분할 점수는 다음과 같이 계산됩니다.점수 = s1에 포함된 0의 개수 + s2에 포함된 1의 개수우리의 목표는 가능한 모든 분할 지점 중에서 얻을 수 있는 최대 점수를 찾는 것입니다.예시입력이 s = 011001100111이라면, 문자열을 01100 + 110111과 같이 나눌 수 있습니다. 이 경우 왼쪽 부분에 0이 3개, 오른쪽 부분에 1이 5개 있으므
Matplotlib에서 xtick 레이블에 상자(박스)를 넣고 싶다면, 아래 단계를 따라 진행하면 됩니다. 구현 단계 새 figure를 생성하거나 기존 figure를 활성화합니다. figure의 현재 축(axis)을 가져옵니다. 축의 left(왼쪽)와 bottom(아래쪽) 위치를 설정합니다. spine(축선)의 위치, 즉 bottom과 left를 지정합니다. xtick 레이블에 상자를 적용하려면 눈금 레이블(ticklabels)을 하나씩 순회하면서 set_bbox() 메서드를 호출합니다. 완성된 figure를 화면에 표시하려면
Matplotlib에서 애니메이션이 적용된 이미지 행렬을 그리려면 FuncAnimation을 활용해 프레임마다 업데이트 함수를 반복 호출하는 방식으로 구현할 수 있습니다. 아래에서 단계별로 자세히 살펴보겠습니다.구현 단계그림(figure) 크기를 설정하고 서브플롯 주변과 사이의 여백(padding)을 조정합니다.하나의 figure와 서브플롯 집합을 생성합니다.update 함수를 반복적으로 호출하는 방식으로 애니메이션을 만듭니다.update 메서드 내부에서 6×6 크기의 행렬을 생성하고, imshow()를 사용해 데이터를 2D 래스터