본문 바로가기

알고리즘/BAEKJOON34

[백준] 2239 스도쿠 (Java) [2239 스도쿠] 난이도: 골드4 2239번: 스도쿠 스도쿠는 매우 간단한 숫자 퍼즐이다. 9×9 크기의 보드가 있을 때, 각 행과 각 열, 그리고 9개의 3×3 크기의 보드에 1부터 9까지의 숫자가 중복 없이 나타나도록 보드를 채우면 된다. 예를 들어 다 www.acmicpc.net 문제 입력 출력 [아이디어] 백트래킹을 사용하여 가지치기를 하였다. 처음에는 빈칸에 하나의 수를 결정할 때마다 for문을 통하여 가능한지의 여부를 찾았다. 시간초과가 뜨지 않았지만 다른 사람들이 시간을 훨씬 덜 쓰길래 찾아보았더니 for문을 사용하여 가능하지를 따지지 않고 따로 배열을 생성하여 체크하는 방법을 알게되었다. i행에 쓰인 숫자를 체크하는 배열 -> row[][] i열에 쓰인 숫자를 체크하는 배열 -> col[.. 2022. 4. 6.
[백준] 1520 내리막 길 (Java) [1520 내리막 길] 난이도: 골드4 1520번: 내리막 길 첫째 줄에는 지도의 세로의 크기 M과 가로의 크기 N이 빈칸을 사이에 두고 주어진다. 이어 다음 M개 줄에 걸쳐 한 줄에 N개씩 위에서부터 차례로 각 지점의 높이가 빈 칸을 사이에 두고 주어진다. www.acmicpc.net 문제 입력 출력 [아이디어] 처음에는 일반 DFS로 풀었다가 시간 초과가 났다. (다시 생각해보니 대략 500 * 500 * 500 * 500 * 4 정도의 시간이 걸리므로 시간 초과가 나는 것은 당연했다.) 시간 초과가 났기 때문에 DP로 풀어야 하나는 것은 알아챘지만 어떻게 DP를 적용해야 하는지 모르겠어서 구글링을 해봤다. 이 분이 설명을 위해 만들어 놓은 애니메이션으로 접근 방법을 알아 차릴 수 있었다. [백준][.. 2022. 4. 4.
[백준] 14002 가장 긴 증가하는 부분 수열 4 (Java) [14002 가장 긴 증가하는 부분 수열 4] 난이도: 골드4 14002번: 가장 긴 증가하는 부분 수열 4 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이 www.acmicpc.net 문제 입력 출력 [아이디어] D[i] = i번째 이전에 i번째 수보다 작은 수의 부분 수열의 길이 중 최대 길이 + 1 pre[i] = D[i]에서 찾은 최대 부분 수열의 길이를 가진 수의 인덱스 기존 가장 긴 증가하는 부분 수열과의 차이점은 부분 수열이 필요하다는 점이다. 따라서 pre 배열로 i 번째 이 전에 지나친 .. 2022. 3. 31.
[백준] 2156 포도주 시식 (Java) [2156 포도주 시식] 난이도: 실버1 2156번: 포도주 시식 효주는 포도주 시식회에 갔다. 그 곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도주 잔이 일렬로 놓여 있었다. 효주는 포도주 시식을 하려고 하는데, 여기에는 다음과 같은 두 가지 규 www.acmicpc.net 문제 입력 출력 [아이디어] 0, 1, 2번 연속해서 마시는 경우를 생각하여 2차원 배열을 잡아준다. D[i][j] = i번째 포도주가 0번째 연속해서 마시는 경우라고 생각하자. D[i][0]: i번째 음료를 마시지 않는 경우 -> i-1번째에서 가장 큰 값 가져오기 D[i][1]: i번째 음료를 1번째 연속으로 마신 경우 -> i-2번째애서 가장 큰 값 + 현재 포도주 값 D[i][2]: i번째 음료를 2번째 연속으로 마.. 2022. 3. 30.
[백준] 14500 테트로미노 (Java) [14500 테트로미노] 난이도: 골드5 14500번: 테트로미노 폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되어 있어야 한다. 정사각형의 변 www.acmicpc.net 문제 입력 출력 [아이디어] 'ㅜ' 모양을 제외하면 크기가 4인 DFS 모양이 된다. 'ㅜ' 모양은 모든 모양을 생각해준다. [JAVA 코드] import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main { static Buff.. 2022. 3. 30.
[백준] 11727 2xn 타일링2 (Java) [11727 2xn 타일링2] 난이도: 실버3 11727번: 2×n 타일링 2 2×n 직사각형을 1×2, 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×17 직사각형을 채운 한가지 예이다. www.acmicpc.net 문제 입력 출력 [아이디어] 지금 문제를 풀기 전에 이 문제를 풀고 오는 것이 더 이해하기 쉽다. [백준] 11726 2xn 타일링 (Java) [11726 2xn 타일링] 난이도: 실버3 11726번: 2×n 타일링 2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×5 크기의 직사각형을 채운 한 가지 kyeee2.tistory.com D[i] = 2 x i 의 직사각형을 채우는 방법.. 2022. 3. 25.
[백준] 11726 2xn 타일링 (Java) [11726 2xn 타일링] 난이도: 실버3 11726번: 2×n 타일링 2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다. www.acmicpc.net 문제 입력 출력 [아이디어] D[i] = 2 x i 의 직사각형을 채우는 방법 이라고 정하자. 2 x 1 의 크기의 블럭을 놓은 경우 2 x (n - 1) 크기의 블럭을 채워야한다. 1 x 2 크기의 블럭은 2개를 같이 놓는 방법뿐이다. 이 때 2 x (n - 2) 크기의 블럭을 채워야한다. 따라서 D[i] = D[i-1] + D[i-2] 의 점화식이 나온다. [JAVA 코드] import java.io.BufferedReader; impo.. 2022. 3. 25.
[백준] 1647 도시 분할 계획 (Java) [1647 도시 분할 계획] 난이도: 골드4 1647번: 도시 분할 계획 첫째 줄에 집의 개수 N, 길의 개수 M이 주어진다. N은 2이상 100,000이하인 정수이고, M은 1이상 1,000,000이하인 정수이다. 그 다음 줄부터 M줄에 걸쳐 길의 정보가 A B C 세 개의 정수로 주어지는데 A번 www.acmicpc.net 문제 입력 출력 [아이디어] 우선 모든 마을을 유지비의 합의 최솟값으로 연결해준다. 즉 MST를 구해준다. 그 후 마을을 연견한 길 중 최대 유지비를 가진 길을 끊어주면 유지비의 합이 최소인 마을 2개를 구할 수 있다. [JAVA 코드] import java.io.BufferedReader; import java.io.IOException; import java.io.InputSt.. 2022. 3. 10.
[백준] 1197 최소 스패닝 트리 (Java) [1197 최소 스패닝 트리] 난이도: 골드4 1197번: 최소 스패닝 트리 첫째 줄에 정점의 개수 V(1 ≤ V ≤ 10,000)와 간선의 개수 E(1 ≤ E ≤ 100,000)가 주어진다. 다음 E개의 줄에는 각 간선에 대한 정보를 나타내는 세 정수 A, B, C가 주어진다. 이는 A번 정점과 B번 정점이 www.acmicpc.net 문제 입력 출력 [아이디어] 최소 스패닝 트리는 주어진 그래프의 모든 정점들을 연결하는 부분 그래프 중에서 최소의 가중치 합을 가지는 그래프이다. MST 는 간적크, 간만프 -> 간선이 적으면 크루스칼, 간선이 많으면 크프림 알고리즘을 적용하는게 기본이지만 절대적이지는 않다. 하지만 나는 union, find를 활용하였다. [JAVA 코드] import java.io.B.. 2022. 3. 10.
[백준] 1202 유기농 배추 (Java) [1012 유기농배추] 난이도: 실버2 1012번: 유기농 배추 차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에 www.acmicpc.net 문제 입력 출력 [아이디어] 배추밭을 완전 탐색한다. 배추가 심어져 있는 위치에서 BFS를 사용하여 서로 인접해있는 배추를 체크한다. 몇 개의 배추 더미가 있는지 세어준다. [JAVA 코드] import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.LinkedList; import java.util.. 2022. 3. 3.