C++에서 HashMap(map)을 순회(iteration)하는 동안 특정 값(value)을 기준으로 항목을 제거하는 방법을 알아보겠습니다.문제 예시입력: HashMap: { 1: Mango, 2: Orange, 3: Banana, 4: Apple }, value=Banana 출력: HashMap: { 1: Mango, 2: Orange, 4: Apple } 설명: 세 번째 키-값 쌍이 값 Banana를 기준으로 제거되었습니다. 입력: HashMap: { 1: Yellow, 2: White, 3: Green }, value=W
이 글에서는 주어진 고유한 숫자 배열에서 XOR 값이 0이 되는 고유한 삼중항(x, y, z)의 개수를 구하는 방법을 다룹니다. 여기서 고유한 삼중항이란 세 요소가 모두 서로 달라야 하며, 동일한 삼중항의 순열 조합은 하나로만 계산한다는 의미입니다.먼저 예시를 통해 문제를 이해해 보겠습니다.입력 : arr[ ] = { 5, 6, 7, 1, 3 }출력 : 2설명 : XOR 값이 0이 되는 삼중항은 { 5, 6, 3 }과 { 6, 7, 1 } 입니다.입력 : arr[ ] = { 3, 6, 8, 1, 5, 4, 12 }출력 : 3설명 :
이 글에서는 그리드(grid) 위의 한 지점 A에서 다른 지점 B까지 이동할 수 있는 총 경로의 수를 구하는 문제를 다룹니다. 여기서 A는 그리드의 왼쪽 위 꼭짓점, B는 오른쪽 아래 꼭짓점으로 고정되어 있습니다.입력 : N = 5출력 : 252입력 : N = 4출력 : 70입력 : N = 3출력 : 20주어진 문제는 간단한 관찰만으로도 답을 공식화할 수 있으며, 이를 통해 빠르게 결과를 얻을 수 있습니다.문제 해결 접근 방법이 접근 방식은 간단한 관찰을 바탕으로 문제의 답을 하나의 공식으로 만듭니다. 그리드에서 A 지점에서 B 지
괄호 시퀀스가 주어졌을 때, 잘못된 괄호를 제거하여 만들 수 있는 모든 유효한 괄호 조합을 출력해야 합니다. 아래 예시를 통해 문제를 살펴보겠습니다. 입력 : str = "()())()" 출력 : ()()() (())() 가능한 해답은 두 가지입니다. "()()()" 와 "(())()" 입력 : str = "(v)())()" 출력 : (v)()() (v())() 이 문제는 백트래킹(backtracking) 기법을 활용하여 모든 유효한 시퀀스를 출력하는 방식으
2로 나누어 떨어지는 정수를 짝수(even number)라고 합니다. 이 글에서는 숫자 n이 주어졌을 때, 자릿수의 합이 짝수인 n번째 숫자를 찾는 방법을 다룹니다. 자릿수의 합이 짝수인 첫 다섯 개의 숫자는 2, 4, 6, 8, 11입니다. 예를 들어 다음과 같습니다. 입력 : n = 5 출력 : 11 설명 : 자릿수의 합이 짝수인 처음 5개의 숫자는 2, 4, 6, 8, 11이며, 즉 5번째 숫자는 11입니다. 입력 : n = 12 출력 : 24 문제 해결 접근 방식 주어진 문제를 해결하기 위한 두 가지 서로 다른 방법을 소
트리가 주어졌을 때, 루트에서 리프까지 이어지는 경로 중 길이가 주어진 값 k보다 짧은 경로의 리프 노드를 제거하는 문제를 살펴보겠습니다.문제 예시입력 —K = 4출력 —문제 분석주어진 경로는 다음과 같습니다. 1. A -> B -> C -> E 길이 = 4 2. A -> B -> C -> F 길이 = 4 3. A -> B -> D 길이 = 3 4. A -> G -> H 길이 = 3 5. A -> B -> I 길이 = 3 경로 3,
문제 소개이진수가 하나 주어졌을 때, 비트를 정확히 하나 제거하여 남은 수가 가능한 모든 경우 중 가장 큰 값이 되도록 만드는 문제입니다. 예시를 통해 살펴보겠습니다.입력 : N = 1011 출력 : 111 설명 : 비트 하나를 제거해야 합니다. 0을 제거하면 111이 되지만, 1을 제거하면 101 또는 011이 됩니다. 111 > 101, 011이므로 0을 제거하는 것이 가장 큰 값을 만듭니다. 입력 : 111 출력 : 11 설명 : 모든 비트가 1이므로 어떤 비트를 제거하더라도 결과는 동일합니다.접근 방법브루트 포스(완전
파일 이름 처리나 데이터 정제 작업을 하다 보면 문자열에서 :, ?, \, /, <, >, |, *처럼 시스템에서 허용되지 않는 특수 문자를 걸러내야 하는 경우가 많습니다. 이번 글에서는 C++로 이러한 금지된 문자를 제거하는 함수를 직접 구현하는 방법을 알아보겠습니다. 문제 이해하기 입력: str = "Hello: Welco*me/ to Tu>torials point|." 출력: "Hello Welcome to Tutorials point." 설명: 입력 문자열에 포함된 금지
이 문제에서는 주어진 범위 L과 R 사이에 있는 모든 비트가 설정(set)된 숫자의 값을 구해야 합니다. 즉, L번째 비트부터 R번째 비트까지만 1이고 나머지 비트는 모두 0인 숫자를 찾는 것입니다. 예를 들어 다음과 같습니다. 입력: L = 1, R = 5 출력: 62 설명: 주어진 L과 R을 이진수로 표현하면 0..0111110 입니다. 입력: L = 1, R = 4 출력: 30 설명: 주어진 L과 R을 이진수로 표현하면 0..011110 입니다. 해결 방법 이 문제는 크게 두 가지 접근법으로 해결할 수 있습니다. 하나는 단순
이 글에서는 주어진 점 집합을 가장 잘 표현하는 직선을 구하는 방법을 살펴봅니다. 점들의 좌표 값(x, y)이 주어졌을 때, 최적의 직선 y = mx + c를 찾아야 합니다. 즉, 우리가 구해야 할 것은 기울기 m과 y절편 c의 값입니다.입력: no_of_points = 4 x1 = 2, y1 = 3, x2 = 5, y2 = 6, x3 = 1, y3 = 3, x4 = 4, y4 = 5. 출력: m = 0.8, c = 1.85 설명: 구한 m과 c의 값을 식 y = mx + c에 대입하면 모든 점을 포괄하는 최적의 직선을 얻을 수
이 글에서는 1부터 n(주어진 값)까지의 숫자 중, 2부터 10 사이의 어떤 수로도 나누어 떨어지지 않는 숫자를 찾는 문제를 다룹니다. 먼저 예시를 통해 문제를 이해해 보겠습니다.입력 : num = 14 출력 : 3 설명 : 1, 11, 13 세 개의 숫자는 2~10 사이의 어떤 수로도 나누어 떨어지지 않습니다. 입력 : num = 21 출력 : 5 설명 : 1, 11, 13, 17, 19 다섯 개의 숫자가 해당됩니다.문제 해결 접근 방식단순한 방법1부터 num까지의 모든 숫자에 대해 2~10 사이의 어떤 수로 나누어 떨어지는지
이번 글에서는 숫자 N이 주어졌을 때, 이를 가능한 한 많은 소수의 합으로 분해하는 문제를 다뤄보겠습니다. 먼저 예제를 통해 문제를 이해해 보겠습니다. 입력: N = 7 출력: 2 2 3 설명: 7은 2 두 개와 3 하나의 합으로 표현할 수 있으며, 이것이 가능한 최대 개수의 소수입니다. 입력: N = 17 출력: 2 2 2 2 2 2 2 3 해결 접근 방법 일반적으로 숫자를 소수의 합으로 표현하려면 N에서 소수를 하나 빼고, 남은 값이 소수인지 확인하는 방식을 떠올릴 수 있습니다. 남은 값이 소수라면 N을 두 소수의 합으로
이 튜토리얼에서는 하나의 숫자를 최소 개수의 의사 이진수(pseudo-binary number)들의 합으로 표현하는 방법을 다룹니다. 의사 이진수란 0과 1이라는 이진 자릿수만으로 구성된 수를 말하며, 대표적인 예로 00, 11, 10, 100, 111, 1011 등이 있습니다.먼저 숫자를 의사 이진수의 합으로 나타낸 몇 가지 예시를 살펴보겠습니다.입력 : 23출력 : 11 + 11 + 1설명 : 23 = 11 + 11 + 1, 즉 의사 이진수(11, 11, 1)의 합이 23입니다.입력 : 50출력 : 10 + 10 + 10 + 1
이 글에서는 어떤 수를 다른 수의 거듭제곱들로 표현할 수 있는지 판별하는 문제를 다룹니다. 두 개의 수 x와 y가 주어졌을 때, x의 각 거듭제곱을 최대 한 번씩만 사용하여 y를 표현할 수 있는지 확인해야 합니다.입력: x = 4, y = 11출력: true설명: 4^2 − 4^1 − 4^0 = 11 이므로 y는 x의 거듭제곱으로 표현할 수 있습니다.입력: x = 2, y = 19출력: true설명: 2^4 + 2^1 + 2^0 = 19 이므로 y는 x의 거듭제곱으로 표현할 수 있습니다.입력: x = 3, y = 14출력: fals
이 글에서는 주어진 행렬(2차원 배열) 안에서 합이 특정 값(SUM)과 일치하는 두 원소의 쌍(pair)을 찾는 프로그램을 다뤄보겠습니다. 먼저 예시를 통해 문제를 이해해 보겠습니다.입력 : matrix[n][m] = { { 4, 6, 4, 65 }, { 56, 1, 12, 32 }, { 4, 5, 6, 44 }, { 13, 9, 11, 25 } }, SUM = 20 출력 : Pair exists. (쌍이 존재함) 설명 : 9와 11의 합이 20이며, 이 두 숫자는 행렬 안에 실제로 존재합니다.
이 글에서는 주어진 행렬(matrix) 또는 2차원 배열에서 최대 합을 가지는 쌍(pair)을 찾는 방법에 대해 알아보겠습니다.입력 : matrix[m][n] = { { 3, 5, 2 }, { 2, 6, 47 }, { 1, 64, 66 } } 출력 : 130 설명 : 요소 쌍 64와 66의 합인 130이 최대 합입니다. 입력 : matrix[m][n] = {
이 글에서는 서로 중복되지 않는(distinct) 요소들로 구성된 배열이 주어졌을 때, 절댓값이 같은 양수와 음수 쌍을 찾아 정렬된 순서로 출력하는 문제를 다룹니다.입력 : arr[] = { 1, -1, 11, 12, 56, 77, -56, -12, -88 }출력 : -1 1 -12 12 -56 56입력 : arr[] = {30, 40, 50, 77, -51, -50, -40}출력 : -40 40 -50 50문제 해결 접근 방법가장 먼저 떠오르는 방법은 브루트 포스(Brute Force, 완전 탐색) 방식이며, 여기에 더해 시간 복
나눗셈 알고리즘을 활용해 부호 없는 정수를 나누는 방법을 살펴보겠습니다. 나눗셈 알고리즘 중 일부는 종이 위에서 손으로 계산하는 방식으로 적용되고, 또 다른 알고리즘은 디지털 회로에 직접 구현됩니다. 나눗셈 알고리즘은 크게 느린(slow) 나눗셈 알고리즘과 빠른(fast) 나눗셈 알고리즘 두 가지 유형으로 나눌 수 있으며, 느린 나눗셈 알고리즘에는 복원(restoring) 방식, 비수행 복원(non-performing restoring) 방식, SRT 방식, 비복원(non-restoring) 방식이 포함됩니다.이 튜토리얼에서는 0
이 글에서는 확장 행렬(Expanding Matrix)과 관련된 문제를 다룹니다. 확장 행렬이란 크기가 일정한 배율에 따라 지속적으로 증가하는 행렬을 의미합니다.여기서는 문자로 구성된 행렬이 배율 2로 확장되는 경우를 살펴봅니다. 원래 행렬의 크기가 N × N이라면, 확장된 행렬의 크기는 2N × 2N이 됩니다. 특정 위치 (i, j)에 있는 문자열 시퀀스가 주어졌을 때, 바로 왼쪽에 위치한 시퀀스, 즉 (i, (j-1)%N) 위치의 값을 반환해야 합니다.확장 행렬의 구조 이해하기초기 확장 행렬을 시각화하면서 문제를 이해해 보겠습니
이진 탐색 트리(Binary Search Tree, BST)가 주어졌을 때, 특정 키(key) 값까지의 경로에 있는 노드들을 역순으로 뒤집어야 하는 상황을 가정해 보겠습니다. 아래 예시를 통해 어떤 변화가 일어나는지 확인할 수 있습니다. 해결 접근 방법 이 방법의 핵심은 큐(queue)를 하나 준비하고, 루트에서 출발하여 목표 키를 가진 노드를 만날 때까지 경로상의 모든 노드 값을 순서대로 큐에 삽입하는 것입니다. 그런 다음 키 노드를 발견하면, 재귀 호출이 되감기면서 지금까지 쌓아 온 큐의 맨 앞(front) 값부터 차례대로