양수 길이 값들로 이루어진 배열 nums가 주어졌다고 가정해 보겠습니다. 이 배열에서 세 개의 값을 골라 만들 수 있는 삼각형 중 가장 큰 둘레(perimeter)를 구하는 것이 목표입니다. 만약 넓이가 0보다 큰 삼각형을 하나도 만들 수 없다면 0을 반환하면 됩니다.예를 들어 입력이 [8, 3, 6, 4, 2, 5]라면 출력은 19가 됩니다. 이 경우 8, 6, 5를 변으로 하는 삼각형의 둘레가 8 + 6 + 5 = 19로 가장 크기 때문입니다.문제 해결 접근 방법삼각형이 성립하려면 삼각형 부등식을 만족해야 합니다. 즉, 가장 긴
어떤 수 N이 주어졌을 때, N의 이진수 표현에서 인접한 두 개의 1 사이의 최대 거리를 구하는 프로그램을 파이썬으로 작성해 보겠습니다. 만약 1이 두 개 미만으로 존재한다면 0을 반환합니다. 문제 이해하기 예를 들어 입력이 71이라면 출력은 4가 됩니다. 71을 이진수로 변환하면 1000111이 되는데, 여기에는 네 개의 1이 있습니다. 첫 번째 1과 두 번째 1 사이의 거리는 4이고, 나머지 1들은 서로 거리가 1입니다. 따라서 가장 긴 거리는 4입니다. 해결 접근 방법 이 문제는 다음 단계를 따라 해결할 수 있습니다. N
문자열 s가 주어졌을 때, s 안에서 가장 긴 "좋은(nice)" 부분 문자열을 찾는 것이 목표입니다.어떤 문자열이 "좋은(nice)" 문자열이 되려면, 해당 문자열에 포함된 모든 알파벳이 대문자와 소문자 양쪽 형태로 모두 나타나야 합니다. 조건을 만족하는 부분 문자열이 여러 개라면, 그중 가장 먼저 등장하는 것을 반환해야 합니다.예를 들어 입력이 s = "ZbybBbz"라면 결과는 "bBb"입니다. 이 부분 문자열에는 소문자 b와 대문자 B가 함께 들어 있어
두 개의 문자열 s와 t가 주어졌을 때, s에서 시작하여 두 문자열의 글자를 번갈아 가며 추가하는 방식으로 병합해야 합니다. 만약 s와 t의 길이가 같지 않다면, 남은 글자들은 병합된 문자열의 끝에 그대로 붙여주면 됩니다.예를 들어 입력이 s = major, t = general이라면 출력은 mgaejnoerral이 됩니다. t가 s보다 길기 때문에, 교대로 병합한 후 남은 부분인 ral을 마지막에 추가한 것입니다.문제 해결 접근 방법이 문제는 두 개의 포인터와 반복문을 사용하면 간단하게 해결할 수 있습니다. 알고리즘의 동작 순서는
배열 items가 있다고 가정해 보겠습니다. 각 items[i]는 [type_i, color_i, name_i] 형태의 세 가지 요소를 담고 있으며, 이는 i번째 아이템의 종류(type), 색상(color), 이름(name)을 나타냅니다. 여기에 더해, 두 개의 문자열 ruleKey와 ruleValue로 표현되는 규칙이 하나 주어집니다.i번째 아이템이 이 규칙과 일치한다고 판단할 수 있는 조건은 다음 중 하나입니다.ruleKey = type이고 ruleValue = type_i인 경우ruleKey = color이고 ruleValue
pts라는 배열에 여러 개의 점이 주어져 있다고 가정해 봅시다. 그리고 우리의 현재 위치를 나타내는 또 다른 점 (x, y)도 함께 주어집니다. 여기서 유효한 점이란 현재 위치와 x좌표 또는 y좌표 중 하나라도 같은 점을 의미합니다. 우리가 구해야 하는 값은 현재 위치에서 맨해튼 거리(Manhattan Distance)가 가장 짧은 유효한 점의 인덱스입니다. 만약 조건을 만족하는 점이 두 개 이상이라면, 그중 인덱스가 가장 작은 점을 반환하면 됩니다.참고로 두 점 (a, b)와 (p, q) 사이의 맨해튼 거리는 다음과 같이 계산됩니
문제 개요앞에 불필요한 0이 붙지 않는 바이너리(2진) 문자열 s가 주어졌을 때, 이 문자열 안에서 숫자 1로만 이루어진 연속된 구간(segment)이 최대 한 개인지 확인해야 합니다.예를 들어 입력이 s = 11100이라면, 1로 이루어진 구간은 111 하나뿐이므로 결과는 True입니다. 반면 10100처럼 1 구간이 두 번 나타나면 False를 반환해야 합니다.접근 방법이 문제는 다음 단계를 따라 해결할 수 있습니다.count 변수를 -1로 초기화합니다. 이 값은 지금까지 등장한 0의 개수를 추적합니다.문자열의 길이가 1이라면
길이가 같은 두 문자열 s와 t가 있다고 가정해 봅시다. 여기서 수행할 수 있는 연산은 문자열 안에서 두 개의 인덱스를 선택하고(두 인덱스가 같아도 무방), 해당 위치의 문자를 서로 맞바꾸는(swap) 것입니다. 이때 정확히 하나의 문자열에 대해 최대 한 번의 문자 교환만 허용했을 때, 두 문자열을 완전히 동일하게 만들 수 있는지 판별하는 것이 문제의 핵심입니다.예를 들어 입력이 s = hello, t = hlelo라면 결과는 True입니다. 어느 한쪽 문자열에서 e와 l의 위치를 서로 바꾸면 두 문자열이 같아지기 때문입니다.문제
영문자와 숫자가 섞여 있는 문자열 s가 주어졌다고 가정해 보겠습니다. 이때 우리가 해야 할 일은 문자열 안에 등장하는 숫자들 중 두 번째로 큰 값을 찾는 것입니다. 만약 조건을 만족하는 숫자가 존재하지 않는다면 -1을 반환하면 됩니다.예를 들어 입력이 s = p84t3ho1n이라면, 문자열에 포함된 숫자는 [1, 3, 4, 8] 네 개입니다. 가장 큰 숫자는 8이고, 두 번째로 큰 숫자는 4이므로 결과값은 4가 됩니다.문제 해결 접근 방법이 문제는 다음 단계를 통해 간단히 해결할 수 있습니다.집합 생성: 중복 제거를 위해 새로운 집
문제 개요양수로만 이루어진 배열 nums가 주어졌을 때, 이 배열에서 만들 수 있는 오름차순(증가) 부분 배열의 최대 합을 구하는 문제입니다.부분 배열 [nums_l, nums_l+1, ..., nums_r]이 오름차순이라는 것은 l <= i < r을 만족하는 모든 인덱스 i에 대해 nums[i] < nums[i+1]이 성립한다는 의미입니다.예를 들어 입력이 nums = [15, 25, 35, 5, 15, 55]라면 결과는 75가 됩니다. 이는 [5, 15, 55]가 합이 가장 큰 증가 부분 배열이기 때문입니다.접근
문제 설명소문자 영숫자(alphanumeric)로 이루어진 문자열 s가 주어졌다고 가정해 봅시다. 문자열에서 숫자가 아닌 모든 문자를 공백으로 바꾸면, 하나 이상의 공백으로 구분된 여러 개의 정수가 남게 됩니다. 우리가 구해야 하는 것은 이러한 치환 작업을 수행한 후 문자열에 존재하는 서로 다른 정수의 개수입니다.여기서 두 숫자가 다르다고 판단하는 기준은, 선행 0(leading zero)을 제외한 십진수 표현이 서로 다른 경우입니다. 즉, 012와 12는 문자열로는 다르지만 정수로는 같은 값이므로 동일한 숫자로 취급됩니다.예시입력
문제 개요체스판 좌표란 체스판 위 특정 칸의 위치를 나타내는 문자열로, 열을 의미하는 알파벳과 행을 의미하는 숫자가 조합된 형태입니다. 예를 들어 f5처럼 표현됩니다.이번 글에서는 주어진 좌표에 해당하는 칸이 흰색인지 판별하는 파이썬 프로그램을 작성해 보겠습니다. 칸이 흰색이면 True를, 검은색이면 False를 반환하면 됩니다.예를 들어 입력이 f5라면 출력 결과는 True입니다.접근 방법체스판의 색상 패턴을 자세히 살펴보면, 열을 나타내는 알파벳의 아스키(ASCII) 코드 값과 행을 나타내는 숫자의 홀짝성(2로 나눈 나머지)을
공백 하나로 구분된 여러 영어 단어로 이루어진 문장 s가 있다고 가정해 봅시다. 문장 앞뒤에는 불필요한 공백이 없으며, 추가로 정수 값 k도 주어집니다. 우리가 해야 할 일은 이 문장을 잘라내어 처음 k개의 단어만 추출해 반환하는 것입니다.문제 예시예를 들어 입력이 다음과 같다고 해보겠습니다.s = Coding challenges are really helpful for studentsk = 5이 경우 출력 결과는 다음과 같습니다.Coding challenges are really helpful해결 접근 방법이 문제는 파이썬의 문자
nums라는 이름의 배열이 있다고 가정해 보겠습니다. 이때 우리가 구해야 할 것은 배열에 포함된 모든 요소를 곱한 결과의 부호입니다.예를 들어 입력이 nums = [-2, 3, 6, -9, 2, -4]라고 한다면, 전체 곱은 -2592가 되므로 출력 결과는 Negative(음수)가 됩니다.문제 해결 접근 방법흥미로운 점은 실제로 모든 숫자를 일일이 곱할 필요가 없다는 것입니다. 부호만 판별하면 되기 때문에, 배열을 한 번만 순회하면서 0의 개수와 음수의 개수만 세면 됩니다.다음 단계에 따라 문제를 해결할 수 있습니다.zeroes(0
배열 nums가 주어졌다고 가정해 봅시다. 한 번의 연산으로 배열에서 원소 하나를 선택해 그 값을 1만큼 증가시킬 수 있습니다. 예를 들어 [4, 5, 6]이 있을 때 인덱스 1의 원소를 선택하면 배열은 [4, 6, 6]이 됩니다. 목표는 nums를 엄격하게 증가(strictly increasing)하는 배열로 만들기 위해 필요한 최소 연산 횟수를 구하는 것입니다.예를 들어 입력이 nums = [8, 5, 7]이라면 출력은 7이 됩니다. 다음 순서대로 원소를 증가시켜야 하기 때문입니다.[8, 6, 7] → [8, 7, 7] → [8
영어 소문자로만 이루어진 문장 s가 주어졌을 때, 이 문장이 팬그램(pangram)인지 확인해야 합니다. 팬그램이란 알파벳 a부터 z까지 총 26개의 글자를 모두 포함하고 있는 문자열을 의미합니다.예를 들어, 입력이 s = thegrumpywizardmakestoxicbrewfortheevilqueenandjack이라면 a~z의 모든 글자가 포함되어 있으므로 출력 결과는 True가 됩니다.문제 해결 접근 방법다음 단계를 따라 문제를 해결할 수 있습니다.빈 딕셔너리(dictb)를 하나 생성합니다.문자열 s의 각 문자 i를 순회하면서
이 글에서는 10진수로 주어진 숫자 n을 k진수로 변환한 뒤, 변환된 수의 각 자릿수를 모두 더한 값을 구하는 방법을 다룹니다. 자릿수 합을 계산할 때는 각 자릿수를 10진수 값으로 취급한다는 점에 유의해야 합니다.문제 예시예를 들어 n = 985, k = 8이 입력으로 주어진 경우를 생각해 보겠습니다. 985를 8진수로 변환하면 1731이 되고, 따라서 자릿수 합은 1 + 7 + 3 + 1 = 12가 됩니다.풀이 접근 방식이 문제는 진법 변환 과정에서 나오는 나머지들을 활용하면 간단하게 해결할 수 있습니다. 알고리즘은 다음과 같습
문제 설명짝수 위치에는 소문자 영어 알파벳이, 홀수 위치에는 숫자가 들어 있는 영숫자(alphanumeric) 문자열 s가 있다고 가정해 보겠습니다.여기서 shift(c, x)는 임의의 문자 c와 숫자 x를 받아, c에서 x번째 뒤에 있는 문자를 찾는 연산입니다. 예를 들면 다음과 같습니다.shift(p, 5) = ushift(a, 0) = a이제 모든 홀수 인덱스 i에 대해 해당 위치의 숫자 s[i]를 shift(s[i-1], s[i])의 결과로 바꿔야 합니다. 즉, 문자열 안의 모든 숫자를 바로 앞의 알파벳을 기준으로 이동한 문
배열 nums와 두 개의 값 target(반드시 nums 안에 존재해야 함), start가 주어졌다고 가정해 봅시다. 이때 nums[i] = target을 만족하는 인덱스 i 중에서 |i - start|의 값이 가장 작은 경우를 찾고, 그 최솟값을 반환해야 합니다.예를 들어 입력이 nums = [3,4,5,6,7], target = 7, start = 2라고 해 보겠습니다. 이 경우 출력은 2가 됩니다. target과 일치하는 값은 nums[4] 하나뿐이므로 i = 4이고, 따라서 |4 - 2| = 2이기 때문입니다.문제 해결 접근
문제 개요두 개의 열(출생 연도, 사망 연도)로 구성된 표가 있다고 가정해 보겠습니다. 각 행은 i번째 사람의 출생 연도와 사망 연도를 나타냅니다.여기서 특정 연도 y의 인구란, y년 동안 생존해 있던 사람의 수를 의미합니다. i번째 사람은 y가 [birth_i, death_i - 1] 범위(양 끝 포함)에 속할 때 y년의 인구에 포함됩니다. 즉, 사망한 해 본인은 인구 집계에서 제외됩니다.우리가 구해야 할 것은 인구가 최대가 되는 해 중 가장 이른 연도입니다.입력 예시출생 연도사망 연도197020101960202019401970이