전체 글 55

C++ - References and Pointers

참조를 만들어주면 참조 값을 이용해서 변수값을 바꿀 수 있다. 예를 들어, 함수에서 값을 변경할 때 참조 값을 전달해주면 변수값도 변경된다. void swap_num(int &i, int &j) { int temp = i; i = j; j = temp;}int main() { int a = 100; int b = 200; swap_num(a, b); std::cout 만약, 간단히 int i 와 int j 만 swap_num() 함수에 넣는다면, 결과는 A is 100 B is 200 하지만 reference를 통해 pass 한다면A is 200 B is 100 -궁금한 점 : C++에서는 포인터와 참조가 중요하다고 했는데, 다른 언어와 다른 점이 무엇인가? Pass-By-Refere..

[백준/C++] 18870번: 좌표 압축 - STL의 정교한 활용

1. 문제 정보문제 번호: 18870번문제 이름: 좌표 압축문제 요약: 수직선 위의 N개 좌표에 좌표 압축을 적용한다. X_i를 좌표 압축한 결과는 X_j">X_i > X_j를 만족하는 서로 다른 좌표 X_j의 개수와 같아야 한다.2. 문제풀이 과정값의 크기가 아니라 값의 위치가 중요하기 때문에, find 함수를 썼지만 find함수의 선형탐색 특징 때문에 시간 초과가 발생했다.해결방법: 정렬된 상태에서 이진 탐색을 수행하는 lower_bound를 사용하면 입력값이 커도 적은 연산으로 수행할 수 있다. **lower_bound는 왜 lower_bound라는 이름을 가지고 있을까??lower_bound는 하한선이라는 뜻이다. 그래서!! "내가 찾는 값 X 가 나타나는 가장 첫 번째(가장 낮은 위치)"를 찾..

[C++ STL] map 컨테이너 완벽 정리: 구조부터 활용까지

1. map이란 무엇인가?map은 연관 컨테이너(Associative Container) 중 하나로, 노드 기반의 균형 이진 트리(Balanced Binary Tree) 구조를 가지고 있다.핵심 특징Key와 Value의 쌍: 데이터가 pair 객체 형태로 저장된다.Unique Key: 하나의 map 안에서 키(Key)는 중복될 수 없다. (중복 키가 필요하면 multimap을 사용해야 한다.)자동 정렬: 원소가 삽입되는 동시에 키(Key)를 기준으로 자동 정렬된다.Q. 오름차순이면 첫 시작이 제일 작은 것인가? A. 그렇다. 기본 설정인 오름차순(less) 기준일 때, begin() 이터레이터가 가리키는 첫 번째 원소의 키 값이 가장 작다.Q. Value 값 기준으로 정렬되는 것인가? A. 아니다. 무조..

[백준/C++] 11724번: 연결 요소의 개수 - DFS와 인접 리스트의 정석

1. 문제 정보문제 번호: 11724번문제 이름: 연결 요소의 개수문제 요약: 방향 없는 그래프가 주어졌을 때, 연결 요소(덩어리)의 개수를 구하라.2. 결정적 문법: [] vs () 의 차이① vector graph[1001]; (배열의 각 칸이 벡터)정체: vector 타입의 객체 1001개를 담는 "배열"입니다.용도: 그래프의 인접 리스트(Adjacency List)를 구현할 때 표준적으로 사용됩니다.graph[1]은 1번 정점과 연결된 정점들을 담는 벡터, graph[2]는 2번 정점과 연결된 정점들을 담는 벡터가 되는 식.② vector graph(1001); (크기가 1001인 하나의 벡터)정체: 정수(int) 1001개를 담을 수 있는 "하나의 벡터"이다.용도: 1차원 배열처럼 사용하고 싶을..

[백준/C++] 2805번: 나무 자르기 - 이분 탐색과 매개변수 탐색

1. 문제 정보문제 번호: 2805번문제 이름: 나무 자르기문제 요약: 절단기에 높이 H를 지정하면 H보다 높은 나무의 윗부분을 가져갈 수 있다. 적어도 M미터의 나무를 가져가기 위해 설정할 수 있는 절단기 높이의 최댓값을 구하라.2. 왜 이분 탐색인가? (시간 복잡도의 마법)이 문제에서 절단기의 높이는 0부터 가장 높은 나무의 높이(최대 10억)까지 가능합니다.선형 탐색: 0부터 10억까지 하나씩 높여가며 확인한다면? 최악의 경우 10억 번의 연산이 필요합니다. 나무의 개수 N이 100만 개이므로, 전체 연산량은 10^9 X10^6 = 10^{15}... 절대 시간 내에 통과할 수 없습니다.이분 탐색: 탐색 범위를 반씩 줄여나가면 log_2(10^9) = 30번의 연산만으로 충분합니다. 나무가 100만..

[백준/C++] 2630번: 색종이 만들기 - 분할 정복과 재귀의 정석

1. 문제 정보문제 번호: 2630번문제 이름: 색종이 만들기문제 요약: N X N 크기의 종이가 주어질 때, 모든 칸의 색이 같지 않으면 4등분하여 각각의 조각에 대해 같은 과정을 반복한다. 최종적으로 잘린 단색 색종이의 개수를 구하라.2. 핵심 알고리즘: 분할 정복 (Divide and Conquer)분할 정복은 말 그대로 "나누어서 정복한다"는 뜻입니다. 이 문제에서는 다음과 같은 3단계를 거칩니다.Divide (분할): 현재 종이가 단색이 아니라면, 가로세로를 반으로 잘라 4개의 작은 사각형으로 나눕니다.Conquer (정복): 나뉜 4개의 사각형에 대해 다시 같은 과정을 수행합니다. (재귀 호출)Combine (결합): 단색으로 확인된 종이의 개수를 각각 카운트하여 합칩니다. 3. C++ 꿀팁:..

[백준/C++] 1927번: 최소 힙 - priority_queue의 내부 구조 파헤치기

1. 문제 정보문제 번호: 1927번문제 이름: 최소 힙문제 요약: 최소 힙을 이용하여 다음 연산을 지원하는 프로그램을 작성하라.배열에 자연수 x를 넣는다.배열에서 가장 작은 값을 출력하고, 그 값을 배열에서 제거한다.최소 힙은 작은게 위에 있는 트리 구조 이다. 2. 핵심 개념: Priority Queue와 내부 컨테이너C++ STL에서 제공하는 priority_queue는 이름은 큐(Queue)지만, 실제로는 힙(Heap) 자료구조로 동작합니다. 여기서 재밌는 점은 이 녀석이 데이터를 담기 위해 내부적으로 다른 컨테이너를 빌려 쓴다는 것입니다. 왜 내부 컨테이너로 vector를 쓸까?우선순위 큐를 선언할 때 보통 priority_queue, greater>와 같이 작성합니다. 여기서 vector가..

[백준/C++] 1012번: 유기농 배추 - 격자 위에서 BFS 덩어리 찾기

1. 문제 정보문제 번호: 1012번문제 이름: 유기농 배추문제 요약: NXM 격자에 배추가 심어져 있다. 상하좌우로 인접한 배추들은 하나의 지렁이로 보호할 수 있다. 총 몇 마리의 지렁이가 필요한지 구하라.2. 접근 방법 (알고리즘) BFS(너비 우선 탐색)를 활용한 군집 탐색이 문제는 그래프에서 연결 요소(Connected Components)의 개수를 세는 문제입니다.전수 조사: 격자의 (0, 0)부터 (N-1, M-1)까지 차례대로 방문합니다.새로운 덩어리 발견: 만약 해당 칸에 배추가 있고(1), 아직 방문하지 않았다면(!visited) 새로운 지렁이가 필요한 시점입니다.영역 확장: 그 칸을 시작점으로 BFS를 돌려 인접한 모든 배추를 방문 처리(visited = true)합니다. 이 과정이 끝..

[백준/C++] 9095번: 1, 2, 3 더하기 - DP의 정석을 맛보다

1. 문제 정보문제 번호: 9095번문제 이름: 1, 2, 3 더하기문제 요약: 정수 n이 주어졌을 때, n을 1, 2, 3의 합으로 나타내는 방법의 수를 구하라. 2. 고민의 흔적: 재귀에서 DP로처음 이 문제를 보면 "모든 경우를 다 만들어봐야 하나?"라는 생각에 재귀 함수를 떠올리기 쉽다. 하지만 숫자가 커질수록 경우의 수가 기하급수적으로 늘어나기 때문에 중복 계산이 발생하고 효율성이 떨어진다.여기서 필요한 사고의 전환이 바로 DP(다이내믹 프로그래밍)이다. 왜 이 문제가 DP인가? (중요 포인트!)공부하면서 정리한 DP의 핵심 판단 기준 세 가지가 이 문제에 완벽히 들어맞는다.큰 문제를 작은 문제로 나눌 수 있다: n을 만드는 방법은 n-1, n-2, n-3을 만드는 방법들을 합친 것과 같다.작은..