어떤 상품이나 서비스의 원가(cost price, cp)와 판매가(selling price, sp)가 주어졌을 때, C 프로그램을 사용하여 이익이 발생했는지 손실이 발생했는지 판별하고 그 금액까지 출력하는 것이 이번 글의 목표입니다. 이익이 발생했다면 Profit과 그 금액을, 손실이 발생했다면 Loss와 그 금액을, 이익도 손실도 없다면 No profit nor Loss를 출력해야 합니다.손익 판별의 기본 원리이익과 손실을 구하려면 판매가(sp)와 원가(cp)를 서로 비교하면 됩니다. 원가가 판매가보다 높다면 물건을 산 가격보다
숫자 n이 주어졌을 때, 길이가 n인 알파벳 삼각형 패턴을 출력하는 프로그램을 만들어 보겠습니다. 첫 번째 줄에는 n개의 문자를 모두 출력하고, 그다음 줄부터는 맨 앞의 문자를 한 개씩 줄여가며 출력하는 방식입니다. 완성된 알파벳 삼각형 패턴은 아래 그림과 같습니다. 입력 − n = 5 출력 입력 − n = 3 출력 문제 해결 접근 방법 n을 입력받은 뒤, 변수 i를 1부터 n까지 반복합니다. 각 i에 대해 변수 j를 i부터 n까지 반복하면서, (A - 1 + j) 계산 결과를 문자(%c)로 변환하여 출력합니다. 안쪽 반복
등비수열이란 무엇인가?이 문제에서는 세 개의 입력값이 주어집니다. 첫 번째는 a로 등비수열의 첫째 항(first term), 두 번째는 r로 공비(common ratio), 세 번째는 n으로 합을 구하려는 항의 개수입니다.등비수열(Geometric Series)은 연속된 두 항 사이의 비율이 항상 일정하게 유지되는 수열입니다. 입력값 a, r, n을 이용하여 등비수열의 각 항인 a, ar, ar2, ar3, ar4, … 을 생성하고, 그 전체 합인 a + ar + ar2 + ar3 + ar4 + … 을 계산하는 것이 목표입니다.입력
문제 개요 하나의 행렬이 주어졌을 때, 서로 다른 두 행에 속한 요소들의 합 사이의 최대 차이를 구하는 것이 이 글에서 다룰 문제입니다. i개의 행과 j개의 열로 이루어진 행렬 M[i][j]가 있고, 각 행을 R0부터 Ri-1까지라고 부르겠습니다. 이때 차이는 (Ry의 요소 합) − (Rx의 요소 합)으로 계산하며, 항상 x < y인 조합만 고려합니다. 예제로 이해하기 입력 1 M[4][4] = { { 1, 2, 0, 5 }, { 0, 1, 1, 0 }, { 7, 2, 3, 2 }, { 1, 2,
배열에서 m개의 요소로 이루어진 두 부분 집합의 합 사이의 최대 차이를 구하는 것이 이번 문제의 목표입니다. 배열과 숫자 m이 주어졌을 때, 먼저 가장 큰 m개의 수의 합을 구한 뒤, 가장 작은 m개의 수의 합을 빼면 최대 차이를 얻을 수 있습니다. 즉, 핵심은 합이 가장 큰 m개의 부분 집합과 합이 가장 작은 m개의 부분 집합을 찾는 것입니다.예시를 통해 문제를 더 자세히 살펴보겠습니다.입력 예시 1arr = {1, 2, 3, 4, 5} ; m = 3출력 예시 1최대 차이 : 6설명: 가장 큰 3개의 수는 3, 4, 5이며 그 합
크기가 N인 정수 배열이 주어지며, 배열의 요소들은 무작위 순서로 배치되어 있습니다. 이 문제의 목표는 더 큰 요소가 더 작은 숫자 뒤에 나타나는 두 요소를 찾아 그 차이를 최대화하는 것입니다. 즉, Arr[j] − Arr[i]가 최대가 되도록 j > i를 만족하는 조합을 구해야 합니다.입력 및 출력 예시입력 1Arr[] = { 2, 1, 3, 8, 3, 19, 21 }출력 — 더 큰 요소가 더 작은 숫자 뒤에 나타나는 두 요소 사이의 최대 차이: 20설명 — 최대 차이는 21과 1 사이에서 발생하며, 배열에서 21은 1 뒤에
크기가 N인 정수 배열이 하나 주어지며, 배열에는 정수들이 무작위 순서로 들어 있습니다. 이 문제의 목표는 배열에서 특정 요소가 처음 등장하는 인덱스(첫 번째 인덱스)와 마지막으로 등장하는 인덱스 사이의 최대 차이를 구하는 것입니다. 즉, 배열에 두 번 이상 나타나는 숫자를 찾아 그 인덱스 간 차이가 가장 큰 값을 계산해야 하며, 해당하는 쌍이 여러 개라면 그중 최대 차이를 결과로 저장합니다.입력 예시 1Arr[] = { 2,1,3,1,3,2,5,5 }출력 − 배열에서 요소의 첫 번째 인덱스와 마지막 인덱스 간 최대 차이 − 5설명
문제 이해하기크기가 N인 정수 배열과 숫자 k가 주어졌을 때, k개의 요소로 이루어진 그룹과 나머지 요소들 사이의 최대 차이를 구하는 것이 이 글의 목표입니다. 배열은 두 부분으로 나뉩니다. 첫 번째 부분은 배열에서 추출한 k개의 요소 그룹이고, 두 번째 부분은 나머지 N-k개의 요소입니다. 우리는 두 그룹의 합 사이의 차이가 최대가 되도록 k개의 요소를 선택해야 합니다.핵심 아이디어는 다음과 같습니다.k가 작은 경우(배열 크기의 절반 이하): 가장 작은 k개의 요소는 합이 최소가 되고, 나머지 N-k개의 요소는 합이 최대가 됩니다
두 개의 사물함 L1과 L2가 있으며, 각각 동전 형태로 돈이 들어 있다고 가정해 보겠습니다. L1에는 A개의 동전이, L2에는 B개의 동전이 들어 있습니다. 우리는 이 사물함들에서 동전을 인출하되, 인출한 총 금액이 최대가 되도록 만들어야 합니다. 사물함에서 동전을 인출할 때마다 해당 사물함은 이전 개수보다 1개 적은 동전으로 다시 채워집니다. 즉, L1에서 A개의 동전을 인출하면 A-1개로 채워지고, L2에서 B개의 동전을 인출하면 B-1개로 채워집니다. 따라서 과제는 정확히 두 번의 인출 단계 동안 인출 금액을 최대화하는 것입
연속된 상자에 들어 있는 초콜릿의 개수가 배열 형태로 주어지고, 이 초콜릿을 나눠 받을 학생 수 k가 함께 주어집니다. 우리가 해야 할 일은 연속된 상자들을 선택하여 그 안에 든 초콜릿의 합이 k명의 학생에게 정확히 똑같이 나누어질 수 있도록 하는 것이며, 동시에 그 합이 최대가 되도록 만들어야 합니다.이 문제는 본질적으로 k로 나누어떨어지는 최대 합 부분 배열(maximum sum subarray divisible by k)을 찾는 문제입니다. 배열을 왼쪽에서 오른쪽으로 순회하면서 초콜릿 개수를 차례로 더하고, 그 합을 k로 나눕
알파벳으로 구성된 문자열이 주어졌을 때, 문자열 안에는 동일한 문자가 최소 두 번 이상 등장할 수 있습니다. 이 문제의 목표는 같은 문자가 등장하는 임의의 두 위치 사이에 존재하는 문자 수의 최댓값을 구하는 것입니다. 만약 문자열에 중복된 문자가 전혀 없다면 -1을 반환해야 합니다.문제 예시예제 1입력 − str = abcdba출력 − 문자열에서 같은 두 문자 사이의 최대 문자 수 : 4설명 − 반복되는 문자는 a와 b이며 각 인덱스는 다음과 같습니다.1. a : 첫 번째 인덱스 0, 마지막 인덱스 5 → 사이 문자 수 = 5 -
정수로 이루어진 배열이 주어지며, 이 배열에는 동일한 요소가 여러 번 등장할 수 있습니다. 이 문제의 목표는 배열에서 같은 요소 두 개 사이의 최대 거리를 찾는 것입니다.해결 방법은 다음과 같습니다. 배열의 왼쪽부터 각 요소를 하나씩 선택한 뒤, 그 숫자가 마지막으로 나타나는 위치를 찾아 인덱스 간의 차이를 계산합니다. 이 차이가 지금까지 발견한 값 중 가장 크다면 결과로 저장하고, 모든 탐색이 끝난 후 최종 값을 반환하면 됩니다.입력 및 출력 예시예시 1Arr[] = { 1,2,4,1,3,4,2,5,6,5 }출력: 배열에서 동일한
C와 C++에서는 여러 가지 방법으로 상수를 선언할 수 있습니다. 각 방법을 살펴보기에 앞서, 먼저 상수가 무엇인지 정확히 이해해야 합니다. 상수란 무엇인가? 상수(Constant)란 변경할 수 없는 값을 의미합니다. 프로그래밍 관점에서 보면, 상수는 변수에 할당되는 고정된 값으로 프로그램 실행 중에 다른 변수나 구성 요소가 이를 임의로 변경할 수 없습니다. 상수는 어떤 데이터 타입으로도 선언할 수 있으며, 프로그램 내에서 변하지 않는 요소를 정의할 때 사용됩니다. 예를 들어 원주율(π)은 3.14라는 고정된 실숫값을 가지므로 상
정수로 이루어진 배열이 하나 주어집니다. 우리가 해야 할 일은 값과 인덱스 차이 합의 최대 절댓값을 구하는 것입니다. 즉, 배열 내 모든 인덱스 쌍 (i, j)에 대해 |Arr[i] − Arr[j]| + |i − j|를 계산한 뒤, 그중 가장 큰 값을 찾으면 됩니다. 여기서 |A|는 A의 절댓값을 의미합니다.예를 들어 배열의 요소가 4개라면 인덱스는 0, 1, 2, 3이 되고, 가능한 고유한 쌍은 (0,0), (1,1), (2,2), (3,3), (0,1), (0,2), (0,3), (1,2), (1,3), (2,3) 입니다.입력
정수로 이루어진 배열이 주어졌을 때, 최소한의 비교 횟수만으로 배열의 최댓값과 최솟값을 찾는 것이 이번 글의 목표입니다.문제 이해하기입력 1Arr[] = { 1, 2, 4, 5, -3, 91 }출력 1최댓값 : 91 최솟값 : -3설명 − 비교 횟수를 줄이기 위해 먼저 최댓값(max)과 최솟값(min) 변수를 첫 번째 요소인 Arr[0]으로 초기화합니다. 그다음 두 번째 요소부터 시작해 각 값을 min과 max와 차례로 비교하면서 조건에 맞게 갱신해 나갑니다.입력 2Arr[] = { 10, 20, 21, 31, 18, 11 }출력
문제 개요 양수와 음수가 섞여 있는 정수 배열이 주어졌을 때, 배열의 요소들로 만들 수 있는 양수 부분 집합과 음수 부분 집합 사이의 차이를 최대화하는 것이 이번 문제의 목표입니다. 핵심 아이디어는 생각보다 간단합니다. (양수의 합) − (음수의 합)은 항상 최댓값이 됩니다. 음수를 빼는 것은 결국 그 절댓값을 더하는 것과 같기 때문입니다. 따라서 배열의 모든 음수를 양수로 바꾼 뒤 전체 요소를 더하면 원하는 결과를 얻을 수 있습니다. 예제 1 입력 − Arr[] = { -2, 0, -3, 8, 10, 12, -4 } 출력 − 두
양의 정수 N이 주어졌을 때, 모든 이항 계수(binomial coefficient) 중에서 가장 큰 값을 찾는 문제를 살펴보겠습니다.문제 정의이항 계수 수열은 다음과 같이 표현됩니다.nC0, nC1, nC2, …, nCr, …, nCn-2, nCn-1, nCn여기서 우리가 구해야 할 것은 nCr의 최댓값입니다. 이항 계수는 아래 공식으로 계산할 수 있습니다.nCr = n! / (r! × (n − r)!)예제 1입력: N = 4출력: 최대 계수 = 6설명: 4C0 = 1, 4C1 = 4, 4C2 = 6, 4C3 = 4, 4C4 =
문제 개요크기가 N인 배열이 주어지며, 처음에는 모든 요소가 0으로 초기화되어 있습니다. 이 배열에 총 N번의 이동(move)을 수행한 뒤, 최종 배열에 남아 있는 1의 개수를 구하는 것이 과제입니다. 각 i번째 이동에는 다음과 같은 규칙이 적용됩니다.1번째 이동 – 위치 1, 2, 3, 4, … 에 있는 요소를 변경(토글)2번째 이동 – 위치 2, 4, 6, 8, … 에 있는 요소를 변경(토글)3번째 이동 – 위치 3, 6, 9, 12, … 에 있는 요소를 변경(토글)즉, i번째 이동에서는 i의 배수에 해당하는 위치의 값을 뒤집습
문제 개요직각 이등변 삼각형은 두 변의 길이가 같은 이등변 삼각형 중에서 높이(그림의 ag)와 밑변(그림의 dg)이 서로 수직을 이루는 삼각형입니다. 이 문제의 목표는 한 변의 길이가 2인 정사각형이 직각 이등변 삼각형 안에 최대 몇 개까지 들어갈 수 있는지 구하는 것입니다. 밑변과 높이(두 값이 동일함)가 입력으로 주어지며, 들어갈 수 있는 정사각형의 개수가 출력됩니다.아래 그림을 참고하면 문제를 더 쉽게 이해할 수 있습니다.핵심 아이디어높이 ag와 밑변 gd를 가진 삼각형에는 한 변이 2인 정사각형 3개가 들어갑니다. 여기서 중
길이가 size인 정수 배열 candies[]가 주어집니다. 각 원소 candies[i]는 i번째 종류의 사탕이 몇 개 있는지를 나타냅니다. 우리의 목표는 아래 조건을 만족하면서 가능한 한 많은 사탕을 구매하는 것입니다.문제의 조건i번째 종류의 사탕을 X[i]개(단, 0 ≤ X[i] ≤ candies[i])만큼 구매한다면, 모든 j(1 ≤ j ≤ i)에 대해 다음 조건 중 적어도 하나는 반드시 참이어야 합니다.X(j) < X(i) : j번째 종류의 구매량이 i번째 종류의 구매량보다 적다X(j) = 0 : j번째 종류의 사탕은