본문 바로가기

Algorithm/BOJ

(95)
[BOJ] 17406. 배열돌리기4 Python, Java https://www.acmicpc.net/problem/17406 17406번: 배열 돌리기 4 크기가 N×M 크기인 배열 A가 있을때, 배열 A의 값은 각 행에 있는 모든 수의 합 중 최솟값을 의미한다. 배열 A가 아래와 같은 경우 1행의 합은 6, 2행의 합은 4, 3행의 합은 15이다. 따라서, 배열 A의 www.acmicpc.net 1. 해결방법 생각보다 힘들었던 문제이다. 배열을 돌려야 하는데 이 과정이 꽤나 머리를 지끈거리게 만든 것 같다. 여기서 사용했던 핵심 포인트는 조합을 사용해서 회전 연산의 순서를 결정하고, 그 것을 바탕으로 해당 위치에 대한 배열을 돌려야 한다. 1. 먼저 조합을 구해야 한다. ---> 주어진 예시는 (3, 4, 2), (4, 2, 1)일 때, 첫 번째 회전 방법은..
[BOJ] 17141. 연구소2 Python https://www.acmicpc.net/problem/17141 17141번: 연구소 2 인체에 치명적인 바이러스를 연구하던 연구소에 승원이가 침입했고, 바이러스를 유출하려고 한다. 승원이는 연구소의 특정 위치에 바이러스 M개를 놓을 것이고, 승원이의 신호와 동시에 바이 www.acmicpc.net 1. 해결방법 어우 완전탐색 문제이다. 완전탐색을 하드코딩으로 푸니까 중간에 로직이 꼬여서 고생을 좀 했다. 이 문제도 연구소1처럼 시간초과를 생각하면서 코드를 짜야한다. 본인은 바이러스가 놓일 수 있는 위치를 미리 리스트에 담아두어서 백트래킹으로 놓일 수 있는 경우의 수를 모두 탐색하였다. (Combinations을 사용해도 됨) 1. 미리 바이러스가 놓일 위치를 리스트에 담는다. 2. dfs (백트래킹..
[BOJ] 14502. 연구소 Python https://www.acmicpc.net/problem/14502 14502번: 연구소 인체에 치명적인 바이러스를 연구하던 연구소에서 바이러스가 유출되었다. 다행히 바이러스는 아직 퍼지지 않았고, 바이러스의 확산을 막기 위해서 연구소에 벽을 세우려고 한다. 연구소는 크 www.acmicpc.net 1. 해결방법 그래프 완전 탐색문제이다. 1. 먼저 벽을 3개 쳐야하므로, 백트래킹을 이용하여 빈 공간(0)에 벽을 3개 친다. 2. 벽을 쳤으면, BFS를 통해서 바이러스 부분이 퍼져나가는 로직을 구현한다. 3. BFS를 다 돌았아면, 연구소의 넓이를 구한다. 새롭게 배운 부분은, 기존에 사용하던 백트래킹 로직에서 for문을 많이 사용하게 되어서 시간초과가 나온다. 해결방법은 '//'와 '%'의 연산을 이용..
[BOJ] 2943. 탑 Python, Java https://www.acmicpc.net/problem/2493 2493번: 탑 첫째 줄에 탑의 수를 나타내는 정수 N이 주어진다. N은 1 이상 500,000 이하이다. 둘째 줄에는 N개의 탑들의 높이가 직선상에 놓인 순서대로 하나의 빈칸을 사이에 두고 주어진다. 탑들의 높이는 1 www.acmicpc.net 1. 해결방법 탐색으로 모든 경우를 확인하면 시간초과가 난다. stack으로 해결한다는 생각이 쉽게 떠오르는 것도 아니고 탐색이 안됐을 땐, 꽤나 멘탈이 나갔다. 다른 분의 코드를 보고 이해를 했다. 이 문제는 오른쪽에서 읽으면 결국 탐색이 되어버리기 때문에 왼쪽에서 읽는 방법을 생각해야 한다. 이것이 stack으로 생각하기 위한 지름길 아이디어이다. 1. for문으로 tops를 돌면서 하나하나..
[BOJ] 2304. 창고 다각형 Python https://www.acmicpc.net/problem/2304 2304번: 창고 다각형 첫 줄에는 기둥의 개수를 나타내는 정수 N이 주어진다. N은 1 이상 1,000 이하이다. 그 다음 N 개의 줄에는 각 줄에 각 기둥의 왼쪽 면의 위치를 나타내는 정수 L과 높이를 나타내는 정수 H가 한 개의 www.acmicpc.net 1. 해결방법 솔직히 개인적으로 접근 하는 데 있어서 너무 어려웠다... 엄청 많은 시간이 투자해도 해결하지 못해서 다른 분들의 힌트를 보고 해결했다,,,,,, 위 문제는 stack으로도 해결해도 되지만, 조건이 너무 까다로워서 stack으로 해결하지 못했다. 핵심포인트는 가장 높이가 큰 인덱스의 정보를 찾고, 왼쪽과 오른쪽 끝에서 부터 탐색하면서 넓이를 구하는 것이다 왼쪽부터 보..
[BOJ] 12891. DNA 비밀번호 Python, Java https://www.acmicpc.net/problem/12891 12891번: DNA 비밀번호 평소에 문자열을 가지고 노는 것을 좋아하는 민호는 DNA 문자열을 알게 되었다. DNA 문자열은 모든 문자열에 등장하는 문자가 {‘A’, ‘C’, ‘G’, ‘T’} 인 문자열을 말한다. 예를 들어 “ACKA” www.acmicpc.net 1. 해결방법 이 문제는 초기 값을 매우 크게 주고 있으므로, 보자마자 for문으로 모두 탐색을 시도한다는 것은 시간초과로 이어질 수 있다. 핵심은 O(N) 안으로 시간복잡도를 해결하는 것이며, O(N) 안으로 해결하기 위해서는 투 포인터를 이용하여 윈도우 슬라이딩 기법으로 해결하면 된다. ### 윈도우 슬라이딩 ( 슬라이딩 윈도우 알고리즘 간단 예제 ) 1, 2, 3, 4..
[BOJ] 11660. 구간 합 구하기5 Python, Java https://www.acmicpc.net/problem/11660 11660번: 구간 합 구하기 5 첫째 줄에 표의 크기 N과 합을 구해야 하는 횟수 M이 주어진다. (1 ≤ N ≤ 1024, 1 ≤ M ≤ 100,000) 둘째 줄부터 N개의 줄에는 표에 채워져 있는 수가 1행부터 차례대로 주어진다. 다음 M개의 줄에는 네 www.acmicpc.net 1. 해결방법 진짜 DP 너무 어렵다,,,, 이 문제를 보면 어떻게 하면 정상적인 출력이 나오게끔 코드를 구현하는 것은 정말 쉬울 것이다. 하지만 !!! 그렇게 그 쉬운, 각 배열을 탐색해서 더하는 방법이라면 시간복잡도에 걸려서 시간초과라는 안타까운 결과를 보게된다. 문제 설명을 위한 예시를 보자, 숫자들로 채워진 N x N의 표가 있고, 두 개의 좌표 ..
[BOJ] 16987. 계란으로 계란치기 Python https://www.acmicpc.net/problem/16987 16987번: 계란으로 계란치기 원래 프로그래머의 기본 소양은 팔굽혀펴기를 단 한 개도 할 수 없는 것이라고 하지만 인범이는 3대 500을 넘기는 몇 안되는 프로그래머 중 한 명이다. 인범이는 BOJ에서 틀린 제출을 할 때마다 턱 www.acmicpc.net 1. 해결방법 문제를 이해하면 백트레킹이라는 것을 알 수 있지만, 이해도 어렵고 문장도 길어서 어떤 알고리즘인지 찾아내기가 꽤 어려웠다. 문제 이해하는데만 20~30분 정도는 걸린 것 같다. 이 문제에 대한 접근은 왼쪽부터 계란을 집어서 다른 계란을 때리는 것이다. 이 때, 내구도와 무게에 따라 들고있는 계란이 깨지는지 다른 계란이 깨지는지의 경우를 고려해야한다. 조건을 생각해 보면..