본문 바로가기

알고리즘66

[백준 17779] 게리맨더링 2 (C++) A. 문제설명 https://www.acmicpc.net/problem/17779 17779번: 게리맨더링 2 재현시의 시장 구재현은 지난 몇 년간 게리맨더링을 통해서 자신의 당에게 유리하게 선거구를 획정했다. 견제할 권력이 없어진 구재현은 권력을 매우 부당하게 행사했고, 심지어는 시의 이름�� www.acmicpc.net 문제에 대한 자세한 설명은 링크 참조 1. N*N 배열 크기의 땅이 존재 2. 각 배열의 엔트리를 5개의 지역구로 나누려고 함 3. 선거구를 나누는 방법은 아래와 같음 기준점 (x, y)와 경계의 길이 d1, d2를 정한다. (d1, d2 ≥ 1, 1 ≤ x < x+d1+d2 ≤ N, 1 ≤ y-d1 < y < y+d2 ≤ N) 다음 칸은 경계선이다. (x, y), (x+1, y-1).. 2020. 9. 5.
[LeetCode - Easy] Two Sum 풀이 (C++) A. 문제설명 https://leetcode.com/problems/two-sum/ Two Sum - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com 문제에 대한 자세한 설명은 링크 참조 1. 배열 nums와 정수 target이 주어짐 2. nums 배열 내 두 값을 더해 수 target을 만드는 배열의 인덱스를 찾을 것 B. 접근법 1. Brute-force 먼저, 아주 단순하게 배열 내 모든 두 원소를 비교하며 Brute-force로 확인하는 방식이다. 이 경.. 2020. 9. 3.
[백준 17142] 연구소 3 (C++) A. 문제설명 https://www.acmicpc.net/problem/17142 17142번: 연구소 3 인체에 치명적인 바이러스를 연구하던 연구소에 승원이가 침입했고, 바이러스를 유출하려고 한다. 바이러스는 활성 상태와 비활성 상태가 있다. 가장 처음에 모든 바이러스는 비활성 상태이고 www.acmicpc.net 문제에 대한 자세한 설명은 링크 참조 1. N*N 배열크기 땅이 존재 2. 각 배열의 엔트리에는 빈칸, 벽, 바이러스가 존재 3. 여기서 주어진 바이러스 중, M개를 활성화 시키려고 한다. 즉, 전체 바이러스가 |V|개라면 M개가 활성화 바이러스, |V|-M개가 비활성화 바이러스가 됨 4. 이제 활성화된 바이러스들을 시작으로 주변에 퍼뜨리는데, 바이러스는 벽을 제외한 칸에 바이러스를 퍼뜨림 .. 2020. 9. 2.
[백준 3055] 탈출 (C++) A. 문제설명 https://www.acmicpc.net/problem/3055 3055번: 탈출 사악한 암흑의 군주 이민혁은 드디어 마법 구슬을 손에 넣었고, 그 능력을 실험해보기 위해 근처의 티떱숲에 홍수를 일으키려고 한다. 이 숲에는 고슴도치가 한 마리 살고 있다. 고슴도치는 제�� www.acmicpc.net 문제에 대한 자세한 설명은 링크 참조 1. R*C 배열크기 땅이 존재 2. 각 배열의 엔트리에는 빈칸, 물, 비버굴, 돌이 존재 3. 고슴도치는 주어진 위치에서 물과 돌을 피해 빈칸을 이동하며 비버굴에 가고자 함 4. 물이 고슴도치를 덮치기 전에 가장 빨리 비버굴에 갈 수 있는 시간을 구하라 B. 접근법 Double BFS 일반적인 배열 주변 영역 전파 문제에서는 BFS를 쉽게 적용할 수 있.. 2020. 8. 27.
[백준 2529] 부등호 (C++) A. 문제설명 https://www.acmicpc.net/problem/2529 2529번: 부등호 여러분은 제시된 부등호 관계를 만족하는 k+1 자리의 최대, 최소 정수를 첫째 줄과 둘째 줄에 각각 출력해야 한다. 단 아래 예(1)과 같이 첫 자리가 0인 경우도 정수에 포함되어야 한다. 모든 입력� www.acmicpc.net 문제에 대한 자세한 설명은 링크 참조 1. k개의 나열된 부등호가 존재 2. 그 사이에 해당 조건을 만족하는 k+1개의 숫자를 넣고자 한다. 3. k+1의 숫자는 {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} 4. 여기서, 구해지는 숫자 중 제일 작은 수와 큰 수를 구하라 B. 접근법 DFS DFS와 가지치기를 이용하면 이 문제를 적은 시간 비용으로 풀 수 있다. 일반적.. 2020. 8. 25.
[백준 16197] 두 동전 (C++) A. 문제설명 https://www.acmicpc.net/problem/16197 16197번: 두 동전 N×M 크기의 보드와 4개의 버튼으로 이루어진 게임이 있다. 보드는 1×1크기의 정사각형 칸으로 나누어져 있고, 각각의 칸은 비어있거나, 벽이다. 두 개의 빈 칸에는 동전이 하나씩 놓여져 있고, �� www.acmicpc.net 문제에 대한 자세한 설명은 링크 참조 1. N*M 게임판과 두 동전이 주어짐 2. 게임판에는 빈 공간, 동전, 벽이 있을 수 있음 3. 게임판을 조작하여 두 동전을 모두 상하좌우 같은 방향으로 움직임 4. 여기서, 동전의 이동조건은 아래와 같음 동전이 이동하려는 칸이 벽이면, 동전은 이동하지 않는다. 동전이 이동하려는 방향에 칸이 없으면 동전은 보드 바깥으로 떨어진다. 그 외.. 2020. 8. 18.
[백준 11559] Puyo Puyo (C++) A. 문제설명 https://www.acmicpc.net/problem/11559 문제에 대한 자세한 설명은 링크 참조 1. 12*6 푸요푸요 게임판이 주어짐 2. 필드에 R/G/B/Y 뿌요를 놓음. 뿌요는 중력의 영향을 받아 아래에 바닥이나 다른 뿌요가 나올 때까지 아래로 떨어짐 3. 같은 색 뿌요가 4개 이상 상하좌우로 연결되어 있으면 연결된 같은 색 뿌요들이 한꺼번에 없어짐 4. 뿌요들이 없어지고 나서 위에 다른 뿌요들이 있다면, 역시 중력의 영향을 받아 차례대로 아래로 떨어짐 5. 아래로 떨어지고 나서 다시 같은 색의 뿌요들이 4개 이상 모이게 되면 또 터지고 연쇄 작용이 일어남 6. 상대방의 필드가 주어졌을 때, 몇 연쇄가 일어날 지 예측할 것 B. 접근법 BFS 1. 푸요푸요의 연쇄작용 계산 .. 2020. 8. 16.
[백준 19236] 청소년 상어 (C++) A. 문제설명 https://www.acmicpc.net/problem/19236 문제에 대한 자세한 설명은 링크 참조 1. 4*4 배열공간에 물고기의 번호와 방향이 각각 주어짐 2. 물고기의 방향은 1~8로, 12시방향부터 45도씩 반시계방향으로 각각 회전하여 주어짐 3. 이 배열공간 안 (0,0) 위치에 상어가 들어가 사냥을 시작 4. 상어는 (0,0) 위치의 물고기를 먹고 해당 물고기의 방향을 가짐 5. 이후 번호 순서대로 물고기가 이동, 물고기는 한 칸을 이동할 수 있고, 이동할 수 있는 칸은 빈 칸과 다른 물고기가 있는 칸이다. 현재 방향에서 이동하지 못할 경우 반시계방향으로 45도씩 회전하며 이동할 공간을 찾음 6. 물고기의 이동이 끝나면 다시 상어가 이동, 상어는 방향에 있는 칸으로 이동할 .. 2020. 8. 16.
[백준 17281] ⚾ (C++) A. 문제설명 https://www.acmicpc.net/problem/17281 문제에 대한 자세한 설명은 링크 참조 1. 9명으로 이루어진 야구팀의 선수들이 N이닝동안 플레이 2. 1번부터 9번의 타자들은 매 이닝마다 3아웃이 발생할 때까지 순환하며 타석에 들어감(1→2→3→...→8→9→1→2→...) 3. 각 타자가 타석에서 내는 결과는 아웃/안타/2루타/3루타/홈런로 아래와 같음 안타: 타자와 모든 주자가 한 루씩 진루 2루타: 타자와 모든 주자가 두 루씩 진루 3루타: 타자와 모든 주자가 세 루씩 진루 홈런: 타자와 모든 주자가 홈까지 진루 아웃: 모든 주자는 진루하지 못하고, 공격 팀에 아웃이 하나 증가 4. 매 이닝마다 타자가 수행할 결과는 정해짐 5. 감독은 1번 선수를 4번 타자로 선점.. 2020. 8. 6.
[백준 16985] Maaaaaaaaaze (C++) A. 문제설명 https://www.acmicpc.net/problem/16985 문제에 대한 자세한 설명은 링크 참조 1. 5*5 크기 판이 5개 주어짐 2. 각 판에는 들어갈 수 있는 칸과 들어갈 수 없는 칸이 구분됨 3. (0,0,0)에서 시작하여 (4,4,4)로 도착하는 경로 탐색 4. 각 판은 90도씩 360도 시계/반시계 방향으로 전부 돌릴 수 있으나 뒤집는 것은 허용되지 않음 5. 회전을 완료한 후, 5개의 판을 쌓음. 이 때 판을 쌓는 조합은 바뀌어도 됨 6. 모든 경우를 탐사해보아도 끝점에 도달불가한 경우 -1 출력, 끝점에 도달 가능한 경우 최적의 경로를 구하라 B. 접근법 DFS(조합구하기) + BFS(경로탐색) 먼저 문제의 조건들을 정리하면 5*5*5의 3차원 정육면체의 공간에서 (.. 2020. 8. 6.
[백준 17135] 캐슬 디펜스 (C++) A. 문제설명 https://www.acmicpc.net/problem/17135 문제에 대한 자세한 설명은 링크 참조 1. N*M 크기의 땅이 주어짐 2. 각 배열 안에는 적들이 위치하여 한턴마다 아래로 내려옴 3. 궁수 3명이 N+1번째 행에 위치하여 성을 지킴 3. 궁수들은 주어진 사정범위 D안에 들어온 적 중, 가장 가까운 적, 만약 가장 가까운 적이 여럿이라면 그 중에 가장 좌측의 적을 공격 4. 매 턴마다 적들이 내려오고 궁수들은 적을 공격하며 배열내 적들이 모두 내려올 때까지 반복 5. 궁수들이 위치하는 경우 중 최대로 적을 많이 죽일 수 있는 수를 구하라 B. 접근법 DFS + 시뮬레이션 우선, 궁수들이 성벽에 배치되는 경우에 대해서 중복되지 않도록 DFS로 모든 경우를 구해준다. 그리고,.. 2020. 7. 31.
[백준 17070] 파이프 옮기기 1 (C++) A. 문제설명 https://www.acmicpc.net/problem/17070 문제에 대한 자세한 설명은 링크 참조 1. N*N 크기의 땅이 주어짐 2. 위와 같은 파이프를 좌표 (N, N)까지 미는데, 미는 중간에 벽지가 있으면 안됨 3. 또한, 파이프는 밀면서 회전시킬 수 있고, 그 방향은 가로/세로/대각선임 4. 가로는 우측, 우하향만, 세로는 하향, 우하향만, 대각선은 우측, 하향, 우하향 모두 밀 수 있음 5. 파이프를 한쪽 끝에서 반대쪽 끝까지 밀 수 있는 모든 경우 구하기 B. 접근법 DFS 파이프의 방향별 미는 규칙에 따라 해당 밀 위치에 벽지가 있는지 확인하고, 없는 경우에만 깊이 우선탐색을 하도록 함 C. 풀이 1. 좌측 상단 모서리에서부터 탐색 진행 2. 나의 경우, 파이프가 회전.. 2020. 7. 28.
[백준 14890] 경사로 (C++) A. 문제설명 https://www.acmicpc.net/problem/14890 문제에 대한 자세한 설명은 링크 참조 1. N*N 크기의 땅이 각각 높이가 다른 땅이 주어짐 2. 각각의 칸마다, 높이 1씩 차이나는 땅에 대해 경사로를 설치하려 함 3. 설치 조건은 아래와 같다. 3-1. 경사로는 낮은 칸에 놓으며, L개의 연속된 칸에 경사로의 바닥이 모두 접해야 한다. 3-2. 낮은 칸과 높은 칸의 높이 차이는 1이어야 한다. 3-3. 경사로를 놓을 낮은 칸의 높이는 모두 같아야 하고, L개의 칸이 연속되어 있어야 한다. 4. 주어진 땅에서 경사로를 놓아 길을 만들 수 있는 경우를 모두 구하라 B. 접근법 시뮬레이션 N*N 크기의 땅을 N행 + N열의 각각의 1차원 배열로 잘라내어 1차원 배열에 대해 .. 2020. 7. 16.
[SWEA 8934] 팰린드롬 공포증 (C++) A. 문제설명 https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AW5jJcZ68LsDFATQ 문제에 대한 자세한 설명은 링크 참조 1. 앞뒤로 뒤집어도 똑같은 문자열을 팰린드롬이라고 한다. 2. 예를 들어, “o_o”, “404”, “appa” 는 팰린드롬 이지만, “umma”, “koosaga”, “kriii”는 팰린드롬이 아니다. 3. a,b,c로 이루어진 주어진 문자열 내 길이가 2이상인 팰린드롬을 없애고자 한다. 4. 여기서 주어진 문자열내 문자들은 각각 바꿀 수 있으며 해당 주어진 문자열의 서브스트링이 팰린드롬이어도 팰린드롬이다. 5. 문제에서 각 문자열이 주어질 때, 해당 문자열을 수정하여 팰린드롬이 아닌.. 2020. 7. 7.
[백준 14503] 로봇 청소기 (C++) A. 문제설명 https://www.acmicpc.net/problem/14503 문제에 대한 자세한 설명은 링크 참조 1. 로봇 청소기가 방 안을 청소 2. 방은 N*M 크기의 배열로 되어있으며 벽이 있는 공간은 청소할 수 없음 3. 로봇청소기는 먼저 현재 위치를 청소하고 3-1. 왼쪽 방향에 아직 청소하지 않은 공간이 존재한다면, 그 방향으로 회전한 다음 한 칸을 전진 3-2. 왼쪽 방향에 청소할 공간이 없다면, 그 방향으로 회전 3-3. 네 방향 모두 청소가 이미 되어있거나 벽인 경우에는, 바라보는 방향을 유지한 채로 한 칸 후진 3-4. 네 방향 모두 청소가 이미 되어있거나 벽이면서, 뒤쪽 방향이 벽이라 후진도 할 수 없는 경우에는 작동을 멈춤 4. 최종적으로 청소기가 동작을 멈출 때, 청소한 칸.. 2020. 7. 7.