숫자 n이 주어졌을 때, 이 숫자의 모든 자릿수가 n을 나눌 수 있는지 확인하는 문제입니다.예를 들어 n = 135라면 결과는 True입니다. 135 ÷ 1 = 135, 135 ÷ 3 = 45, 135 ÷ 5 = 27처럼 각 자릿수(1, 3, 5)로 나누었을 때 모두 나머지가 없기 때문입니다.해결 접근 방법이 문제는 다음 단계를 따라 해결할 수 있습니다:변수 val에 n의 값을 복사합니다.val이 0보다 큰 동안 반복합니다:d := val mod 10 → 가장 오른쪽 자릿수를 추출합니다.n이 d로 나누어 떨어지지 않으면 False를
숫자로 이루어진 리스트 nums가 주어졌을 때, 해당 리스트가 회문(palindrome)인지 판별하는 문제입니다. 회문이란 앞에서 읽으나 뒤에서 읽으나 요소의 순서가 동일한 구조를 의미합니다.예를 들어, 입력이 nums = [10, 12, 15, 12, 10]이라면 어느 방향에서 읽어도 순서가 같으므로 출력은 True가 됩니다.문제 해결 접근 방법이 문제는 리스트의 양쪽 끝에서부터 중앙을 향해 요소들을 하나씩 비교하는 방식으로 해결할 수 있습니다. 구체적인 단계는 다음과 같습니다.n에 nums의 크기를 저장합니다.플래그 변수 is_
행렬(mat)이 하나 주어져 있다고 가정해 봅시다. 이 행렬의 각 칸은 다음 세 가지 값 중 하나를 가질 수 있습니다.0: 빈 공간1: 폭탄2: 적(Enemy)폭탄이 터지면 폭발은 수평 방향과 수직 방향으로 양쪽 끝까지 확산됩니다. 따라서 우리가 확인해야 할 것은 폭탄이 폭발했을 때 행렬에 있는 모든 적이 제거되는지 여부입니다.예를 들어 입력이 아래와 같다면,0020010002000010출력은 True가 됩니다. [1, 1] 위치의 폭탄이 같은 열에 있는 [2, 1] 위치의 적을 제거하고, [0, 2] 위치의 적 역시 [3, 2]
문제 개요문자열 s와 하나의 문자 c가 주어졌을 때, s에 등장하는 모든 문자 c가 서로 붙어서(연속적으로) 나타나는지 확인해야 합니다. 특히 문자 c가 문자열에 아예 존재하지 않는 경우에도 true를 반환해야 한다는 점에 유의하세요.예를 들어 입력이 s = bbbbaaaaaaaccddd, c = a라면, 문자 a는 한 덩어리로만 등장하기 때문에 출력은 True가 됩니다. 반대로 aabaa처럼 같은 문자가 여러 구간에 나누어 등장한다면 False를 반환해야 합니다.해결 접근 방식이 문제는 불리언 플래그 하나와 인덱스를 활용한 선형
문제 설명n명의 사람이 있고, 동일한 투표 기계가 두 대 있다고 가정해 보겠습니다. 또한 크기가 n인 배열 time이 주어지며, time[i]는 i번째 사람이 어느 한 기계에서 투표를 완료하는 데 걸리는 총 시간을 나타냅니다. 같은 시점에는 각 기계마다 한 명씩만 사용할 수 있습니다. 그리고 기계가 가동될 수 있는 최대 허용 시간을 나타내는 값 x가 주어질 때, 모든 사람이 이 제한 시간 안에 투표를 마칠 수 있는지 판별해야 합니다.예를 들어 입력이 n = 3, x = 7, time = [3, 5, 3]이라면 결과는 True입니다.
숫자 n이 주어졌을 때, 이 숫자의 모든 부분 숫자(sub-number)들이 서로 다른 자릿수 곱(digit product)을 가지는지 확인해야 합니다. 여기서 n자리 숫자는 총 n*(n+1)/2개의 부분 숫자를 가질 수 있습니다. 예를 들어, 135의 부분 숫자는 1, 3, 5, 13, 35, 135이며, 어떤 수의 자릿수 곱은 그 수를 구성하는 각 자릿수들의 곱을 의미합니다.예를 들어 입력이 n = 235라면, 부분 숫자는 [2, 3, 5, 23, 35, 235]이고, 각각의 자릿수 곱은 [2, 3, 5, 6, 15, 30]이
이진 문자열이 주어졌을 때, 문자열 안에 있는 모든 1이 서로 등거리(equidistant)에 있는지 확인해야 합니다. 다시 말해, 임의로 선택한 두 개의 1 사이 거리가 항상 같아야 한다는 의미입니다. 단, 입력 문자열에는 최소 두 개 이상의 1이 포함되어 있다고 가정합니다.예를 들어 입력이 s = 100001000010000라고 해보겠습니다. 이 경우 1들이 각각 4칸씩 떨어져 있으므로 출력은 True가 됩니다.문제 해결 접근 방식이 문제는 다음 단계를 통해 해결할 수 있습니다.1의 위치를 저장할 새로운 리스트 index를 생성
문제 개요문자열 s가 주어졌을 때, 이 문자열에 포함된 모든 회문(palindrome) 부분 문자열의 길이가 홀수인지 확인하는 문제입니다.예를 들어, 입력이 s = levelopmadam이라면 출력은 True가 됩니다. 이 문자열에는 level과 madam이라는 두 개의 회문 부분 문자열이 존재하며, 두 문자열 모두 길이가 5로 홀수이기 때문입니다.접근 방법이 문제는 다음 단계를 통해 해결할 수 있습니다.인덱스 i를 0부터 문자열 s의 길이까지 순회합니다.임시 문자열 temp를 빈 문자열로 초기화합니다.인덱스 j를 i부터 문자열 끝
숫자 배열과 정수 k가 주어졌을 때, 이 배열을 모든 쌍의 합이 k로 나누어 떨어지도록 쌍(pair)으로 분할할 수 있는지 확인해야 합니다. 예를 들어 입력이 arr = [5, 15, 6, 9], k = 7이라면 결과는 True입니다. (5, 9)와 (15, 6)으로 쌍을 지으면 각각의 합이 14와 21로 모두 7로 나누어 떨어지기 때문입니다. 접근 방법: 나머지 활용하기 핵심 아이디어는 나머지(remainder)입니다. 두 수의 합이 k로 나누어 떨어지려면, 두 수를 k로 나눈 나머지의 합이 0 또는 k가 되어야 합니다. 이를
문제 설명 nums라는 이름의 배열이 있고, 두 정수 x와 y가 범위 [x, y]를 정의한다고 가정해 보겠습니다. 이때 이 배열이 해당 범위에 포함되는 모든 정수를 빠짐없이 담고 있는지 확인하는 것이 과제입니다. 예를 들어 입력이 nums = [5, 8, 9, 6, 3, 2, 4], x = 2, y = 6이라면, 범위 [2, 6]의 모든 값인 2, 3, 4, 5, 6이 배열 안에 모두 존재하므로 출력은 True가 됩니다. 알고리즘: 부호 반전(In-place Marking) 기법 이 문제는 별도의 집합(set)이나 불린 배열을 새
서로 다른 고유한 값 n개로 이루어진 배열이 있다고 가정해 봅시다. 우리가 확인해야 할 것은 이 배열이 정렬된 후 회전된 상태인지 여부입니다. 단, 최소 한 번의 회전이 반드시 필요하기 때문에 완전히 정렬만 된 배열은 정렬·회전 상태로 간주하지 않습니다. 예를 들어 입력이 nums = [4,5,6,8,1,3]이라면 출력은 True가 됩니다. 시계 방향으로 두 번 회전하면 [1, 3, 4, 5, 6, 8]처럼 정렬된 형태가 되기 때문입니다. 문제 해결 접근법 다음 단계를 따라 문제를 해결할 수 있습니다. min_element :=
문제 소개배열 nums에는 숫자 1과 2만 들어 있다고 가정해 봅시다. 이 배열을 두 부분으로 나누었을 때, 각 부분에 포함된 원소의 합이 서로 같아지는지 확인하는 것이 이번 문제의 목표입니다.예를 들어 입력이 nums = [1, 1, 2, 2, 2]라면 결과는 True입니다. 배열을 [1, 1, 2]와 [2, 2]로 나누면 두 부분의 합이 각각 4로 동일하기 때문입니다.풀이 전략이 문제는 복잡한 탐색 없이 몇 가지 조건 검사만으로 해결할 수 있습니다. 먼저 다음 두 값을 계산합니다.total : 배열의 모든 원소를 더한 전체 합o
숫자로 이루어진 배열 nums가 주어졌을 때, 이 배열이 어떤 이진 탐색 트리(Binary Search Tree)를 중위 순회(Inorder Traversal)한 결과와 일치하는지 확인하는 문제입니다.예를 들어 입력이 nums = [5, 8, 15, 18, 20, 26, 39]라면, 이 배열은 아래 트리를 중위 순회한 결과이므로 출력은 True가 됩니다.핵심 아이디어이진 탐색 트리의 가장 중요한 성질 중 하나는 중위 순회를 수행하면 항상 오름차순으로 정렬된 값들이 얻어진다는 것입니다. 따라서 복잡하게 트리를 재구성할 필요 없이, 단
크기가 k인 이진 문자열의 인코딩을 나타내는 배열 nums가 주어졌을 때, 해당 인코딩이 이진 문자열을 유일하게(unique) 결정하는지 확인해야 하는 문제를 살펴보겠습니다.여기서 인코딩은 연속된 1의 개수들을 의미하며, 각 그룹은 하나의 0으로 구분됩니다. 즉, 인코딩 [a1, a2, ..., an]은 a1개의 1, 0 한 개, a2개의 1, 0 한 개, ..., an개의 1 형태의 문자열에 해당합니다.문제 이해하기예를 들어 입력이 nums = [4, 2, 3]이고 k = 11이라고 가정해 봅시다. 이 경우 출력은 True가 됩니
숫자 n이 주어졌을 때, 이 수를 두 반소수(세미프라임, semi-prime)의 합으로 표현할 수 있는지 확인하는 문제를 함께 풀어보겠습니다.반소수(Semi-prime)란 무엇인가?반소수는 두 개의 소수를 곱하여 만들 수 있는 수를 의미합니다. 예를 들어 4 = 2 × 2, 6 = 2 × 3, 15 = 3 × 5처럼 소인수가 정확히 두 개인 수가 반소수에 해당합니다.1부터 100 사이에 존재하는 반소수는 다음과 같습니다.4, 6, 9, 10, 14, 15, 21, 22, 25, 26, 33, 34, 35, 38, 39, 46, 49
문제 이해하기문자열 s가 주어졌을 때, 그 문자열의 아나그램(문자 재배열) 중 하나라도 회문(palindrome)을 이룰 수 있는지 확인해야 합니다.예를 들어 입력이 s = aarcrec라고 가정해 보겠습니다. 이 문자열의 아나그램 중 하나인 racecar는 앞뒤가 같은 회문이므로 출력은 True가 됩니다.해결 접근 방법핵심 아이디어는 간단합니다. 어떤 문자열이 회문이 되려면 문자들의 배치가 좌우 대칭을 이루어야 하며, 이는 각 문자의 등장 횟수에 다음과 같은 제약 조건이 있음을 의미합니다.문자열의 길이가 짝수라면, 모든 문자가 반
문제 정의각 구간(interval)은 (a, b) 형태로 표현되며, a는 이벤트의 시작 시간, b는 종료 시간을 나타냅니다. 주어진 구간 목록 중 하나라도 다른 구간을 완전히 포함(완전히 겹침)하는 경우에는 True를 반환하고, 그렇지 않으면 False를 반환해야 합니다.예를 들어 입력이 [(4,6), (10,12), (7,9), (13,16)]라면 어떤 구간도 다른 구간 안에 완전히 들어가지 않으므로 결과는 False입니다. 반면 입력이 [(4,6), (4,9), (7,11), (5,8)]라면 구간 (5,8)이 구간 (4,9) 내
주어진 숫자가 17로 나누어 떨어지는지 판별해야 하는 상황을 가정해 보겠습니다.예를 들어 입력값이 99943이라면, 이 숫자는 17로 나누어 떨어지므로 출력 결과는 Divisible(나누어 떨어짐)이 됩니다.접근 방식: 반복 뺄셈 기법이 문제는 반복 뺄셈(repeated subtraction) 기법을 사용하면 효율적으로 해결할 수 있습니다. 원리는 다음과 같습니다.숫자의 마지막 자릿수를 추출한 뒤, 그 값을 5배 하여 원래 숫자에서 빼는 과정을 반복합니다. 이 과정을 거치면 숫자가 점점 줄어들어 결국 두 자리 수가 되는데, 17의
아주 큰 숫자가 주어졌을 때, 해당 숫자가 19로 나누어 떨어지는지 확인해야 하는 경우가 있습니다.예를 들어 입력값이 86982라면, 결과는 Divisible(나누어 떨어짐)이 됩니다.해결 접근 방법이 문제는 반복 덧셈(repeated addition) 기법을 사용하여 효율적으로 해결할 수 있습니다. 이 방법의 핵심 아이디어는 다음과 같습니다.숫자에서 마지막 자릿수를 분리합니다.분리한 자릿수에 2를 곱합니다.그 값을 나머지 숫자에 더합니다.숫자가 두 자리 수가 될 때까지 위 과정을 반복합니다.최종 숫자가 19로 나누어 떨어지면, 원
문자열 형태로 주어진 아주 큰 숫자가 있고, 그 숫자의 자릿수를 임의로 재배열한 결과 중 하나라도 8로 나누어 떨어지는지 판별해야 한다고 가정해 보겠습니다. 숫자가 문자열로 주어지기 때문에 단순한 정수 연산만으로는 처리하기 어렵습니다. 예를 들어 입력이 input_num = 4696984라면, 자릿수를 재배열해 마지막 세 자리를 984(8 × 123)로 만들 수 있으므로 출력은 Divisible by eight(8로 나누어 떨어짐)가 됩니다. 핵심 원리: 마지막 세 자리만 확인하면 된다 1000이 8의 배수이기 때문에, 어떤 정