두 개의 정수, 두 개의 실수(float), 그리고 두 개의 문자열을 더할 수 있는 클래스를 만들어야 한다고 가정해 보겠습니다(문자열 덧셈은 사실상 문자열 연결을 의미합니다). 입력의 첫 줄에서는 연산의 총 개수를 나타내는 숫자 n을 받습니다. 이후 각 연산 줄에는 세 가지 요소가 담기는데, 첫 번째는 데이터 타입(int, float, string)이고 두 번째와 세 번째는 연산에 사용될 두 개의 피연산자입니다. 프로그램은 이 값을 읽어 타입에 맞는 연산을 수행한 뒤 결과를 출력해야 합니다.예를 들어 입력이 다음과 같다면,5 int
복소수 덧셈과 연산자 오버로딩실수부(real)와 허수부(imaginary)를 멤버 변수로 가지는 복소수 클래스가 있다고 가정해 보겠습니다. 이 클래스의 두 객체를 더하려면 더하기(+) 연산자를 오버로드해야 하며, 아울러 복소수를 읽기 좋은 형식으로 반환해 주는 함수도 함께 정의해야 합니다.예를 들어 입력이 c1 = 8 - 5i, c2 = 2 + 3i라면, 두 수를 더한 결과인 10 - 2i가 출력되어야 합니다.문제 해결 접근 방법+ 연산자를 오버로드하고, 인자로 다른 복소수 객체 c2를 전달받습니다.실수부와 허수부가 모두 0으로 초
사용자 이름 문자열 목록이 주어졌을 때, 몇 가지 조건을 기준으로 해당 사용자 이름이 유효한지 판별해야 하는 상황을 생각해 봅시다. 특히 사용자 이름의 길이가 5자 미만일 경우 발생시킬 커스텀 예외(custom exception)를 직접 정의해야 합니다.프로그램의 동작 방식은 다음과 같습니다.유효한 사용자 이름 → Valid 출력유효하지 않은 사용자 이름 → Invalid 출력길이가 너무 짧은 사용자 이름 → 예외를 던져 Too short 메시지와 함께 실제 길이 출력유효한 사용자 이름의 조건사용자 이름은 반드시 5자 이상이어야 합
문제 개요n개의 원소를 가진 배열과 값 k가 주어졌다고 가정해 보겠습니다. 이때 우리가 해야 할 일은 크기가 k인 각 연속 부분 배열(슬라이딩 윈도우)에 대해 최댓값을 찾는 것입니다.예를 들어 입력이 arr = [3,4,6,2,8]이고 k = 3이라면, 크기 3의 연속 부분 배열은 [3,4,6], [4,6,2], [6,2,8] 세 가지입니다. 따라서 각 부분 배열의 최댓값은 순서대로 6, 6, 8이 됩니다.알고리즘 접근 방식이 문제는 덱(deque, 양방향 큐) 자료구조를 활용하면 효율적으로 해결할 수 있습니다. 덱에는 배열 원소의
C++에서 first_name(이름)과 last_name(성)이라는 두 개의 속성을 가진 Person 클래스가 있다고 가정해 보겠습니다. 이 클래스에는 이름과 성을 각각 반환하는 get_first_name() 및 get_last_name() 메서드도 함께 정의되어 있습니다. 여기에 cout 문을 사용해 객체의 이름과 성을 한 번에 출력할 수 있도록 스트림 출력 연산자(<<)를 오버로드해야 합니다. 예를 들어, 이름과 성이 각각 Sumit과 Ray인 person 객체가 입력으로 주어지면, 출력 결과는 First name –
C++에서는 연산자 오버로딩(operator overloading)을 활용하면 사용자 정의 클래스 객체에도 기본 연산자를 직관적으로 적용할 수 있습니다. 이번 글에서는 두 개의 행렬 mat1과 mat2를 더하여 세 번째 행렬을 만드는 프로그램을, 더하기(+) 연산자를 오버로드하는 방식으로 구현해 보겠습니다.예를 들어 아래와 같은 두 행렬이 입력으로 주어진다면,589679834763같은 위치에 있는 원소끼리 더한 다음 행렬이 출력됩니다.131113131312문제 해결 접근 방법더하기(+) 연산자를 오버로드합니다. 이 연산자 함수는 두
문제 개요정수(int), long, 문자(char), float, double 등 다양한 데이터 타입의 값이 입력으로 주어졌다고 가정해 보겠습니다. 이때 입력으로 받은 각 값의 정밀도를 그대로 유지한 채 화면에 출력하는 프로그램을 작성해야 합니다.예를 들어, 정수값은 15, long값은 59523256297252, 문자값은 y, float값은 367.124, double값은 6464292.312621로 주어진다면, 출력 결과는 다음과 같습니다.15 59523256297252 y 367.124 6464292.31262해결 방법이 문제
정렬된 n개의 정수 값을 담고 있는 배열 arr이 주어졌다고 가정해 보겠습니다. 또한 크기가 q인 배열 query가 함께 주어지며, query에 포함된 각 값이 배열 arr에 존재하는지 판별해야 합니다. query의 값이 arr에 존재하면 Present와 함께 해당 값이 위치한 인덱스를 출력하고, 존재하지 않으면 Not present와 함께 query 값보다 큰 값 중 최솟값이 위치한 인덱스를 출력합니다. 단, 배열은 1부터 시작하는 인덱스(1-indexed)를 사용한다는 점에 유의해야 합니다. 예를 들어 n = 8, arr =
세 개의 double 값이 주어졌다고 가정해 보겠습니다. 이 값들을 각각 지정된 형식에 맞게 포맷한 뒤 출력해야 합니다. 첫 번째 값의 정수 부분을 소문자 16진수 형식으로 출력합니다. 두 번째 값은 소수점 둘째 자리까지 출력하며, 양수인지 음수인지 나타내는 부호를 앞에 붙입니다. 출력 폭은 총 15자로 오른쪽 정렬하고, 남는 왼쪽 공간은 밑줄(_) 문자로 채웁니다. 세 번째 값은 소수점 아홉째 자리까지 과학적 표기법(scientific notation)으로 출력합니다. 예를 들어 입력이 256.367, 5783.489, 12
C++에서 다단계 상속(Multi-level Inheritance)은 하나의 클래스가 다른 클래스를 상속하고, 그 파생 클래스가 다시 또 다른 클래스에 의해 상속되는 구조를 말합니다. 이번 글에서는 세 개의 클래스인 Vehicle, FourWheeler, Car를 활용해 다단계 상속의 동작 원리를 코드와 함께 자세히 살펴보겠습니다.다단계 상속 구조 이해하기여기서 Vehicle 클래스는 최상위 기반(Base) 클래스이고, FourWheeler 클래스는 Vehicle을 상속받은 1차 파생 클래스입니다. 그리고 Car 클래스는 FourW
정수 값 여러 개가 담긴 정수 배열이 주어졌을 때, 배열 안에서 가장 작은 값과 가장 큰 값의 차이를 구하는 것이 이번 문제의 목표입니다. 이 문제는 C++의 매크로(macro) 기능을 활용해야 풀 수 있으며, 입력은 표준 입력(stdin)으로 받고 결과는 표준 출력(stdout)으로 출력합니다. 예를 들어 배열이 {120, 589, 324, 221, 234}라면 출력 결과는 다음과 같습니다. The answer is : 469 배열에서 가장 큰 값은 589, 가장 작은 값은 120이며, 두 값의 차이인 469가 바로 정답이 됩니
복잡한 수학 연산을 수행하는 함수가 있다고 가정해 보겠습니다. 연산 과정에서는 여러 종류의 예외(exception)가 발생할 수 있으며, 우리는 발생 가능한 다양한 유형의 예외를 상황에 맞게 처리해야 합니다. 구체적인 처리 규칙은 다음과 같습니다. 메모리 부족: 컴퓨터가 연산에 필요한 메모리를 할당하지 못하면 Memory Low!를 출력합니다. C++ 표준 예외: 그 외의 C++ 관련 예외가 발생하면 Exception:을 출력한 뒤 해당 예외의 내용을 함께 출력합니다. 기타 예외: 위 경우에 해당하지 않는 알 수 없는 예외가 발
큰 숫자들이 담긴 배열 nums가 있다고 가정해 봅시다. 각 숫자는 (-231 ~ 231 - 1) 범위에 속하며, 우리의 목표는 이 숫자들을 모두 더한 합계를 구하는 것입니다. 예를 들어 입력이 nums = [5000000003, 3000000005, 8000000007, 2000000009, 7000000011]과 같다면, 출력 결과는 25000000035가 됩니다. 접근 방법 여기서 주목해야 할 점은 개별 숫자 하나하나가 이미 int 자료형의 최대 표현 범위(약 21억)를 초과할 수 있다는 것입니다. 따라서 오버플로우를 방지하
2차원 데카르트 좌표 평면 위에 점(x, y)들의 목록이 주어져 있다고 가정해 봅시다. 두 점 (x0, y0)과 (x1, y1)을 연결할 때 드는 비용은 맨해튼 거리인 |x0 - x1| + |y0 - y1|로 정의됩니다. 임의의 개수만큼 점을 연결할 수 있을 때, 모든 점이 하나의 경로로 연결되도록 만드는 최소 비용을 구하는 것이 이번 문제의 목표입니다.예를 들어 입력이 다음과 같다고 해보겠습니다.points = [[0, 0], [0, 2], [0, -2], [2, 0], [-2, 0], [2, 3], [2, -3]]이 경우 출력은
문제 소개 1과 0으로만 이루어진 행렬이 주어질 때, 행렬 안에서 모든 원소가 1로만 구성된 부분 행렬(submatrix)의 개수를 구하는 프로그램을 만들어 보겠습니다. 예를 들어 아래와 같은 행렬이 입력으로 주어진다고 가정해 보겠습니다. 0010010001011101 이 경우 정답은 12입니다. 접근 방법 이 문제는 2차원 누적 합(prefix sum) 배열과 이진 탐색(binary search)을 조합하면 효율적으로 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다. 누적 합 배열을 미리 계산해 두면, 임의의 직사각형 영역
정수 값으로 구성된 행렬이 주어졌을 때, 요소들의 합이 특정 목표값(target)과 일치하는 부분행렬(submatrix)의 개수를 구하는 문제입니다. 여기서 부분행렬이란 원본 행렬에서 연속된 행과 열을 선택하여 만들 수 있는 직사각형 형태의 작은 행렬을 의미합니다. 문제 예시 다음과 같은 4×4 행렬이 있다고 가정해 보겠습니다. 0010010001011101 목표값이 5일 때, 요소의 합이 5가 되는 부분행렬은 총 3개이므로 출력 결과는 3이 됩니다. 풀이 접근 방법 이 문제는 1차원 배열에서 합이 k인 부분배열의 개수를 세는 고전
양의 정수 n개가 담긴 배열 arr와 정수 j가 주어졌다고 가정해 봅시다. 우리가 수행해야 할 작업은 j개의 숫자를 골라 더하여 하나의 값으로 병합하는 것이며, 병합 비용은 선택한 j개 숫자의 합과 같습니다. 목표는 이러한 병합 연산에 드는 최소 비용을 구하는 것입니다.문제 이해하기예를 들어 입력이 arr = [2, 5, 6, 2, 3, 1, 3], j = 4라면 출력은 31이 됩니다.먼저 2, 3, 1, 3을 병합하면 비용은 2 + 3 + 1 + 3 = 9입니다.병합 후 배열은 [2, 5, 6, 9]가 됩니다. 두 번째 병합 연산
정수들로 이루어진 문자열 형태의 인코딩된 메시지가 주어졌다고 가정해 보겠습니다. 각 숫자는 알파벳의 특정 글자에 매핑됩니다. 즉, a는 1, b는 2, c는 3에 대응되는 식입니다. 여기에 더해, 메시지에는 * 문자가 포함될 수 있는데, 이 문자는 1부터 9까지의 어느 숫자로도 매핑될 수 있습니다. 따라서 메시지 input이 주어졌을 때, 이를 디코딩할 수 있는 서로 다른 방법이 총 몇 가지인지 구해야 합니다. 예를 들어 입력이 input = "18"이라면 출력은 2가 됩니다. 이 메시지는 두 가지 방식으로 디코
문제 소개 양의 정수 하나가 주어졌다고 가정해 봅시다. 우리는 이 숫자를 영어 단어로 풀어 써야 합니다. 예를 들어 숫자 56이 입력으로 주어지면 출력은 Fifty-Six가 되어야 하며, 변환 가능한 범위는 최대 10억(Billion)까지입니다. 따라서 입력이 5678이라면 출력은 Five Thousand Six Hundred Seventy Eight가 됩니다. 해결 접근 방법 이 문제는 사전에 정의된 숫자 매핑 배열과 재귀 함수를 활용하면 간결하게 해결할 수 있습니다. 전체 알고리즘은 다음 단계로 진행됩니다. 1단계: 숫자 매핑
정수로 이루어진 배열이 주어졌다고 가정해 봅시다. 우리의 과제는 배열에 있는 모든 값 쌍(pair) 사이의 차이를 계산한 뒤, 그 차이들 중 k번째로 작은 값을 찾는 것입니다. 인덱스는 0부터 시작하며, k 값은 입력으로 주어집니다.문제 예시예를 들어 입력이 다음과 같다면,numbers = {2, 6, 4, 8}, k = 2출력 결과는 2가 됩니다.각 쌍 사이의 차이는 다음과 같습니다.(2, 6) = 4(2, 4) = 2(2, 8) = 6(6, 4) = 2(6, 8) = 2(4, 8) = 4이 값들을 오름차순으로 정렬하면 2, 2,