IT 개발 관련/[Algorithm] 21

[백준] 2304번: 창고 다각형 - Java

문제https://www.acmicpc.net/problem/2304여러 개의 기둥이 주어졌을 때, 이 기둥들을 사용해 만든 창고의 지붕 면적을 구하는 문제입니다. 각 기둥은 위치와 높이로 정의되며, 모든 기둥의 폭은 1입니다. 접근 방법기둥 배열 정렬: 기둥들을 위치에 따라 오름차순으로 정렬합니다.최고 높이의 기둥을 중심으로 면적 계산:왼쪽에서 최고 기둥까지: 왼쪽에서 오른쪽으로 진행하면서 높이가 증가할 때마다 면적을 계산합니다.오른쪽에서 최고 기둥까지: 오른쪽에서 왼쪽으로 진행하면서 높이가 증가할 때마다 면적을 계산합니다.최고 높이의 기둥 면적 추가: 마지막으로 최고 높이의 기둥 면적을 더해줍니다. 코드import java.io.BufferedReader;import java.io.IOExceptio..

[백준] 1417번: 국회의원 선거 - Java

문제https://www.acmicpc.net/problem/1417다솜이는 선거에 출마했는데, 자신을 제외한 다른 후보들도 있습니다. 각 후보의 득표 수가 주어졌을 때, 다솜이가 다른 후보들보다 많은 표를 얻기 위해 최소 몇 명의 유권자를 매수해야 하는지 구하는 문제입니다.다솜이가 매수할 때마다 다른 후보의 득표 수는 1씩 감소하고 다솜이의 득표 수는 1씩 증가합니다. 이 과정을 반복해 다솜이가 가장 많은 표를 얻게 하는 것이 목표입니다. 접근 방법우선순위 큐 사용: 다솜이를 제외한 다른 후보들의 득표 수를 관리하기 위해 우선순위 큐(최대 힙)를 사용합니다.매수 과정 반복: 가장 많은 표를 가진 후보를 찾아 매수를 진행합니다. 다솜이의 표가 그 후보보다 많아질 때까지 이 과정을 반복합니다.반복문 종료:..

[백준] 1072번 : 게임 - Java

문제https://www.acmicpc.net/problem/1072현재 진행한 게임 수와 이긴 게임 수가 주어질 때, 승률을 1% 이상 올리기 위해 추가로 진행해야 하는 최소 게임 수를 구하는 문제입니다. 승률은 (이긴 게임 수 / 총 게임 수) * 100 으로 계산됩니다. 접근 방법이분 탐색: 추가로 진행할 게임 수를 이분 탐색을 통해 효율적으로 찾습니다.left, right, mid를 사용하여 이분 탐색을 수행합니다.mid는 추가로 진행할 게임 수의 중간값을 나타냅니다.새로운 승률을 계산한 후, 현재 승률과 비교하여 조건에 맞게 left 또는 right를 조정합니다.현재 승률 계산: (int) ((long) wonGames * 100 / totalGames)를 통해 현재 승률을 계산합니다. 여기서 ..

[백준] 16926번 : 배열 돌리기 1 - Java

문제https://www.acmicpc.net/problem/16926주어진 N x M 크기의 2차원 배열과 정수 R이 주어집니다. 배열의 각 층을 시계 방향으로 R번 회전시키는 문제입니다. 배열의 크기와 회전 횟수에 따라 각 층이 어떻게 변하는지 구현하는 문제입니다.접근 방법층 분리:배열을 층별로 나누어 각 층을 별도로 다룹니다. 각 층은 외부에서 내부로 원형으로 구성된 요소들의 집합입니다.회전 처리:각 층을 회전시키기 위해, 우선 각 층을 1차원 배열로 변환한 뒤 회전한 후, 다시 2차원 배열로 복원합니다.출력:변환된 배열을 출력합니다.해결 방법층 분리:각 층의 시작과 끝 좌표를 정의하고, 해당 좌표에 위치한 요소들을 1차원 배열로 변환합니다.회전 처리:1차원 배열로 변환된 층을 시계 방향으로 회전합..

[백준] 2501번 : 약수 구하기 - Java

문제https://www.acmicpc.net/problem/2501자연수 N과 K가 주어졌을 때, N의 약수들 중에서 K번째로 작은 수를 구하는 문제입니다. 만약 K번째 약수가 존재하지 않는다면 0을 출력합니다.접근 방법1. 주어진 N의 약수를 찾습니다.2. 약수들을 리스트에 저장합니다.3. 리스트를 오름차순으로 정렬하여 K번째 약수를 출력 or 작다면 0을 출력코드import java.io.*;import java.util.ArrayList;import java.util.Collections;import java.util.StringTokenizer;public class Main { public static void main(String[] args) throws IOException { ..

[백준] 1251번 : 단어 나누기 - Java

문제https://www.acmicpc.net/problem/1251주어진 문자열을 세 부분으로 나누고, 각 부분을 뒤집은 후 합친 문자열 중에서 사전순으로 가장 앞서는 문자열을 찾는 문제입니다.접근 방법문자를 입력 받고, 세 부분으로 문자를 나누어 각 부분을 뒤집고, 뒤집은 세 단어를 합쳐 출력구현문자열 합치기:뒤집은 세 부분을 합쳐 새로운 문자열을 만듭니다.이 문자열을 리스트에 추가합니다.사전순 비교와 출력:모든 가능한 문자열을 리스트에 추가한 후, Collections.sort()를 사용하여 사전순으로 정렬합니다.정렬된 리스트의 첫 번째 요소를 출력합니다.코드import java.io.BufferedReader;import java.io.IOException;import java.io.InputSt..

[백준] 18352번 : 특정 거리의 도시 찾기 - Java

문제https://www.acmicpc.net/problem/18352주어진 그래프에서 특정 도시 X로부터 출발하여, 정확히 K 만큼 떨어져 있는 모든 도시를 찾는 문제입니다. 도시의 개수 N, 도로의 개수 M, 거리 정보 K, 출발 도시 X가 주어지며, 각 도로는 단방향입니다. 도시를 정확히 K만큼 이동하여 도달할 수 있는 도시들을 출력하고, 만약 그런 도시가 없다면 -1을 출력합니다.접근 방법문제는 그래프 탐색 문제로, 너비 우선 탐색(BFS)을 사용하여 해결할 수 있습니다. BFS는 모든 간선의 가중치가 동일한 상황에서 최단 거리를 찾는데 효과적입니다. 우리는 BFS를 사용하여 출발 도시 X로부터 모든 도시까지의 최단 거리를 구하고, 이 중에서 거리 K인 도시들을 출력하면 됩니다. 구현그래프 초기화..

[백준] 1193번 : 분수찾기 - Java

문제https://www.acmicpc.net/problem/1193지그재그 순회 방식으로 n번째 분수를 찾는 문제입니다. 분수는 대각선 방향으로 순회하며, 홀수 번째 대각선에서는 오른쪽 위 방향(↗)으로, 짝수 번째 대각선에서는 왼쪽 아래 방향(↙)으로 진행됩니다.접근 방법대각선 번호와 누적 칸 수 계산: n이 속하는 대각선 번호와 해당 대각선까지의 칸의 누적 합을 구합니다.짝수/홀수 대각선 구분: 짝수 대각선인 경우와 홀수 대각선인 경우에 따라 분자와 분모를 계산합니다.구현대각선 번호와 누적 칸 수 계산:crossCount는 현재 대각선 번호를 나타냅니다.square는 해당 대각선까지의 칸의 누적 합을 나타냅니다.n이 square보다 작아질 때까지 대각선 번호를 증가시키고 누적 칸 수를 업데이트합니다..

[백준] 2477번 : 참외밭 - Java

문제https://www.acmicpc.net/problem/2477참외밭의 변 길이와 방향이 주어졌을 때, 참외밭의 면적을 구하고 참외의 개수를 출력하는 문제접근 방법주어진 참외밭의 변 길이와 방향을 통해 큰 사각형의 최대 너비와 높이를 구합니다.큰 사각형에서 제외할 작은 사각형의 너비와 높이를 구합니다.큰 사각형의 면적에서 작은 사각형의 면적을 빼서 참외밭의 실제 면적을 구합니다.이 면적에 참외의 개수 K를 곱하여 총 참외의 수를 도출합니다.구현입력받기: 참외의 개수 K와 참외밭의 변 길이와 방향을 입력받습니다.큰 사각형의 변 길이 구하기: 방향이 1 또는 2인 경우(동쪽, 서쪽) 가장 긴 변을 maxWidth로 설정하고, 방향이 3 또는 4인 경우(남쪽, 북쪽) 가장 긴 변을 maxHeight로 설..

[백준] 9655번 : 돌 게임 - Java

문제https://www.acmicpc.net/problem/9655 두 명의 플레이어가 번갈아 가며 돌을 가져가는 게임입니다. 각 플레이어는 한 번에 1개 또는 3개의 돌을 가져갈 수 있습니다. 마지막 돌을 가져가는 사람이 승리하게 됩니다. 게임은 항상 상근이가 먼저 시작합니다. 주어진 돌의 개수 N이 입력으로 주어질 때, 상근이가 이기는지 창영이가 이기는지 출력하는 문제접근 방법DP 배열을 사용하여 각 돌의 개수에서 이길 수 있는지 여부를 저장합니다.상근이가 돌을 1개 또는 3개 가져갈 수 있기 때문에, 돌의 개수가 N-1 또는 N-3일 때 상대방이 지는 경우, 현재 돌의 개수 N에서는 상근이가 이기게 됩니다.돌의 개수가 1개 또는 3개일 때, 상근이가 이길 수 있습니다. (첫 번째로 가져가기 때문)..