본문 바로가기

Algorithm

(41)
[Java] BOJ11403_경로찾기 www.acmicpc.net/problem/11403 11403번: 경로 찾기 가중치 없는 방향 그래프 G가 주어졌을 때, 모든 정점 (i, j)에 대해서, i에서 j로 가는 경로가 있는지 없는지 구하는 프로그램을 작성하시오. www.acmicpc.net 모든 정점에 대해 모든 경로를 구하는 문제로, 플로이드-와샬 알고리즘으로 구현할 수 있다. 보통의 플로이드-와샬은 최단 비용을 구하기 위해 사용되지만 이 문제 같은 경우에는 갈 수 있는지만을 판단하는 것이기 때문에 i에서 j로 가는데 k를 거쳐서 갈 수 있을 경우 arr[i][j]를 1로 업데이트해주면 해결된다. import java.io.*; import java.util.StringTokenizer; public class Bj11403 { publ..
[Java] BOJ1107_리모컨 www.acmicpc.net/problem/1107 1107번: 리모컨 첫째 줄에 수빈이가 이동하려고 하는 채널 N (0 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 고장난 버튼의 개수 M (0 ≤ M ≤ 10)이 주어진다. 고장난 버튼이 있는 경우에는 셋째 줄에는 고장난 버튼 www.acmicpc.net 달리 빠르게 찾을 방법이 없기에 단순 브루트 포스 문제이다. 가능한 숫자들을 순서에 상관 있게 누르고 같은 숫자를 또 누를 수 있기 때문에 중복순열로 구현하였다. 주의할 점은 찾아가야할 채널의 길이만큼만 누르는 것이 아니고 그보다 하나 짧은 길이, 하나 긴 길이를 다 체크해줘야 한다. 세 가지 체크를 하나의 함수로 구현할 방법도 있겠지만 나는 무식하게 각자 함수로 구현했다. 이래저래 조건 따지며..
[Java] BOJ11053_가장 긴 증가하는 부분 수열 www.acmicpc.net/problem/11053 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이 www.acmicpc.net 문제 제목 그대로 최장 증가 부분 수열 문제이다. N의 범위가 1000으로 작기 때문에 단순 이중 포문으로도 구현 가능하다. DP[i]는 i번째 수를 마지막 원소로 가지는 수열의 길이를 의미한다. i번째 이전의 수들을 j번째 수라고 하면 i번째 수가 j번째 수보다 크고 현재 수열의 길이가 dp[j]+1보다 작다면 dp[i]를 업데이트..
[Java] BOJ10844_쉬운 계단 수 www.acmicpc.net/problem/10844 10844번: 쉬운 계단 수 첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다. www.acmicpc.net 출력 조건에서 값이 매우 크기 때문에 브루트 포스로는 할 수 없다는 것을 알았고, 이전 자리까지의 수가 다음 자리의 수를 결정하기 때문에 DP라는 것을 유추할 수 있었다. N자리 수에서 0, 1, 2, 3, 4, 5, 6, 7, 8, 9가 맨 끝에 몇 개 올 수 있는지에 대하여 DP 배열을 구성했다. 주의할 점은 0은 1번째자리에서 존재할 수 없고, 이전 수는 오직 1뿐만이 가능하다. 9는 8뿐만이 가능하다. 0과 9는 서로 계단 수가 아니다. 나머지 수는 자신보다 큰 값이나 작은 값 다음에 올 수 있다. *시도는 안해봤지만..
[Java] BOJ10836_여왕벌 www.acmicpc.net/problem/10836 10836번: 여왕벌 입력의 첫 줄에는 격자칸의 가로와 세로 크기 M(2 ≤ M ≤ 700)과 날짜 수 N(1 ≤ N ≤ 1,000,000)이 자연수로 주어진다. 첫날 아침의 애벌레 크기는 모두 1이므로 입력에 주어지지 않는다. 다음 N개의 www.acmicpc.net 단순 구현 문제이지만 생각보다 시간이 엄청 빡빡했다. 우선 날짜 수가 최대 백만으로 매우 크기 때문에 날짜마다 전체 배열을 업데이트시켜주는 것은 안된다. 제일 왼쪽 열과, 제일 위쪽 행의 애벌레들은 자신이 자라는 정도를 스스로 결정한다. 이들은 입력으로 주어질 것이다. 애벌레들이 자라는 정도를 왼쪽 제일 아래 칸에서 시작하여 위쪽으로 가면서 읽고, 제일 위쪽 칸에 도착하면 오른쪽으로 가..
[Java] BOJ1074_Z www.acmicpc.net/problem/1074 1074번: Z 한수는 크기가 2N × 2N인 2차원 배열을 Z모양으로 탐색하려고 한다. 예를 들어, 2×2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다. 만약, N > 1이 라서 www.acmicpc.net "만약, N > 1이 라서 왼쪽 위에 있는 칸이 하나가 아니라면, 배열을 크기가 2N-1 × 2N-1로 4등분 한 후에 재귀적으로 순서대로 방문한다." 문제에 분할정복과 재귀의 힌트가 다 주어졌다. 배열의 크기가 최대 2^15 * 2^15 이므로 배열 전체를 탐색하면 당연히 시간초과가 난다. import java.io.*; import java.util.StringTokenizer; public clas..
[Java] BOJ1068_트리 www.acmicpc.net/problem/1068 1068번: 트리 첫째 줄에 트리의 노드의 개수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 0번 노드부터 N-1번 노드까지, 각 노드의 부모가 주어진다. 만약 부모가 없다면 (루트) -1이 주어진다 www.acmicpc.net 트리에서 어떤 노드를 지웠을 때 남아있는 리프 노드의 수를 출력하는 문제이다. 해당 노드를 지우고 트리를 탐색해 리프 노드의 수만 세어주면 된다. 트리구조를 만들 때 리스트를 사용해서 만들었기 때문에 remove 함수로 해당 노드를 지우고 dfs방식으로 트리를 탐색해 리프 노드의 수를 셌다. 리프 노드는 자식 노드가 없는 노드로, 리스트 크기가 0인 노드를 의미한다. *예제는 각 노드의 부모 번호가 오름차..
[Java] BOJ10282_해킹 www.acmicpc.net/problem/10282 10282번: 해킹 최흉최악의 해커 yum3이 네트워크 시설의 한 컴퓨터를 해킹했다! 이제 서로에 의존하는 컴퓨터들은 점차 하나둘 전염되기 시작한다. 어떤 컴퓨터 a가 다른 컴퓨터 b에 의존한다면, b가 감염되면 www.acmicpc.net "어떤 컴퓨터 a가 다른 컴퓨터 b에 의존한다면, b가 감염되면 그로부터 일정 시간 뒤 a도 감염되고 만다. 이때 b가 a를 의존하지 않는다면, a가 감염되더라도 b는 안전하다." 이 부분에서 단방향 그래프라는 사실을 알 수 있다. 해킹당한 컴퓨터 번호 C에서부터 시작하여 감염되는 컴퓨터를 찾아 나아가는 다익스트라 알고리즘이다. result의 값이 바뀐 컴퓨터의 수를 세어 총 감염되는 컴퓨터의 수를 구했고 그 컴퓨..