목록PS (Problem Solving)/개념 (8)
주니어 개발자의 대나무숲
파라메트릭 서치 문제는 단독 문제로 나오기보다는 다른 알고리즘과 결합해서 출제되는 것 같습니다.파라메트릭 서치는 간단히 말하자면, (갓종만북의 표현을 빌려) 최적화 문제(문제의 상황을 만족하는 특정 변수의 최솟값, 최댓값을 구하는 문제)를 결정 문제로 바꾸어 푸는 것 이라고 할 수 있습니다. 지금은 이 표현이 와닿지 않을 수 있습니다. 간단한 그림을 통해 한 번 설명해보도록 하겠습니다. 다음과 같이 나이순으로 정렬된 사람들이 있습니다. 그리고 25살 이상이라면 소주를 좋아한다는 것이 증명되어 있다고 합니다. 그럼 이 중에서 소주를 좋아하는 나이가 가장 어린 사람은 누구일까요?? 물론 가장 간단한 방법은 앞에서부터 차례대로 "너 소주 좋아하니?"라고 물어보면서, 처음으로 "네!"라고 대답하는 사람을 찾는 ..
1. 개념 BFS(Breadth First Search)는 그래프 전체를 탐색하는 방법 중의 하나입니다. 그래프 전체를 탐색하는 방법은 크게 BFS와 DFS, 두 가지가 있다고 할 수 있습니다. 그 둘 중 오늘은 BFS에 대해 배워보도록 하겠습니다. BFS의 핵심은 그래프 전체를 탐색하되, 인접한 노드들을 차례대로 방문하도록 구현한다는 점입니다. 그리고, 이를 구현하기 위해 STL의 queue를 사용하게 됩니다. 인접한 노드들을 먼저 방문한다는 말이 잘 이해가 안되신다면, 아래의 그림을 통해 이해하실 수 있을 겁니다. 위의 그림은, 노드 A부터 시작해서 BFS로 모든 노드를 방문하는 것을 나타낸 모습입니다. BFS는 인접한 노드들을 차례대로 방문한다고 했었습니다. 시작 노드인 노드 A에 인접한 노드는 노..
그래프 관련 문제를 풀 때는, 문제 상황을 그래프로 모델링한 후에 푸는 것이 보편적입니다. 이 때, 모델링한 그래프의 연결관계를 나타내는 두 가지 방식이 있습니다. 1. 인접 행렬2. 인접 리스트 1. 인접 행렬 1) 정의인접 행렬은 그래프의 연결 관계를 이차원 배열로 나타내는 방식입니다. 인접 행렬을 adj[][]라고 한다면 adj[i][j]에 대해서 다음과 같이 정의할 수 있습니다. adj[i][j] : 노드 i에서 노드 j로 가는 간선이 있으면 1, 아니면 0 cf) 만약 간선에 가중치가 있는 그래프라면 1 대신에 가중치의 값을 직접 넣어주는 방식으로 구현할 수 있습니다. 2) 예시간단한 예시를 통해 이해해보도록 하겠습니다. 다음과 같은 그래프가 있는 경우, 이 그래프의 연결 관계를 인접 행렬로 나..
5. map 1) 정의인덱스로 int가 아닌 다른 자료형을 사용할 수 있는 배열(후에 사용법을 이해하기 편하도록 '배열'이라고 했지만, map의 내부적인 구조는 각 노드가 key와 value의 쌍으로 이루어진 '트리'입니다. 특히 검색, 삽입, 삭제 등의 속도를 빠르게 하기 위해 균형 이진 트리 중의 하나인 '레드 블랙 트리'로 구현되어 있습니다. 검색 속도가 특히 빠른데 이는 key를 기준으로 정렬된 상태이기 때문입니다.) 2) 용도연관 있는 두 값을 함께 묶어서 관리하되, 검색을 빠르게 하고 싶은 경우 (Ex. 만약 SNS상 사람들의 친구 관계를 그래프를 이용해 나타내고, 이 그래프에 여러가지 알고리즘들을 적용해 멋진 일들을 하고 싶다고 합시다. 일반적인 경우라면, 사람을 정점으로, 사람들 간의 친구..
1. queue 1) 정의 FIFO(First In First Out, 선입선출) 자료구조 2) 용도 ① BFS(Breadth First Search, 너비우선탐색) ② 특별한 알고리즘을 사용하는 것이 아니라 직접 문제 상황을 구현하는 문제들 중 FIFO의 구조를 가지는 문제를 풀 때 (Ex. 다리에 올라갈 수 있는 최대 하중과 각 트럭의 무게가 주어질 때, 모든 트럭이 다리를 지나가는 데 걸리는 최소 시간을 구하는 문제. 다리에 먼저 올라간 트럭이 먼저 나오게 되기 때문에 queue를 이용해 구현하면 풀 수 있다.) 3) 사용법 queue를 사용하기 위해서는 를 include 해야 합니다. 편의상 멤버 함수의 적용 대상이 되는 queue를 q라고 부르도록 하겠습니다. 멤버 함수 기능 q.size() q..
가장 기본적인 STL 컨테이너라고 할 수 있는 pair와 vector에 대해서 먼저 알아보도록 하겠습니다. 이해하기 쉽도록 제 나름대로 정한 정의와 문제를 풀 때의 쓰임새를 알아보고 난 후, 멤버 함수들과 예제를 통해 사용법을 익혀보도록 하겠습니다. 1. pair 1) 정의 이름이 'first', 'second'인 두 개의 변수를 저장할 수 있는 struct 2) 용도 ① 이차원 배열의 인덱스 ② 이차원 좌표평면에서의 좌표 ③ 정점 번호와 해당 정점 번호까지의 최단거리를 묶어서 저장해야 되는 경우 3) 사용법 pair를 사용하기 위해서는 를 include 해야 합니다. pair는 다른 컨테이너들에 비해 간단한 구조이기 때문에 멤버 함수가 적습니다. 따라서, 바로 예제를 통해 pair의 기본적인 사용법을 ..
C++의 가장 자주 사용되는 라이브러리 중 하나인 STL(Standard Template Library)에 대해 한 번쯤은 들어보셨을 겁니다. 그런데 왜 PS를 공부하기 전에 STL의 사용법을 익혀야 할까요? 그 이유는 문제를 푸는 데 필요한 알고리즘들을 빠르게 구현할 수 있기 때문입니다. 공부를 하다 보면, 더 빠른 알고리즘을 위해 구현이 너무 오래 걸리는 알고리즘을 선택하는 오류를 범하는 경우가 있습니다. 하지만, 제한된 시간 내에 많은 문제를 풀어야 하는 대회 상황에서는 구현에 드는 시간도 고려해야 합니다. 문제를 푸는 시간의 대부분은 생각해낸 알고리즘을 '구현'하는 시간이기 때문입니다. 문제의 제한시간은 대체적으로 5초 이내이기 때문에 작성한 프로그램이 답을 출력해낼 때까지 걸리는 시간은 구현에 ..
PS를 배우기 전에 미리 알아두면 좋은 사항들이 있습니다.PS를 해본 사람들에겐 당연하지만, 처음 접하는 사람들에겐 전혀 당연하지 않은 사항들이라고 생각해 따로 글을 쓰게 되었습니다. 저 또한 처음엔 이런 점들을 잘 몰랐구요! PS를 처음 접하시는 분들에게 조금이라도 도움이 되길 바랍니다. 1. 전역변수 여태까지는 전역변수를 사용하면 코드 재사용시 프로그램의 안정성에 좋지 않다는 등의 이유로, 전역변수를 가급적이면 사용하지 않는 것이 좋다고 배워왔습니다. 하지만, PS를 할 때는 전역변수를 적극적으로 사용하는 것이 좋습니다. 예를 들어 보겠습니다. 어떤 배열(arr)이 있을 때, s번째 칸부터 e번째 칸까지의 합을 구하는 함수 sumOfArray가 있다고 해보겠습니다. 그러면, 함수 sumOfArray는..