정수 배열이 하나 주어지며, 배열의 값들로 만들 수 있는 모든 쌍(pair) 가운데 두 원소에 비트 OR 연산을 적용한 결과가 그 쌍의 최댓값(MAX)보다 작거나 같은 쌍의 총 개수를 세는 것이 이 글의 목표입니다. OR 연산의 진리표 ABA ∨ B000101011111 입력 − int arr[] = {2, 5, 1, 8, 9} 출력 − 비트 OR 결과가 최댓값 이하인 쌍의 개수 − 3 설명 − 아래 표는 배열 {2, 5, 1, 8, 9}에서 만들 수 있는 모든 쌍과 각각의 OR 연산 결과를 나타낸 것입니다. 조건을 만족하는
정수 배열이 하나 주어졌을 때, 배열의 값들로 만들 수 있는 모든 쌍 가운데 두 원소에 비트별 XOR(배타적 논리합) 연산을 적용한 결과가 짝수(EVEN)가 되는 쌍의 총 개수를 구하는 것이 이 글의 목표입니다. XOR 연산의 진리표 XOR 연산은 두 비트가 서로 같으면 0, 다르면 1을 반환합니다. 진리표는 다음과 같습니다. ABA XOR B 000 101 011 110 예제 입력과 출력 입력 − int arr[] = {2, 8, 1, 5, 11} 출력 − XOR 연산 결과가 짝수인 쌍의 개수 &minus
문제 개요정수 배열이 주어졌을 때, 배열의 원소들로 만들 수 있는 모든 쌍(pair) 중에서 XOR(배타적 논리합) 연산의 결과가 홀수(ODD)가 되는 쌍의 총 개수를 구하는 것이 이 글의 목표입니다.XOR은 두 비트가 서로 다를 때만 1을 반환하는 연산입니다. 먼저 XOR 연산의 진리표부터 살펴보겠습니다.XOR 연산의 진리표ABA XOR B000101011110예제 입력 및 출력입력 − int arr[] = {2, 8, 1, 5, 11}출력 − XOR 결과가 홀수인 쌍의 개수: 6설명배열 {2, 8, 1, 5, 11}에서 만들 수
정수 배열과 목표 합(sum)이 주어졌을 때, 배열의 서로 다른 두 원소를 짝지어 그 합이 목표 값과 정확히 일치하는 쌍(pair)이 총 몇 개인지 구하는 것이 이번 문제의 과제입니다. 예제 1 입력 − int arr[] = {2, 8, 1, 5, 11}, sum = 13 출력 − 합이 13이 되는 쌍의 개수: 2 설명 − 배열에서 만들 수 있는 모든 쌍과 각각의 합은 다음과 같습니다. a1a2a1 + a22810213257211138198513811191561111251116 합이 13이 되는 쌍은 (2, 11)과 (8, 5)로
문제 개요정수 배열이 주어졌을 때, 배열의 값들로 만들 수 있는 모든 쌍(pair) 중에서 두 원소에 대한 XOR 연산 결과가 홀수가 되는 쌍의 총 개수를 구하는 것이 이 글의 목표입니다.XOR 연산의 진리표는 아래와 같습니다.ABA XOR B000101011110진리표에서 알 수 있듯이 XOR 연산은 두 비트가 서로 다를 때만 1을 반환합니다. 즉, 짝수(최하위 비트가 0)와 홀수(최하위 비트가 1)를 짝지으면 그 결과는 반드시 홀수가 됩니다. 이 성질이 바로 문제 해결의 핵심입니다.입력 및 출력 예시입력 − int a
문제 소개정수 값으로 이루어진 L부터 R까지의 범위가 주어졌을 때, 해당 범위 안에 포함된 짝수와 홀수의 개수를 각각 계산하는 것이 목표입니다.입력 − L = 7, R = 17출력 − L부터 R까지 범위의 짝수 개수: 5L부터 R까지 범위의 홀수 개수: 6입력 − L = 1, R = 10출력 − L부터 R까지 범위의 짝수 개수: 5L부터 R까지 범위의 홀수 개수: 5적용한 접근 방식L부터 R까지의 범위를 입력받습니다.L과 R 값을 함수에 전달해 짝수 개수를 먼저 구하고, 그 반환값을 이용해 홀수 개수를 계산합니다.i를 L부터 R까지
문제 소개 정수 배열이 주어졌을 때, 배열의 원소들을 사용하여 만들 수 있는 모든 순서쌍 (x, y) 중에서 x가 y보다 작은 조건을 만족하는 쌍의 총 개수를 구하는 것이 목표입니다. 입력 − int arr[] = { 2, 4, 3, 1 } 출력 − x < y를 만족하는 배열 내 쌍(x, y)의 개수: 6 설명 − 배열 { 2, 4, 3, 1 }에서 만들 수 있는 모든 순서쌍은 아래 표와 같습니다. XYX < Y 24참 23참 21거짓 43거짓 41거짓 42거짓 32거짓 12참 34참 14참 31거짓 13참 표에서
문제 소개 정수 a, b, n이 주어졌을 때, 1부터 a까지의 범위에서 값 x를 선택하고 1부터 b까지의 범위에서 값 y를 선택하여 만들 수 있는 모든 쌍 (x, y) 가운데, 두 수의 합이 n으로 나누어 떨어지는 쌍의 개수를 구하는 것이 이 글의 목표입니다. 예제 1 입력 − int a = 2, b = 3, n = 2 출력 − 합이 N으로 나누어 떨어지는 쌍의 개수: 3 설명 − 먼저 1부터 a까지의 숫자는 1, 2입니다. 다음으로 1부터 b까지의 숫자는 1, 2, 3입니다. 만들 수 있는 쌍은 (1,1), (1,2), (1,3)
임의의 길이를 가진 문자열이 주어졌을 때, 문자열을 구성하는 알파벳 중 ASCII 값이 주어진 정수 k보다 작은 문자와 크거나 같은 문자의 개수를 각각 계산하는 것이 이번 문제의 목표입니다.대문자 A~Z의 ASCII 값ABCDEFGHIJKLM65666768697071727374757677NOPQRSTUVWXYZ78798081828384858687888990소문자 a~z의 ASCII 값abcdefghijklm979899100101102103104105106107108109nopqrstuvwxyz1101111121131141151161
문제 소개 하나의 정수 num이 주어졌을 때, num보다 작은 수들 중에서 num과 XOR(배타적 논리합) 연산을 수행한 결과가 num 자신보다 큰 값이 되는 숫자의 개수를 구하는 것이 이 글의 목표입니다. XOR 연산의 진리표 ABA XOR B 000 101 011 110 입력/출력 예제 입력 − int num = 11 출력 − n과 XOR 연산 결과가 더 큰 값이 되는 더 작은 숫자의 개수 − 4 설명 − num이 11로 주어졌으므로, 11보다 작은 모든 수와 11의 XOR
정수 x가 주어졌을 때, x보다 작은 자연수 중에서 x와 XOR(배타적 논리합) 연산을 수행한 결과가 x보다 큰 값이 되는 경우의 수를 구하는 문제입니다. XOR 연산 진리표 A B A XOR B 0 0 0 1 0 1 0 1 1 1 1 0 예제 예제 1: x
문제 소개정수 배열이 주어졌을 때, 배열을 원형(circular) 구조로 간주하여 만들 수 있는 부분 배열 중 합이 가장 큰 값을 찾는 것이 이 글의 목표입니다. 원형 배열에서는 마지막 요소 뒤에 다시 첫 번째 요소가 이어지기 때문에, 배열의 끝부분과 시작부분을 동시에 포함하는 부분 배열도 후보가 될 수 있습니다. 이것이 일반적인 최대 부분 배열 문제와의 가장 큰 차이점입니다.입력 · 출력 예시입력 − int arr[] = {1, 2, 8, 4, 3, 0, 7}출력 − 최대 원형 부분 배열 합계: 22설명 − 배열 {1, 2, 8,
행과 열로 이루어진 2차원 배열, 즉 행렬이 주어졌을 때, 모든 행과 열의 합 중에서 주대각선(Principal Diagonal) 또는 부대각선(Secondary Diagonal)의 합과 일치하는 경우의 개수를 구하는 것이 과제입니다.입력 예시 1int arr[row][col] = { { 4, 1, 7 }, { 10, 3, 5 }, { 2, 2, 11} }출력대각선 합과 같은 행/열의 개수: 2설명주대각선의 합은 4 + 3 + 11 = 18이고, 부대각선의 합은 7 + 3 + 2 = 12입니다.각 행의 합은 다
정수형 요소로 이루어진 정렬된 배열과 하나의 숫자 num이 주어졌을 때, 해당 요소가 배열 안에 몇 번 등장하는지 그 횟수(빈도)를 계산하는 것이 이번 글의 목표입니다.예시입력 − int arr[] = {1, 1, 1, 2, 3, 4}, num = 1출력 − 정렬된 배열에서의 등장 횟수(빈도)는 − 3입력 − int arr[] = {2, 3, 4, 5, 5, 6, -7}, num = 5출력 − 정렬된 배열에서의 등장 횟수(빈도)는 − 2입력 − int arr[] = {-1, 0, 1, 2, 3}, num = 7출력 − 정렬된 배열에
정수로 이루어진 배열이 주어졌을 때, 그중 GCD(최대공약수)가 1인 부분 수열(sub-sequence)의 개수를 찾는 것이 이 글의 목표입니다. GCD(Greatest Common Divisor)란 두 개 이상의 정수를 모두 나누어 떨어지게 하는 수 중에서 가장 큰 값을 의미합니다.문제 예시입력 − int arr[] = {3, 4, 8, 16}출력 − GCD가 1인 부분 수열의 개수 − 7설명 −주어진 배열에서 만들 수 있는 GCD가 1인 부분 수열은 (3, 4), (3, 8), (3,
문제 개요서로 다른 정수들로 이루어진 리스트 nums가 주어졌을 때, nums에 포함된 숫자를 최대 하나만 담을 수 있는 가장 큰 구간(양 끝점 포함) [start, end]의 크기를 구하는 것이 이번 문제의 목표입니다.예를 들어 입력이 nums = [10, 6, 20]이라면 출력은 99990이 됩니다. 가장 큰 구간은 [11, 100000]이며, 이 구간에는 20 하나만 포함되기 때문입니다.해결 접근 방법이 문제는 배열을 정렬한 뒤, 각 숫자를 기준으로 인접한 숫자들 사이의 빈 공간(간격)을 계산하는 방식으로 해결할 수 있습니다.
문제 설명정수로 이루어진 리스트 nums가 있다고 가정해 봅시다. 사용할 수 있는 연산은 리스트에서 일부 정수들을 선택해 선택된 모든 값을 한 번에 1씩 증가시키는 것입니다. 이때 리스트의 모든 값을 서로 같게 만들기 위해 필요한 최소 연산 횟수를 구하는 것이 목표입니다.예를 들어 입력이 [1, 3, 5]라면 출력은 4가 됩니다.접근 방법이 문제의 핵심은 의외로 단순합니다. 바로 최댓값과 최솟값의 차이(max − min)가 곧 정답이라는 점입니다.그 이유는 다음과 같습니다.리스트에서 가장 작은 값은 다른 값들과 같아지려면 결국 최댓
문제 개요각 구간(interval)이 [시작, 끝]의 두 값으로 표현되는 2차원 구간 리스트가 주어집니다. 이때 한 구간이 다른 구간을 완전히 포함하는 경우가 하나라도 존재하는지 판별해야 합니다.예를 들어 입력이 [[2,4],[5,11],[5,9],[10,10]]라고 한다면, [5,11]이 [5,9]를 포함하고 있기 때문에 결과는 true(1)가 됩니다.해결 접근 방식이 문제는 정렬과 그리디(greedy) 탐색을 결합하면 O(n log n) 시간 복잡도 안에서 효율적으로 해결할 수 있습니다. 알고리즘의 단계는 다음과 같습니다.구간
정수로 이루어진 리스트 nums가 주어졌을 때, 이 리스트를 두 개의 비어 있지 않은 부분 리스트로 나눌 수 있는지 판단해야 합니다. 조건은 왼쪽 부분의 모든 숫자가 오른쪽 부분의 모든 숫자보다 엄격히 작아야 한다는 것입니다.예를 들어 입력이 [6, 4, 3, 8, 10]이라면 결과는 true입니다. 왼쪽을 [6, 4, 3], 오른쪽을 [8, 10]으로 나누면 왼쪽의 모든 값(6, 4, 3)이 오른쪽의 모든 값(8, 10)보다 작기 때문입니다.접근 방법이 문제는 접두사 최댓값(prefix maximum)과 접미사 최솟값(suffix
0과 1로만 이루어진 정수 배열 nums가 있다고 가정해 보겠습니다. 우리가 사용할 수 있는 연산은 다음과 같습니다. 배열에서 인덱스 i를 하나 선택하면, 해당 위치의 요소와 그 오른쪽에 있는 모든 숫자를 한 번에 뒤집습니다(0은 1로, 1은 0으로). 이때 배열의 모든 원소를 0으로 만들기 위해 필요한 최소 연산 횟수를 구하는 것이 문제입니다.문제 예시입력이 [1, 0, 1]이라면 출력은 3이 됩니다.인덱스 0에서 연산 수행 → [0, 1, 0]인덱스 1에서 연산 수행 → [0, 0, 1]인덱스 2에서 연산 수행 → [0, 0,