연결 리스트(Linked List)란?연결 리스트는 각 노드가 두 개의 부분으로 구성된 선형 자료구조입니다. 하나의 부분에는 노드의 값 또는 데이터가 저장되고, 다른 부분에는 다음 노드의 주소가 저장됩니다.이번 문제에서는 각 노드가 리스트 내의 다른 노드를 가리킬 수 있는 연결 리스트가 주어진다고 가정합니다. 우리의 과제는 두 연결 리스트가 서로 교차하는 지점의 노드를 찾는 것입니다. 만약 두 리스트가 교차하지 않는다면 NULL 또는 빈 값을 결과로 반환해야 합니다.문제 예시입력 예시 1출력:2설명: 주어진 두 연결 리스트가 값 2
C++에서는 두 문자열을 병합하는 다양한 방법이 있지만, 이번 글에서는 두 문자열을 하나로 합치면서 사전순(lexicographical order)으로 가장 큰 결과를 만드는 방법을 알아보겠습니다.문제 정의두 문자열 a와 b, 그리고 결과를 저장할 문자열 merge가 주어진다고 가정해 봅시다. 다음 규칙에 따라 merge를 채워야 합니다.문자열 a가 비어 있지 않으면, a의 첫 번째 문자를 꺼내 merge에 추가합니다.문자열 b가 비어 있지 않으면, b의 첫 번째 문자를 꺼내 merge에 추가합니다.두 문자열이 모두 남아 있는 경우
세 개의 숫자가 주어져 있다고 가정해 봅시다. 이때 우리가 해야 할 과제는, 매번 두 개의 숫자에서 1씩 빼는 연산만 허용될 때 모든 숫자를 0으로 만들기 위해 필요한 최적의(최소) 단계 수를 구하는 것입니다.문제 예시입력:a = 4b = 4c = 6출력:7설명: 모든 숫자를 0으로 만들기까지의 최적 단계는 다음과 같습니다.초기 상태: (4, 4, 6)1번째와 2번째 숫자에서 1씩 제거 → (3, 3, 6)1번째와 3번째 숫자에서 1씩 제거 → (2, 3, 5)1번째와 3번째 숫자에서 1씩 제거 → (1, 3, 4)1번째와 3번째
문제 개요세 개의 정수 a, b, limit가 주어졌을 때, [a, limit] 범위 내에 속하는 수들 중에서 특정 형태로 표현되는 숫자들을 찾아 출력하는 것이 이번 문제의 목표입니다. 이러한 숫자들을 강력한 정수(Powerful Integers)라고 부르며, 다음과 같이 정의합니다.aⁱ + bʲ (단, i ≥ 0 이고 j ≥ 0)예시로 이해하기입력:a = 2b = 5limit = 10출력:[2, 3, 5, 6, 7, 9]설명: 가능한 모든 지수 조합(i, j)에 대해 계산하면 다음과 같습니다.2⁰ + 5⁰ = 2 /&n
연결 리스트란?연결 리스트(Linked List)는 각 노드가 두 개의 블록으로 구성되는 선형 자료구조입니다. 한 블록에는 노드의 값(데이터)이 저장되고, 다른 블록에는 다음 노드의 주소가 저장됩니다.각 노드가 데이터와 다음 노드를 가리키는 포인터를 담고 있는 연결 리스트가 있다고 가정해 보겠습니다. 이때 과제는 주어진 연결 리스트를 분리(segregate)하는 것입니다. 여기서 분리란 리스트 안에서 홀수 인덱스에 있는 노드들과 짝수 인덱스에 있는 노드들을 나누어 재배치하는 작업을 의미합니다.문제 해결 접근 방식주어진 연결 리스트를
문자열을 거꾸로 뒤집어도 원래 문자열과 동일하게 유지된다면, 이를 회문(palindromic string)이라고 합니다.이번 문제에서는 길이가 같은 두 문자열 a와 b가 주어집니다. 임의의 인덱스를 기준으로 두 문자열을 분할한 뒤, 분할된 부분들을 서로 조합했을 때 회문을 만들 수 있는지 확인하는 것이 과제입니다.예를 들어 길이가 4인 두 문자열 a와 b를 인덱스 3에서 다음과 같이 분할했다고 가정해 보겠습니다.aaa | b 와 bbb | a이때 aaa(첫 번째 문자열의 접두사) + a(두 번째 문자열의 접미사
이진 트리가 주어졌을 때, 해당 트리가 자기 자신의 대칭 구조를 이루는지 확인하는 것이 과제입니다. 대칭 이진 트리(Symmetric Binary Tree)란 자기 자신의 거울상(mirror image)을 만드는 트리를 의미합니다.예시입력-1:출력:True설명:주어진 이진 트리가 자기 자신의 거울상을 이루므로 출력은 True입니다.입력-2:출력:False설명:주어진 이진 트리가 자기 자신의 거울상을 만들지 않으므로 대칭 트리가 아닙니다.문제 해결 접근 방법대칭 이진 트리는 자기 자신이 거울상을 이루는 트리입니다. 즉, 트리의 왼쪽
C#과 C++는 이름은 비슷하지만 설계 철학과 동작 방식이 확연히 다른 두 프로그래밍 언어입니다. 각 언어의 특징을 먼저 살펴본 뒤, 핵심 차이점을 표로 정리해 비교해 보겠습니다. C#이란? C#(발음: 씨 샤프)은 마이크로소프트의 Anders Hejlsberg와 그의 팀이 개발한 범용 객체지향 프로그래밍 언어입니다. 순수 객체지향 언어로 간주되며, 모든 코드가 클래스와 객체 중심으로 구성됩니다. 메모리 관리는 가비지 컬렉터(Garbage Collector)가 자동으로 수행하므로, 개발자가 객체를 직접 삭제할 필요가 없습니다.
이 글에서는 C++ 프로그래밍 언어를 기준으로 객체(Object)와 클래스(Class)의 차이점을 자세히 살펴보겠습니다. 두 개념은 객체 지향 프로그래밍(OOP)의 핵심이므로 정확히 이해하는 것이 중요합니다.C++에서 클래스란?클래스는 C++에서 객체 지향 프로그래밍을 구현하는 데 도움이 되는 코드의 기본 구성 단위입니다.사용자가 직접 정의할 수 있는 사용자 정의 타입입니다.클래스는 자체적인 데이터 멤버(data members)와 멤버 함수(member functions)를 가질 수 있습니다.이러한 데이터 멤버와 멤버 함수는 클래스
OpenCV는 오픈소스 컴퓨터 비전(Open Source Computer Vision)을 의미합니다. 컴퓨터 비전 작업을 위한 공통 인프라를 지원하고, 시스템 동작을 실제 제품에 적용할 수 있도록 만들어진 라이브러리로, 주로 이미지 처리, 얼굴 인식, 영상 캡처, 검색, 객체 탐지 등에 활용됩니다.OpenCV를 사용하면 얼굴 인식 및 감지, 영상 속 인간 행동 분석, 객체 식별, 카메라 움직임 기록, 움직이는 물체 추적, 여러 이미지를 결합하여 고해상도 이미지를 생성하는 등 다양한 작업을 구현할 수 있습니다.그렇다면 OpenCV의
OpenCV 설치는 크게 세 단계로 나누어 진행됩니다. 필요한 소프트웨어를 모두 다운로드하고 설치하기 Visual Studio에서 OpenCV를 사용할 수 있도록 준비하기 Visual Studio와 OpenCV 연동하기 지금부터 각 단계를 하나씩 자세히 살펴보겠습니다. 1단계 - 필요한 소프트웨어 다운로드 및 설치 Microsoft Visual Studio 환경에서 OpenCV를 사용할 것이므로, 먼저 Visual Studio와 OpenCV를 다운로드해야 합니다. Visual Studio OpenCV CMake 각 소프트
이 글에서는 C++에서 OpenCV 라이브러리를 사용해 이미지를 불러오고 화면에 표시하는 방법을 단계별로 살펴봅니다. OpenCV에서 이미지를 다루기 위해 반드시 이해해야 할 핵심 요소들을 하나씩 정리했습니다.OpenCV 이미지 처리의 핵심 구성 요소1. MatMat은 함수가 아니라 데이터 구조, 즉 변수의 한 유형입니다. C++의 int, char, string 같은 자료형처럼 Mat은 OpenCV 고유의 변수형으로, 이미지를 저장할 수 있는 행렬(matrix) 데이터 구조를 생성합니다. 예제 코드의 Mat myImage;는 my
이 글에서는 OpenCV로 불러온 이미지를 컴퓨터의 원하는 위치에 저장하는 방법을 알아보겠습니다.OpenCV는 이미지를 지정한 파일로 저장할 수 있도록 imwrite() 함수를 제공합니다. 이때 파일 확장자가 곧 이미지 형식을 결정합니다. 예를 들어 확장자를 .jpg로 지정하면 JPEG 형식으로, .png로 지정하면 PNG 형식으로 저장됩니다.imwrite() 함수의 기본 문법imwrite(저장할 경로/확장자를 포함한 이미지 이름, 소스 행렬)여기서 저장할 경로는 이미지를 저장하고 싶은 위치를 의미합니다. 아래 예제에서는 이미지를
이미지 배열이란 무엇인가?배열(Array)은 같은 종류의 데이터를 하나의 이름 아래 순서대로 저장하고, 인덱스 번호를 통해 손쉽게 접근할 수 있게 해주는 편리한 자료 구조입니다. 반복되는 데이터를 일일이 변수로 선언하지 않고도 깔끔하게 관리할 수 있다는 것이 가장 큰 장점입니다.OpenCV에서도 이 개념을 그대로 활용할 수 있습니다. 여러 장의 이미지를 하나의 이미지 배열에 불러온 뒤, 배열의 인덱스 번호를 사용해 원하는 이미지를 화면에 표시하는 방식입니다. 예를 들어 이미지 10장을 처리해야 할 때 변수 10개를 따로 만드는 대신
이번 글에서는 C++와 OpenCV를 활용해 이미지의 채널 수(channel)를 확인하는 방법을 알아봅니다. 프로그램을 실행하면 해당 이미지의 채널 수가 콘솔 창에 출력됩니다. 이미지의 채널 수를 얻으려면 OpenCV에서 제공하는 channels() 함수를 사용하면 됩니다. 이미지를 담고 있는 Mat(행렬) 객체에 이 함수를 호출하면 해당 이미지의 채널 수가 정수 값으로 반환됩니다. 참고로 일반적인 컬러 이미지는 파랑(B), 초록(G), 빨강(R)으로 구성된 3개의 채널을 가지며, 그레이스케일(흑백) 이미지는 1개의 채널만 가집니
RGB 이미지는 빨강(Red), 초록(Green), 파랑(Blue)의 세 가지 채널로 구성되어 있습니다. 이처럼 빨강, 초록, 파랑 채널이 이미지를 표현하는 색 공간을 RGB 색 공간이라고 부릅니다. 다만 OpenCV에서는 RGB 순서 대신 BGR 순서를 사용합니다. 즉, 첫 번째 채널은 파랑, 두 번째 채널은 초록, 세 번째 채널은 빨강을 의미합니다. 1. 세 개의 채널을 담을 행렬 선언하기 RGB 이미지를 각 채널로 분리하려면 먼저 3개의 채널을 저장할 수 있는 행렬 배열을 정의해야 합니다. 이때 다음과 같이 선언합니다. Mat
색상 공간(Color Space)은 색을 표현하는 모델을 의미합니다. 색을 기술하는 방법은 여러 가지가 있으며, 대표적으로 RGB, CMYK, HSV, 그레이스케일(Grayscale) 등이 있습니다.이번 글에서는 imgproc.hpp라는 새로운 헤더 파일을 사용합니다. 이 헤더는 Image Processing(이미지 처리)의 약자로, OpenCV의 이미지 처리 관련 함수들이 정의되어 있습니다. 색상 공간을 변환하려면 OpenCV의 cvtColor() 함수를 사용해야 하는데, 이 함수가 바로 imgproc 헤더 파일에 정의되어 있기
이진 이미지란 무엇인가?이진 이미지(Binary Image)는 검정과 흰색, 단 두 가지 색상만으로 표현되는 디지털 이미지입니다. 이미지 처리 관점에서 보면 이진 이미지의 각 픽셀은 0과 1이라는 두 가지 값만 가질 수 있습니다. 픽셀 값이 0이면 순수한 검정색을, 1이면 순수한 흰색을 의미합니다.그레이스케일 이미지의 각 픽셀은 256가지 서로 다른 값을 가질 수 있는 반면, 이진 이미지는 오직 두 가지 값만 가집니다. 이진 이미지는 다양한 분야에서 활용됩니다. 예를 들어 모폴로지 변환(morphological transformat
이진 이미지(binary image)를 반전(inversion)한다는 것은 이미지의 픽셀 값을 뒤집는 작업을 의미합니다. 시각적인 관점에서 보면, 이진 이미지를 반전하면 흰색 픽셀은 검은색으로, 검은색 픽셀은 흰색으로 서로 바뀌게 됩니다.이 과정은 크게 세 단계로 진행됩니다. 먼저 컬러 이미지를 그레이스케일로 변환하고, 다음으로 임계값 처리(thresholding)를 통해 이진 이미지를 만든 후, 마지막으로 비트 연산 함수를 사용해 이미지를 반전합니다.1단계: 컬러 이미지를 그레이스케일로 변환이미지 반전 작업의 기반이 되는 함수의
디지털 이미지는 수많은 픽셀(pixel)로 구성되어 있습니다. OpenCV를 사용하면 이미지의 픽셀 값을 손쉽게 읽을 수 있지만, 픽셀 값을 제대로 얻기 위해서는 단일 채널(single channel) 형태로 변환한 후 각각 따로 처리해야 합니다.이 글에서는 컬러 이미지를 그레이스케일(단일 채널) 이미지로 변환한 뒤, 각 픽셀의 밝기 값을 콘솔 창에 출력하는 방법을 알아봅니다.핵심 개념 정리먼저 예제 코드에서 사용되는 주요 요소들을 살펴보겠습니다.1. Mat 클래스OpenCV에서 이미지는 Mat(매트릭스) 객체로 저장됩니다. 예제에