구간 [first, last]가 주어졌을 때, 목표는 이 범위 안에 속하면서 일의 자릿수가 k인 숫자가 총 몇 개인지 세는 것입니다.가장 직관적인 방법은 first부터 last까지 숫자를 하나씩 확인하는 것입니다. 각 숫자 i에 대해 i % 10으로 일의 자릿수를 구한 뒤, 그 값이 k와 같으면 카운트를 1 증가시키면 됩니다.구체적인 예제를 통해 살펴보겠습니다.입력 − first=8, last=40, k=8출력 − 일의 자릿수가 k인 숫자의 개수 − 4설명 −8과 40 사이에서 일의 자릿수가 8인 숫자 8, 18, 28, 38입력
하나의 숫자 N이 주어졌을 때, 1부터 N까지의 범위에서 완전제곱수(perfect square)이면서 동시에 완전세제곱수(perfect cube)인 숫자의 개수를 구하는 것이 목표입니다. 예를 들어, 1과 64는 완전제곱수이자 완전세제곱수에 해당합니다.이 문제를 해결하기 위해 제곱근을 계산하는 sqrt() 함수와 세제곱근을 계산하는 cbrt() 함수를 사용합니다.예시를 통해 자세히 살펴보겠습니다.입력 − N=100출력 − 완전제곱수이자 완전세제곱수인 숫자의 개수 − 2설명 − 1부터 100까지의 숫자 중 1과 64만이 완전제곱수이면
길이가 n인 연속된 숫자 배열이 주어졌을 때, 배열에는 단 하나의 숫자만 두 번 이상 반복되어 나타납니다. 이때 우리의 목표는 해당 요소가 배열에서 몇 번 반복되는지 그 횟수를 구하는 것입니다. 다시 말해, 반복되는 요소의 길이를 찾는 문제라고 할 수 있습니다.해결 방법은 간단합니다. 인덱스 i=0부터 i<n까지 배열을 순회하면서 arr[i]==arr[i+1] 조건을 만족하면 count를 1씩 증가시킵니다. 마지막으로 마지막 요소까지 포함하기 위해 count를 한 번 더 증가시키면, count 변수에는 반복 요소의 길이가 저장
양의 정수로 이루어진 배열이 주어졌을 때, 각 숫자에 최대 한 번 1을 더하는 연산을 적용하여 2의 거듭제곱으로 만들 수 있는 숫자의 개수를 구하는 것이 목표입니다.이 문제는 log2() 함수를 활용해 해결할 수 있습니다. 어떤 수 x가 2의 거듭제곱이라면 log2(x)는 정수가 됩니다. 따라서 각 원소에 대해 log2 값의 floor(내림)와 ceil(올림)이 같은지 확인하고, 그렇지 않다면 1을 더한 값에 대해 다시 검사하여 조건을 만족하면 카운트를 증가시킵니다.예제로 이해하기입력 − arr[] = {1, 3, 2, 5, 6}출
문제 개요정수 배열이 하나 주어집니다. 목표는 모든 요소의 합과 해당 요소 자신 사이의 절대 차이가 변수 k보다 큰 요소의 개수를 세는 것입니다.풀이 아이디어는 간단합니다. 먼저 배열 전체 요소의 합(sum)을 구합니다. 이 합에는 arr[i] 자신도 이미 포함되어 있으므로, 각 요소 arr[i]에 대해 다음 조건을 검사합니다.sum − 2 × arr[i] > k조건이 참이면 카운트를 1 증가시키면 됩니다.예제로 이해하기예제 1입력 − arr[] = { 1, 2, 3, 0, 3, 2, 0, 1 }, k = 10출력 − 요소 개
문제 소개노드(node)와 간선(edge)으로 이루어진 그래프가 주어집니다. 이 문제의 목표는 어떤 간선에도 연결되지 않은 노드의 최대 개수를 구하는 것입니다. 완전 그래프(complete graph)에서는 노드 수가 항상 간선 수보다 작거나 같다는 성질을 활용하면 됩니다.핵심 아이디어노드가 n개인 완전 그래프에는 정확히 n(n-1)/2개의 간선이 존재합니다. 따라서 주어진 간선을 모두 배치하는 데 필요한 최소한의 노드 수를 찾으면, 전체 노드 수에서 그 값을 빼서 남는 노드의 최대 개수를 계산할 수 있습니다.수식으로 정리하면 다음
네 개의 정수 배열이 주어졌을 때, 각 배열에서 하나씩 원소를 선택해 만든 네 원소 조합(쿼드러플렛) 중 그 합이 주어진 값(Sum)과 일치하는 경우가 몇 가지인지 구하는 것이 이 문제의 목표입니다. 단, 선택된 네 원소는 반드시 서로 다른 배열에 속해 있어야 합니다.가장 직관적인 풀이 방법은 4중 반복문으로 가능한 모든 조합을 탐색하면서 A[i] + B[j] + C[k] + D[l] == sum 조건을 확인하는 것입니다. 조건이 참이면 카운트를 1씩 증가시키면 됩니다.예제로 이해하기입력 −A[]={ 1,3,1 }, B[]={ 2,
0과 1로만 구성된 문자열이 주어집니다. 이 문자열은 왼쪽에서 오른쪽으로 읽는 이진수를 나타내며, 맨 앞 문자가 최하위 비트(LSB)입니다. 예를 들어 001은 1이 아니라 4에 해당합니다. 우리의 목표는 십진수로 변환했을 때 짝수가 되는 모든 부분 문자열의 개수를 구하는 것입니다.핵심 아이디어는 매우 간단합니다. 각 부분 문자열의 첫 번째 문자만 확인하면 됩니다. 첫 문자가 0이면 해당 부분 문자열이 나타내는 십진 값은 반드시 짝수이고, 1이면 홀수입니다. 따라서 str[i]가 0인 인덱스 i에서 시작하는 부분 문자열은 모두 (l
0부터 9까지의 숫자로만 구성된 문자열이 주어지며, 이 문자열은 하나의 십진수를 나타냅니다. 우리의 목표는 값이 X보다 큰 숫자에 해당하는 모든 부분 문자열(substring)을 찾아 그 개수를 세는 것입니다. 단, 부분 문자열은 0으로 시작해서는 안 된다는 조건이 있습니다. 예를 들어 2021이라는 문자열에서 02, 021, 0처럼 앞에 0이 붙는 부분 문자열은 유효한 후보에서 제외됩니다.해결 방법은 간단합니다. 모든 부분 문자열의 첫 번째 자릿수를 먼저 검사하여, 그 값이 0이 아니라면 해당 인덱스에서 시작하는 부분 문자열들을
두 수 L과 R이 주어져 범위 [L, R]을 정의합니다. 목표는 이 범위 안의 수들 중 짝수이면서 동시에 각 자릿수의 합이 3으로 나누어떨어지는 모든 수의 개수를 구하는 것입니다. 해결 방법은 간단합니다. L부터 R 사이의 모든 짝수에 대해 자릿수의 합을 계산하고, 그 합을 3으로 나눈 나머지가 0이면 카운트를 1씩 증가시키면 됩니다. 예제로 이해하기 입력 — L=10, R=20 출력 — 범위 [L, R]에서 자릿수의 합이 3으로 나누어떨어지는 짝수의 개수: 2 설명 — 10과 20 사이의 짝수는 10, 12, 14, 16, 18,
정수 요소로 이루어진 배열에 중복된 값이 포함되어 있고, 배열에 존재하는 서로 다른(고유한) 요소들의 빈도를 계산하여 결과를 출력하는 것이 목표입니다. 입력 − int arr[] = {1, 1, 2, 3, 4, 1, 2, 3} 출력 − frequency of 1 is: 3 frequency of 2 is: 2 frequency of 3 is: 2 frequency of 4 is: 1 입력 − int arr[] = {2, 3, 4, 1, 5} 출력 − frequency of 1 is: 1
공백(space), 줄바꿈 문자(new line), 탭 문자(tab)가 섞여 있을 수 있는 문장 형태의 문자열이 주어졌을 때, 해당 문자열 안에 포함된 총 단어 수를 계산하여 출력하는 것이 이번 글의 목표입니다.문제 정의입력 − string str = welcome to\n tutorials point\t출력 − 문자열의 단어 수: 4설명 − 문자열에는 welcome, to, tutorials, point의 네 단어가 있으며, 나머지는 단어 사이에 위치한 공백( ), 줄바꿈 문자(\n), 탭 문자(\t)입니다.입력 − string
개요 대문자, 소문자, 특수 문자, 숫자가 모두 섞여 있는 문자열이 주어졌을 때, 각 유형별 문자가 몇 번 등장하는지 빈도를 계산하는 것이 이번 문제의 목표입니다. C++에서는 각 문자의 아스키(ASCII) 값을 기준으로 범위를 비교하는 간단한 방법으로 이를 해결할 수 있습니다. 문자 분류 기준 대문자(Uppercase) — A~Z, 아스키 값 65~90 (65와 90 포함) 소문자(Lowercase) — a~z, 아스키 값 97~122 (97과 122 포함) 숫자(Numeric) — 0~9, 아스키 값 48~57 (48과 57
정수형 숫자가 하나 주어졌을 때, 먼저 해당 숫자의 이진수 표현을 구하고, 그 숫자의 총 비트 수를 계산하는 것이 목표입니다.입력 − int number = 50출력 − 숫자의 총 비트 수 − 6설명 − 50의 이진수 표현은 110010입니다. 만약 8자리 숫자로 계산하면 앞에 두 개의 0이 붙어 00110010이 되지만, 실제 유효한 비트는 6개이므로 총 비트 수는 6입니다.입력 − int number = 10출력 − 숫자의 총 비트 수 − 4설명 − 10의 이진수 표현은 1010입니다. 8자리 숫자로 나타내면 앞에 네 개의 0이
정수 num이 주어졌을 때, 먼저 해당 숫자의 이진수(binary) 표현을 구한 뒤 전체 세트 비트(set bit)의 개수를 계산하는 것이 이 글의 목표입니다.세트 비트란 이진수에서 1로 표현되는 비트를 말합니다. 정수 값을 이진수로 변환하면 0과 1의 조합으로 나타나는데, 컴퓨터 분야에서는 이때의 숫자 1을 세트 비트라고 부릅니다.입력 − int number = 50출력 − 숫자의 전체 세트 비트 개수: 3설명 − 숫자 50의 이진 표현은 110010이며, 8자리로 표현하면 앞에 0이 두 개 붙어 00110010이 됩니다. 따라서
개요정수 num과 왼쪽(left), 오른쪽(right) 값으로 정의된 범위가 주어졌을 때, 먼저 숫자의 이진수 표현을 구한 뒤 왼쪽 비트부터 오른쪽 비트까지 차례대로 검사하면서 해당 범위 안에 있는 세트 비트의 개수를 계산하는 것이 목표입니다.이진수에서 세트 비트(set bit)란 값이 1인 비트를 의미합니다. 정수를 이진수로 변환하면 0과 1의 조합으로 표현되는데, 컴퓨터 공학에서는 값이 1인 비트를 세트 비트라고 부릅니다.입출력 예시입력 − int number = 50, left = 2, right = 5출력 − 범위 내 총 세
이번 글에서는 평면 위에 주어진 좌표 점들을 이용해 만들 수 있는 평행사변형(parallelogram)의 개수를 계산하는 방법을 다룹니다.평행사변형은 사각형의 한 종류로, 마주 보는 두 변이 서로 평행하며 그에 따라 마주 보는 각의 크기도 서로 같다는 성질을 가지고 있습니다.문제 이해하기예제를 통해 문제를 살펴보겠습니다.입력 −int a[] = {0, 2, 5, 5, 2, 5, 2, 5, 2};int b[] = {0, 0, 1, 4, 3, 8, 7, 11, 10};출력 − 평면 위의 평행사변형 개수: 3설명 − x좌표와 y좌표가 각
정수 배열이 주어졌을 때, 배열의 값들로 만들 수 있는 모든 쌍(pair) 중에서 비트 AND 연산 결과가 홀수가 되는 쌍의 총 개수를 구하는 문제입니다.AND 연산의 진리표비트 AND 연산은 두 비트가 모두 1일 때만 1을 반환합니다.ABA & B000100010111입력 / 출력 예시입력 − int arr[] = {2, 5, 1, 8, 9}출력 − 비트 AND 연산 결과가 홀수인 쌍의 개수: 3설명 −a1a2a1 & a2250210280290511580591180191898핵심 아이디어위 표에서 알 수 있듯이, 두
정수 배열이 하나 주어지며, 이 배열의 값들을 이용해 만들 수 있는 모든 쌍(pair) 가운데 두 값의 비트 AND 연산 결과가 짝수가 되는 쌍의 총개수를 구하는 것이 목표입니다. AND 연산의 진리표 비트 AND 연산은 두 비트가 모두 1일 때만 1을 반환하고, 그 외의 경우에는 0을 반환합니다. ABA AND B 000 100 010 111 입력 − int arr[] = {2, 5, 1, 8, 9} 출력 − AND 결과가 짝수인 쌍의 개수: 7 결과 검증 배열 {2, 5, 1, 8, 9}로 만들 수 있는 모든 쌍의 AN
문제 개요 정수 배열이 하나 주어졌을 때, 배열의 값들을 이용해 만들 수 있는 모든 쌍(pair) 가운데 두 원소에 비트 OR(Bitwise OR) 연산을 적용한 결과가 짝수가 되는 쌍의 총 개수를 구하는 것이 이번 글의 목표입니다. 먼저 OR 연산의 진리표부터 살펴보겠습니다. ABA ∨ B000101011111 진리표에서 알 수 있듯이 OR 연산은 두 비트 중 하나라도 1이면 결과가 1이 됩니다. 여기서 핵심은, 두 수의 OR 결과가 짝수가 되려면 최하위 비트(LSB)가 0이어야 한다는 점이며, 이는 두 수가 모두 짝수일 때만 가