본문 바로가기

algorithm/BOJ

(63)
백준 17471_게리맨더링(C++) www.acmicpc.net/problem/17471 17471번: 게리맨더링 선거구를 [1, 4], [2, 3, 5, 6]으로 나누면 각 선거구의 인구는 9, 8이 된다. 인구 차이는 1이고, 이 값보다 더 작은 값으로 선거구를 나눌 수는 없다. www.acmicpc.net [문제 풀이] 브루트 포스(Brute force)를 이용하여 문제를 풀었습니다. 이 문제는 주어진 입력을 두 집합으로 나누었을 때 나누어진 집합이 그래프로 연결 되어 있는지를 찾는 문제였습니다. 예를 들어 두 집합 A ={ 1, 2, 3 }, B = { 4, 5, 6 }으로 나누었을 때 A의 노드들이 A의 노드를 통해서 모두 연결 되어 있어야 합니다. 반대로 B 또한 마찬가지입니다. 파란색 집합의 원소 5가 B의 노드를 통해 6으로..
백준 2668_숫자고르기(C++) www.acmicpc.net/problem/2668 2668번: 숫자고르기 세로 두 줄, 가로로 N개의 칸으로 이루어진 표가 있다. 첫째 줄의 각 칸에는 정수 1, 2, …, N이 차례대로 들어 있고 둘째 줄의 각 칸에는 1이상 N이하인 정수가 들어 있다. 첫째 줄에서 숫자를 적절 www.acmicpc.net [문제 풀이] DFS를 이용하여 문제를 풀었습니다. 이 문제는 배열을 적절히 선택 했을 때 배열의 인덱스와 배열의 값이 같은 최대 크기의 집합을 찾는 문제입니다. 이 문제의 로직은 싸이클을 찾는 문제와 비슷합니다. 배열의 값을 타고 들어갔을 때 배열의 인덱스로 다시 돌아오는지 하면 됩니다. 코드 설명 배열의 값을 exist 배열에 저장해 둡니다. 입력 받은 배열을 순회 하면서 exist에 저장되 있..
백준 17070_파이프 옮기기 1(C++) www.acmicpc.net/problem/17070 17070번: 파이프 옮기기 1 유현이가 새 집으로 이사했다. 새 집의 크기는 N×N의 격자판으로 나타낼 수 있고, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 (r, c)로 나타낼 수 있다. 여기서 r은 행의 번호, c는 열의 www.acmicpc.net [문제 풀이] 브루트 포스(Brute force)를 이용하여 문제를 풀었습니다. 이 문제는 파이프를 연속해서 설치해서 목적지까지 도달하는 방법의 개수를 구하는 문제였습니다. 파이프를 설치할 때는 조건이 따릅니다. 이 조건에 맞게 설치를 해주면 문제가 해결됩니다. 이 문제의 경우 파이프가 역으로 올라가는 경우는 생기지 않음으로 방문 여부를 파악하지 않아도 문제가 해결됩니다. 파이프를 설치..
백준 16637_괄호 추가하기(C++) [문제 풀이] 브루트 포스(Brute force)를 이용하여 문제를 풀었습니다. 이 문제는 주어진 수식에 괄호를 쳐서 나올 수 있는 가장 큰 수를 찾는 것입니다. 여기서 괄호를 치는 조건이 존재합니다. 괄호는 하나의 연산자만 포함할 수 있습니다. 즉 ( A + B )와 같이 숫자 두 개 연산자 하나의 경우만 묶을 수 있습니다. 또한 괄호 안에 괄호가 포함돼서는 안됩니다. 이것을 잘 지키면 문제가 쉽게 풀립니다. 단 하나의 조건이 있다면 문제의 답은 음수가 나올 수도 있다는 것을 염두해야 합니다. 코드 설명 들어온 문자열이 1자리이면 그 수를 출력합니다. 아닌 경우 문자열의 0 번째 숫자만 선택하는 경우와 0 ~ 2 까지 괄호로 묶는 경우로 나눠서 함수를 실행합니다. 만약 DFS함수에 들어온 매개변수가 문..
백준 9205_맥주 마시면서 걸어가기(C++) www.acmicpc.net/problem/9205 9205번: 맥주 마시면서 걸어가기 송도에 사는 상근이와 친구들은 송도에서 열리는 펜타포트 락 페스티벌에 가려고 한다. 올해는 맥주를 마시면서 걸어가기로 했다. 출발은 상근이네 집에서 하고, 맥주 한 박스를 들고 출발한다. www.acmicpc.net [문제 풀이] 플로이드-워셜(Floyd Warshall)을 이용하여 문제를 풀었습니다. 이 문제는 상근이가 시작 지점에서 끝 지점까지 50미터당 맥주 한 병을 멈추지 않고 마시면서 갈 수 있는가를 구하는 문제였습니다. 가는 길에 편의점이 있으면 편의점을 들를 수 있고 최대 수용량 맥주 20병을 채울 수 있습니다. 즉 시작 지점 A 노드에서 도착지점 Z로 갈 수 있는 모든 경로를 탐색하며 음수도 처리 가능한..
백준 2573_빙산(C++) www.acmicpc.net/problem/2573 2573번: 빙산 첫 줄에는 이차원 배열의 행의 개수와 열의 개수를 나타내는 두 정수 N과 M이 한 개의 빈칸을 사이에 두고 주어진다. N과 M은 3 이상 300 이하이다. 그 다음 N개의 줄에는 각 줄마다 배열의 각 행을 www.acmicpc.net [문제 풀이] BFS를 이용하여 문제를 풀었습니다. 이 문제는 1개의 연결 된 빙산이 주어졌을 때, 2개의 빙산으로 나누어지는데 걸리는 시간을 구하는 문제입니다. 빙산 1칸은 하루에 인접한 물의 개수만큼 녹아 0이 되면 물이 됩니다. 이 문제를 해결하기 위해 BFS를 이용하였습니다. 문제의 로직은 크게 하루 동안 녹는 빙산을 구하는 로직과 둘로 나뉘었는지를 확인하는 로직을 구현하였습니다. 코드 설명 배열을..
백준 2468_안전 영역(C++) www.acmicpc.net/problem/2468 2468번: 안전 영역 재난방재청에서는 많은 비가 내리는 장마철에 대비해서 다음과 같은 일을 계획하고 있다. 먼저 어떤 지역의 높이 정보를 파악한다. 그 다음에 그 지역에 많은 비가 내렸을 때 물에 잠기지 않는 www.acmicpc.net [문제 풀이] BFS를 이용하여 문제를 풀었습니다. 이 문제는 물이 0부터 무한대 높이의 비가 내렸을 때, 상, 하, 좌, 우로 서로 연결된 안전 영역의 최대 개수를 구하는 문제입니다. 안전 영역이란 문제 예제에서 높이가 4인 비가 내렸을 때 (0, 0), (0, 1)의 땅은 침수당하지 않습니다. 따라서, 강수량이 4인 경우 좌표 두 개를 묶어 {(0, 0,), (0, 1)} = 안전 영역 하나가 되는 것입니다. 문제..
백준 5014_스타트링크(C++) www.acmicpc.net/problem/5014 5014번: 스타트링크 첫째 줄에 F, S, G, U, D가 주어진다. (1 ≤ S, G ≤ F ≤ 1000000, 0 ≤ U, D ≤ 1000000) 건물은 1층부터 시작하고, 가장 높은 층은 F층이다. www.acmicpc.net [문제 풀이] BFS를 이용하여 문제를 풀었습니다. 이 문제는 강호의 위치 S에서 위로 U 칸 아래로 D 칸 이동을 반복적으로 함으로써 F의 건물의 G 층에 최소 몇 번 만에 도달할 수 있는지를 찾는 문제입니다. BFS를 이용하면 트리의 형태로 옆으로 뻗어 나가면서 이른 시간 안에 횟수를 구할 수 있습니다. 코드 설명 S를 큐에 넣어 줍니다. 큐에 들어 있는 값이 G와 같은지 확인해 줍니다. 큐에 들어 있는 값이 G와 같지..