문제 소개이 문제에서는 두 개의 값 x와 y가 주어집니다. 우리의 목표는 y mod 2^x, 즉 y를 2의 x제곱으로 나눈 나머지를 구하는 것입니다.예시를 통해 문제를 살펴보겠습니다.입력 : x = 2, y = 19출력 : 3설명 −y % 2x = 19 % 22 = 19 % 4 = 3해결 접근 방법가장 단순한 해결 방법은 pow() 함수를 사용하여 2x 값을 직접 계산한 뒤, y % 2x를 구하는 것입니다.또 다른 효율적인 접근 방식은 로그를 활용하는 것입니다. 만약 y < 2x라면 나머지는 곧 y 자신이 됩니다. 이 경우 다
이 문제에서는 하나의 정수 N이 주어졌을 때, 주어진 정수가 3의 거듭제곱인지 아닌지를 판별하는 것이 우리의 과제입니다.문제 이해를 위한 예시입력 : N = 729출력 : Yes설명 −36 = 729729는 3을 여섯 번 곱한 값, 즉 3의 거듭제곱이므로 결과는 Yes입니다.해결 접근 방식이 문제는 3의 거듭제곱 값의 성질을 활용하면 매우 간단하게 해결할 수 있습니다.핵심 아이디어는 다음과 같습니다. 32비트 int 자료형으로 표현할 수 있는 가장 큰 3의 거듭제곱은 319 = 1,162,261,467입니다. 어떤 수 N이 3의 거
이 문제에서는 정수 N이 주어지며, 주어진 정수가 4의 거듭제곱인지 아닌지 판별하는 것이 우리의 과제입니다.문제 이해를 위한 예시입력 : N = 64 출력 : Yes설명 −43 = 64즉, 64는 4의 세제곱이므로 4의 거듭제곱에 해당합니다.해결 접근 방법이 문제를 해결하는 가장 간단한 방법은 숫자를 반복적으로 4로 나누면서, 나눈 결과가 계속 4로 나누어떨어지는지 확인하는 것입니다. 재귀적으로 나누기를 진행한 후 값이 최종적으로 1이 되면 true를 반환합니다.만약 나누는 도중 4로 나누어떨어지지 않는 값이 나온다면,
이 문제에서는 정수 배열 arr[]와 하나의 구간(range)이 주어지며, 우리의 과제는 주어진 구간에 속한 부분 배열이 산(mountain) 형태인지 판별하는 것입니다. 여기서 산 형태란 배열의 값이 처음에는 계속 증가하다가 어느 정점을 기준으로 다시 계속 감소하는 모양을 의미합니다.문제 이해하기예시를 통해 문제를 자세히 살펴보겠습니다.입력 : arr[] = {1, 4, 2, 5, 6, 7, 3, 0}, 구간 = [2, 7]출력 : Yes설명 −구간 [2, 7]에 해당하는 부분 배열 = {2, 5, 6, 7, 3, 0}값이 먼저
이 문제에서는 크기가 각각 m과 n인 두 개의 정수 배열 arr1[]과 arr2[]가 주어집니다. 우리의 과제는 arr2가 arr1의 부분 집합(subset)인지 여부를 판별하는 것입니다.두 배열 arr1[]과 arr2[]는 정렬되어 있지 않으며(unordered), 모든 요소는 중복 없이 서로 다른 값을 가집니다.예시를 통해 문제를 이해해 보겠습니다.입력 : arr1[] = {5, 2, 1, 6, 8, 10}, arr2[] = {6, 2, 1}출력 : arr2는 arr1의 부분 집합입니다.문제 해결 접근 방식이 문제는 다양한 방법
이 문제에서는 세 개의 정수 a, b, n이 주어지며, 우리의 목표는 ax + by = n을 만족하는 정수 x와 y를 찾는 것입니다.문제 이해를 위한 예시입력 : a = 4, b = 1, n = 5출력 : x = 1, y = 1해결 접근 방법가장 간단한 해결 방법은 0부터 n 사이의 값을 하나씩 대입하면서 방정식을 만족하는지 확인하는 것입니다. 이를 위해 방정식을 다음과 같이 변형하여 사용합니다.x = (n - by) / ay = (n - ax) / bx에 해당하는 값을 순차적으로 대입했을 때 나머지 값이 b로 나누어 떨어진다면,
문제 개요이 문제에서는 정수 n이 하나 주어지며, 우리의 목표는 2/n = 1/x + 1/y + 1/z 등식을 만족하는 세 정수 x, y, z를 찾는 것입니다.예시를 통해 문제를 살펴보겠습니다.입력 : n = 4출력 : 4, 5, 20출력된 값이 실제로 등식을 만족하는지 확인해 보면 다음과 같습니다.1/4 + 1/5 + 1/20 = 5/20 + 4/20 + 1/20 = 10/20 = 2/4 = 2/n ✔풀이 접근 방법이 문제는 n의 값만으로 해를 바로 유도할 수 있는 아주 단순한 수학적 구조를 가지고 있습니다.n = 1인 경우: 등
이 문제에서는 두 개의 정수 A와 B가 주어지며, XOR 연산자(^)를 사용하지 않고 두 숫자의 XOR 값을 구하는 것이 과제입니다.예시를 통해 문제를 이해해 보겠습니다.입력 : A = 4, B = 5출력 : 1풀이 접근 방법 1: 비트 단위 연산 활용이 문제를 해결하는 한 가지 방법은 두 숫자를 각각의 이진수로 변환한 뒤, 아래 진리표(truth table)를 기준으로 비트 단위 연산을 수행하는 것입니다.AB출력000011101110XOR의 특성상 두 비트가 서로 다를 때만 결과가 1이 됩니다. 위 표를 코드로 구현하면 다음과 같
이 문제에서는 두 개의 정수 값이 주어집니다. 우리의 과제는 “한 숫자의 세트 비트(set bit)가 있는 위치마다 다른 숫자의 해당 비트를 토글한다”는 연산을 수행하는 C++ 프로그램을 작성하는 것입니다.문제 이해를 위한 예시입력: 3 7 출력: 4 3의 이진수: 011 7의 이진수: 111첫 번째 숫자인 3(011)의 세트 비트 위치를 기준으로 두 번째 숫자 7(111)의 첫 번째와 두 번째 비트가 뒤집히면서 결과적으로 100, 즉 4가 됩니다.해결 접근 방법이 문제는 두 숫자의 XOR(배타적 논리합) 연산을 수행하는 것만으로
이 문제에서는 2차원 화면을 나타내는 2D 배열과, 색을 채워야 할 화면상 픽셀의 좌표, 그리고 새로 적용할 색상이 주어집니다. 우리의 과제는 현재 픽셀과 그 픽셀과 같은 색으로 연결된 모든 인접 픽셀을 새로운 색으로 칠하는 프로그램을 작성하는 것입니다.그림판 프로그램에서 색 채우기 기능은 원하는 색을 선택한 뒤 브러시(채우기 도구)로 특정 픽셀을 클릭하면 동작합니다. 클릭된 영역과 연결된 같은 색의 영역 전체가 한 번에 새로운 색으로 바뀌는 것이죠.문제 예시예제를 통해 문제를 더 자세히 이해해 보겠습니다.입력: Screen[][]
이 문제에서는 양의 정수가 하나 주어집니다. 우리의 과제는 최대 한 번의 자릿수 교환(swap) 연산만을 사용하여 만들 수 있는 가장 큰 숫자를 구하는 프로그램을 작성하는 것입니다.즉, 기존 숫자의 자릿수들을 이용해 새로운 숫자를 만들되, 단 한 쌍의 자릿수만 서로 바꿀 수 있습니다.문제 이해를 위한 예시입력: n = 63512출력: 6531263512에서 첫 번째 자리의 3과 두 번째 자리의 5를 교환하면 65312가 되며, 이것이 한 번의 스왑으로 만들 수 있는 가장 큰 숫자입니다.방법 1: 모든 스왑 경우를 탐색하는 브루트 포
이 문제에서는 하나의 양의 정수가 주어집니다. 우리의 과제는 최대 한 번의 자리 교환(swap) 연산만 사용하여 만들 수 있는 가장 작은 숫자를 구하는 프로그램을 작성하는 것입니다.즉, 기존 숫자의 자릿수들을 이용해 새로운 숫자를 만들되, 딱 한 쌍의 자릿수만 서로 바꿀 수 있다는 조건이 있습니다.문제 이해를 위한 예시입력: n = 63519출력: 36519위 예시에서 첫 번째 자리의 6과 두 번째 자리의 3을 서로 바꾸면 63519 → 36519가 되며, 이것이 한 번의 스왑으로 만들 수 있는 가장 작은 숫자입니다.해결 방법 1:
이 문제에서는 하나의 숫자 n이 주어지며, 우리의 목표는 수열 3, 13, 42, 108, 235...의 n번째 항을 구하는 것입니다.문제 이해를 위한 예시입력 : 5출력 : 235해결 접근 방법이 수열은 첫 n개의 자연수를 세제곱한 값들의 합으로 표현할 수 있습니다. 자연수 세제곱의 합 공식은 다음과 같습니다.(n * (n + 1) / 2)2여기서 주목할 점은 이 수열의 각 항이 해당 세제곱의 합보다 정확히 2 * n만큼 크다는 것입니다. 따라서 위 공식에 2 * n을 더하면 원하는 수열의 일반항을 얻을 수 있습니다.수열의 일반항
문제 소개이 문제에서는 숫자 n과 소수 p가 주어집니다. 우리의 목표는 n!에 포함된 소수 p의 거듭제곱을 구하는 것입니다.문제를 이해하기 위해 예시를 살펴보겠습니다.입력 : n = 6, p = 2출력 : 4문제 접근 방법가장 직관적인 방법은 n!의 값을 직접 계산한 후 소인수분해하여, 그 결과에서 소수 p가 몇 번 곱해졌는지 세는 것입니다.예를 들어 5! = 120 = 2 × 2 × 2 × 3 × 5이므로, 5!에 포함된 2의 거듭제곱은 3입니다.팩토리얼은 다음과 같이 정의됩니다.n! = n × (n−1) × (n−2) × … ×
이 문제에서는 하나의 숫자 N이 주어지며, 주어진 정수 N의 처음 세 비트와 마지막 세 비트를 추출하여 이를 십진수로 변환하는 것이 우리의 과제입니다.예시를 통해 문제를 이해해 보겠습니다.입력 : 57 출력 : 7 1문제 풀이 접근법가장 간단한 해결 방법은 숫자 n을 이진수로 변환한 뒤, 각 비트를 배열에 저장하는 것입니다. 그다음 배열에서 처음 세 개 값과 마지막 세 개 값을 각각 따로 읽어 십진수로 변환하면 됩니다. 이렇게 얻은 두 십진수 값이 바로 우리가 원하는 결과입니다.예를 들어 숫자 80을 살펴보겠습니다.80을 이진수로
형식 문자열(Format String)이란?형식 문자열(Format String)은 문자열을 서식화(formatting)하기 위해 사용되는 ASCII 문자열입니다. 일반 텍스트와 서식 지정 매개변수(예: %d, %s, %x 등)로 구성되며, C 언어에서는 프로그램의 출력 결과를 원하는 형태로 서식화하기 위해 다양한 형식 문자열이 활용됩니다.대표적인 형식 문자열 함수로는 printf, sprintf, fprintf, snprintf 등이 있으며, 이들 함수는 첫 번째 인수로 형식 문자열을 받아 출력 형식을 결정합니다.형식 문자열 취약
문제 개요이 문제에서는 2차원 행렬 mat[][]가 주어지며, 우리의 목표는 가우스-조던 방법(Gauss-Jordan Method)을 사용하여 행렬의 역행렬을 구하는 것입니다.먼저 문제를 이해하기 위한 기본 개념부터 살펴보겠습니다.행렬(Matrix)은 숫자들이 행과 열의 형태로 배열된 2차원 배열입니다.예시$\begin{bmatrix}2&5&4 \\1&6&7 \\9&3&8\end{bmatrix}$역행렬(Inverse Matrix)이란?역행렬 [A⁻¹]은 정방행렬(정사각 행렬)에 대해서만 정
이 문제에서는 N개의 요소로 이루어진 정렬된 연결 리스트(Sorted Linked List)가 주어지며, 우리의 과제는 이 리스트의 중앙값(Median)을 찾는 것입니다.문제 개요정렬된 연결 리스트란 모든 요소가 특정한 순서(오름차순 또는 내림차순)로 정렬되어 있는 단순 연결 리스트를 의미합니다.예시: 4 -> 6 -> 7 -> 9 -> NULL중앙값(Median)은 연결 리스트의 가운데에 위치한 요소를 말하며, 다음과 같이 정의할 수 있습니다.N이 홀수인 경우: 중앙값은 (n/2)번째 요소입니다.N이 짝수인
문제 개요이 문제에서는 숫자 N이 주어지며, 우리의 과제는 소수 자릿수(2, 3, 5, 7)만으로 이루어진 n번째 숫자를 찾는 것입니다.소수 자릿수(2, 3, 5, 7)만으로 구성된 수열은 다음과 같습니다: 2, 3, 5, 7, 22, 23, 25, 27, 32, 33...예시를 통해 문제를 이해해 보겠습니다:입력: N = 6출력: 23수열에서 여섯 번째 숫자는 22 다음인 23이 됩니다.해결 접근 방식문제를 해결하는 간단한 방법은 주어진 인덱스에 해당하는 숫자, 즉 수열의 항을 직접 찾는 것입니다. 이를 위해서는 수열의 패턴을 관
이 문제에서는 그룹에 속한 친구의 수를 나타내는 양의 정수 N이 주어지며, 친구 페어링 문제(Friends Pairing Problem)를 해결하는 프로그램을 작성하는 것이 목표입니다.그룹의 각 친구는 혼자 남아 있거나, 다른 친구 한 명과 짝을 이룰 수 있습니다. 단, 각 친구는 최대 한 번만 페어링에 참여할 수 있습니다.문제 이해를 위한 예시입력: n = 3출력: 4설명:그룹의 3명을 A, B, C라고 합시다.페어링은 다음과 같이 구성할 수 있습니다:{A}, {B}, {C}{A, B}, {C}{A, C}, {B}{A}, {B,