개요아주 큰 수 n이 주어졌을 때 그 계승(factorial)을 구해야 하는 상황을 가정해 보겠습니다. C나 Java 같은 다른 프로그래밍 언어에서는 계승 결과가 정수 자료형의 표현 범위를 순식간에 초과해 버리기 때문에 큰 수의 계승을 구하는 것이 매우 까다롭습니다.하지만 파이썬은 숫자의 크기를 자동으로 감지하고, 필요할 때 기본적으로 더 큰 정수 형식(임의 정밀도 정수, Arbitrary Precision Integer)으로 확장해 주기 때문에 별도의 특수 처리 없이도 큰 수의 계승을 손쉽게 계산할 수 있습니다.예를 들어 입력값이
숫자 n이 주어졌을 때, 첫 n개의 피보나치 수열 항의 합을 구하는 프로그램을 만들어 보겠습니다. 만약 계산 결과가 너무 커진다면 결과를 10^8 + 7로 나눈 나머지를 반환하도록 처리합니다.문제 이해하기예를 들어 입력이 n = 8이라면, 첫 8개의 피보나치 항은 0, 1, 1, 2, 3, 5, 8, 13이며 이들의 합은 다음과 같습니다.0 + 1 + 1 + 2 + 3 + 5 + 8 + 13 = 33따라서 출력 결과는 33이 됩니다.해결 접근 방법이 문제는 재귀 함수와 메모이제이션(memoization) 기법을 활용하면 효율적으로
신용카드 번호가 주어졌을 때, 그 번호가 유효한지 아닌지를 판별해야 하는 상황을 생각해 볼 수 있습니다. 유효한 카드 번호는 다음과 같은 규칙을 만족해야 합니다. 번호는 4, 5 또는 6으로 시작해야 합니다. 전체 길이는 정확히 16자리여야 합니다. 숫자만 포함해야 합니다. 필요하다면 하이픈(-)으로 구분된 네 개의 그룹(각 그룹 4자리) 형태로 표기할 수 있습니다. 공백이나 밑줄(_) 같은 다른 구분 기호는 사용할 수 없습니다. 같은 숫자가 4번 이상 연속으로 나타나서는 안 됩니다. 예를 들어 입력이 s = 5423-2578-
문자열 처리 알고리즘에서 자주 등장하는 문자열 회전(String Rotation) 문제를 살펴보겠습니다. 길이가 n인 문자열 s가 주어졌을 때, 이 문자열을 왼쪽으로 1칸, 2칸, ... n칸씩 회전시켜 얻을 수 있는 모든 문자열을 구하는 것이 목표입니다.예를 들어, 입력 문자열이 s = hello라면 출력 결과는 다음과 같습니다.[elloh, llohe, lohel, ohell, hello]각 단계마다 첫 번째 문자가 맨 뒤로 이동하면서 문자열 전체가 한 칸씩 왼쪽으로 밀려나는 방식입니다.해결 접근 방법이 문제는 다음 단계를 따라
문자열 s가 주어졌을 때, 이전에 이미 등장했던 중복 문자들을 모두 제거해야 합니다. 최종 결과 문자열은 원본 문자열과 문자 순서가 동일해야 합니다.이 문제는 삽입 순서를 유지하는 ordered dictionary(순서가 보장되는 딕셔너리)를 사용하면 간단하게 해결할 수 있습니다. 딕셔너리의 값(value)은 각 문자의 빈도수로 저장하지만, 사실 빈도수 자체는 결과에 영향을 주지 않습니다. 딕셔너리를 완성한 후에는 key 값들만 추출하여 하나로 연결하면 원하는 결과 문자열을 얻을 수 있습니다.예를 들어 입력이 s = bbabcaac
배열에 여러 개의 소문자 단어가 있다고 가정해 봅시다. 이 단어들의 집합에 대해 다음 규칙에 따라 전체 점수를 구해야 합니다.모음은 a, e, i, o, u, y로 정의합니다.단어 하나의 점수는 해당 단어에 포함된 모음의 개수가 짝수일 때 2점입니다.모음 개수가 홀수라면 그 단어의 점수는 1점입니다.단어 집합 전체의 점수는 집합에 속한 모든 단어 점수의 합입니다.예를 들어 입력이 words = [programming, science, python, website, sky]라고 한다면 결과는 6이 됩니다. programming에는 모
문제 개요두 개의 숫자 리스트 nums1과 nums2가 주어졌다고 가정해 봅시다. 각 리스트에는 중복된 요소가 포함될 수 있습니다. 원래 이 두 리스트는 동일한 숫자 집합의 서로 다른 순열(permutation)을 나타내야 하지만, 일부 숫자가 누락되어 있습니다. 우리가 해야 할 일은 두 리스트 사이에서 빠진 숫자들을 모두 찾아 출력하는 것입니다.예를 들어 입력이 다음과 같다고 해보겠습니다.nums1 = [4,5,8,8,6,9]nums2 = [3,4,4,8,8,8,6,9,5,8]이 경우 출력은 [3, 4, 8, 8]이 됩니다. 그
문제 개요액면가가 1, 2, 5, 10루피인 동전이 주어져 있다고 가정해 보겠습니다. 이 동전들을 사용해 정확히 n루피를 만들 수 있는 조합이 총 몇 가지인지 구해야 합니다. 각 액면가별로 사용할 수 있는 동전의 개수가 담긴 배열 count가 제공되며, count[0]은 1루피 동전의 개수, count[1]은 2루피 동전의 개수를 의미하는 식으로 저장되어 있습니다.예를 들어 입력이 n = 27, count = [8, 4, 3, 2]라면 출력은 18이 됩니다. 즉, 총 18가지의 조합이 가능하며 그중 일부는 다음과 같습니다.10×2
우편번호가 하나 주어졌을 때, 이 번호가 유효한지 판별해야 하는 상황을 가정해 봅시다. 유효한 우편번호는 다음 두 가지 조건을 모두 충족해야 합니다.반드시 숫자여야 하며, 그 값은 100000 이상 999999 이하(양 끝값 포함) 범위 안에 있어야 합니다.교차 반복 숫자 쌍(alternating repetitive digit pair)이 두 개 이상 포함되어서는 안 됩니다. 여기서 교차 반복 쌍이란 한 자리를 건너뛴 위치의 두 숫자가 서로 같은 경우를 의미합니다.예를 들어 입력이 s = "700035"라면 결과는
두 개의 자연수 a와 b가 주어졌을 때, 두 수를 모두 나누어 떨어지게 하는 양의 정수, 즉 공약수가 몇 개인지 구하는 문제입니다.예를 들어 입력이 a = 288, b = 240이라면, 공약수는 [1, 2, 3, 4, 6, 8, 12, 16, 24, 48]로 총 10개이므로 출력은 10이 됩니다.해결 접근 방법이 문제는 다음 단계를 따라 해결할 수 있습니다.결과를 저장할 변수 res를 0으로 초기화합니다.1부터 gcd(a, b) + 1 범위의 각 숫자 i에 대해 반복합니다.i로 a를 나눈 나머지가 0이고, i로 b를 나눈 나머지도
문제 이해하기배열 nums와 값 k, 그리고 또 다른 값 i가 주어졌을 때, nums의 요소들을 오른쪽으로 k번 회전한 후 인덱스 i에 위치한 요소를 찾아야 합니다.예를 들어 입력이 nums = [2,7,9,8,10], k = 3, i = 2라고 가정해 보겠습니다. 세 번 회전한 후 배열은 [9,8,10,2,7]이 되므로, 이때 i번째 요소는 nums[2] = 10이 됩니다. 따라서 출력값은 10입니다.해결 접근 방법이 문제는 다음 단계를 따라 해결할 수 있습니다.0부터 k까지 반복하면서 매 회전마다 다음을 수행합니다.nums의 마
볼록 껍질(Convex Hull) 판별 문제란?다각형의 외곽 점들이 시계 방향 순서로 주어져 있을 때, 이 점들이 볼록 껍질(convex hull)을 형성하는지 확인하는 문제입니다.위 그림에서 알 수 있듯이, 볼록 껍질을 이루는 다각형은 연속된 세 점이 만드는 내부 각도가 항상 180° 이하라는 중요한 성질을 가집니다. 따라서 모든 연속된 세 점에 대해 각도를 검사했을 때 180°를 초과하는 경우가 하나라도 없다면, 해당 다각형은 볼록 껍질이라고 판단할 수 있습니다.예를 들어 입력이 points = [(3,4), (4
문제 개요두 개의 배열 nums1과 nums2가 주어졌다고 가정해 보겠습니다. 이때 다음 두 조건을 동시에 만족하는 값의 개수를 구해야 합니다.선택된 값은 nums1의 모든 원소로 나누어 떨어져야 합니다. 즉, nums1 전체의 공배수여야 합니다.선택된 값은 nums2의 모든 원소를 나누어 떨어지게 해야 합니다. 즉, nums2 전체의 공약수여야 합니다.예시입력이 nums1 = [3, 9], nums2 = [27, 81]이라면 출력은 2가 됩니다. 조건을 만족하는 숫자는 9와 27입니다.9는 nums1의 원소인 3과 9로 모두 나누
슈퍼 자릿수(Super Digit)란?하나의 숫자 n이 주어졌을 때, 이 수의 슈퍼 자릿수(super digit)를 구해야 합니다. 슈퍼 자릿수는 다음과 같이 정의됩니다.한 자리 숫자의 슈퍼 자릿수는 그 숫자 자신입니다.여러 자리 숫자의 경우, 각 자릿수의 합을 구하고, 그 합이 한 자리 숫자가 될 때까지 이 과정을 반복한 최종 결과가 슈퍼 자릿수입니다.예를 들어 입력이 n = 513682라면 결과는 7이 됩니다.(5+1+3+6+8+2) = 25 → (2+5) = 7해결 접근 방법이 문제는 다음 단계에 따라 해결할 수 있습니다.s
리스트가 주어졌을 때, 각 요소를 리스트 길이(n)만큼 반복하여 새로운 리스트를 만드는 문제입니다.문제 이해하기예를 들어 입력 리스트가 nums = [1, 5, 8, 3]이라면, 리스트의 길이는 4이므로 각 요소를 4번씩 반복해야 합니다. 따라서 출력 결과는 다음과 같습니다.[1, 1, 1, 1, 5, 5, 5, 5, 8, 8, 8, 8, 3, 3, 3, 3]해결 방법이 문제는 다음 단계를 통해 해결할 수 있습니다.n := nums의 크기(길이)로 설정합니다.ret := 결과를 담을 새로운 빈 리스트를 생성합니다.nums의 각 요소
다각형의 외곽 꼭짓점들이 시계 방향 순서로 주어져 있다고 가정해 보겠습니다. 이 점들이 볼록 다각형(convex polygon)을 이루는지, 아니면 오목 다각형(concave polygon)을 이루는지 판별해야 합니다. 다각형의 내각 중 하나라도 180°보다 크면 그 다각형은 오목 다각형으로 정의됩니다. 위 그림에서 알 수 있듯이, 연속된 세 개의 꼭짓점이 이루는 내각은 CDE 구간을 제외하면 모두 180° 이하입니다. 즉, 어느 한 지점에서라도 내각이 180°를 초과하면 해당 다각형은 오목하다고 판단할 수 있습니다. 예를 들어
숫자로 이루어진 리스트 nums와 기준값 x가 주어졌을 때, nums 안에서 x보다 작은 값들만 골라내야 하는 경우가 자주 있습니다. 파이썬에는 내장 함수인 filter()가 있어, 조건을 판단하는 함수를 인자로 전달해 원하는 요소만 손쉽게 걸러낼 수 있습니다.예를 들어 입력이 nums = [1,5,8,3,6,9,12,77,55,36,2,5,6,12,87], x = 50이라면, 50보다 작은 값만 남겨 출력 결과는 [1, 5, 8, 3, 6, 9, 12, 36, 2, 5, 6, 12]가 됩니다.해결 접근 방법조건을 판단할 함수 f를
서로 다른 n개의 노드가 주어졌을 때, 이 노드들을 배치하여 만들 수 있는 이진 탐색 트리(Binary Search Tree, BST)의 개수를 구하는 문제입니다. 이진 탐색 트리의 기본 성질에 따라 왼쪽 서브트리에는 항상 루트보다 작은 값들이, 오른쪽 서브트리에는 루트보다 큰 값들이 위치하게 됩니다. 이 문제는 카탈란 수(Catalan Number)를 활용하면 효율적으로 해결할 수 있습니다. 카탈란 수 C(n)은 n개의 서로 다른 키로 구성할 수 있는 이진 탐색 트리의 개수와 정확히 일치하는 값이며, 다음 공식으로 계산됩니다.
0과 1로만 이루어진 리스트 seats가 있다고 가정해 보겠습니다. 여기서 seats[i]는 하나의 좌석을 나타내며, 값이 1이면 해당 좌석은 이미 점유된 상태이고, 0이면 비어 있는 상태입니다. 리스트에는 적어도 하나의 빈 좌석과 하나의 점유된 좌석이 존재할 때, 빈 좌석에서 가장 가까운 점유 좌석까지의 거리 중 최댓값을 구하는 것이 문제입니다.예를 들어 입력이 seats = [1, 0, 1, 0, 0, 0, 1]이라면 출력은 2가 됩니다. 인덱스 4의 좌석에 앉으면 양쪽의 점유 좌석(인덱스 2와 6)까지의 거리가 각각 2이므로,
두 개의 리스트 nums와 multipliers가 있다고 가정해 보겠습니다. 우리가 수행할 수 있는 연산은 다음과 같습니다. nums에서 임의의 숫자 하나를 제거하고, multipliers에서도 임의의 숫자 하나를 제거한 뒤, 두 숫자를 곱합니다. 이 연산을 두 리스트 중 하나가 빌 때까지 반복하며, 곱해진 값들의 최대 합을 구하는 것이 목표입니다.예를 들어 입력이 nums = [-4, 4, 3], multipliers = [-2, 2]라고 한다면 출력은 16이 됩니다. -4와 -2를 짝지어 곱하고, 4와 2를 짝지어 곱하면 (-4