본문 바로가기

분류 전체보기

(308)
[백준] 1620 나는야 포켓몬 마스터 이다솜 (JAVA) https://www.acmicpc.net/problem/1620 1620번: 나는야 포켓몬 마스터 이다솜 첫째 줄에는 도감에 수록되어 있는 포켓몬의 개수 N이랑 내가 맞춰야 하는 문제의 개수 M이 주어져. N과 M은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수인데, 자연수가 뭔지는 알지? 모르면 www.acmicpc.net 풀이 이 문제는 자바의 해시맵으로 간단히 구현할수있다. 우선 입력값을 차례대로 해시맵에 넣고 그다음 문제에서 주는 key값과 value값에 알맞게 출력하면된다. 여기서 문제는 key값을 주어졌을 경우는 hashMap의 get을 이용해 꺼내면 되지만 value가 주어졌을경우는 따로 할수있는방법이 없다 물론 key set을 꺼내어 하나씩 맞추어 가면서 출력하면 시간초과로 ..
[백준] 9905 1, 2, 3 더하기 (JAVA) https://www.acmicpc.net/problem/9095 9095번: 1, 2, 3 더하기 각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다. www.acmicpc.net 풀이 위의 문제는 기본적인 dp문제이다. 우선 접근법은 간단하다. 우리는 어떠한 수 x가 들어온다고 하였을경우 x-1, x-2, x-3을 한다. 그 이후 각각의 수가 만약 이전에 계산하여 구했던 적이 있다면 그대로 dp배열에 있는 값을 반환해준다. 예를 들어 4를 x라고 하였을 경우 우리는 3 + 1, 2 + 2, 1 +3을 하여 경우의 수를 구하게 된다. 이때 각각의 연산값을 자세히 보면 3 + 1의 경우는 1, 2, 3만으로 3을 만들었는 경우에서 1을 각각 더하면 4가 되기에 우리는 dp[..
[백준] 1764 듣보잡 (JAVA) https://www.acmicpc.net/problem/1764 1764번: 듣보잡 첫째 줄에 듣도 못한 사람의 수 N, 보도 못한 사람의 수 M이 주어진다. 이어서 둘째 줄부터 N개의 줄에 걸쳐 듣도 못한 사람의 이름과, N+2째 줄부터 보도 못한 사람의 이름이 순서대로 주어진다. www.acmicpc.net 풀이 이 문제는 단순히 자바의 해쉬셋에 대해서 물어보는 문제이다. 우선 해쉬셋하나와 링크드 리스트를 하나 선언하고 그다음 듣도 못한 인원의 이름을 해쉬셋에 저장한다. 그다음 보도 못한 인원의 이름을 입력받는데 이때 만약 보도 못한 인원의 이름이 해쉬셋에 있다면(보도못한 인원의 이름이 듣도 못한 인원의 의 해쉬셋에 있다면 ) 링크드리스트에 추가를 한다. 코드 import java.io.*; imp..
[백준] 1074 백준 (JAVA) https://www.acmicpc.net/problem/1074 1074번: Z 한수는 크기가 2N × 2N인 2차원 배열을 Z모양으로 탐색하려고 한다. 예를 들어, 2×2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다. N > 1인 경우, 배열을 www.acmicpc.net 풀이 이 문제는 처음에는 재귀를 이용한 분할 정복 문제이다. 여기서 중요한 점은 n이 조금만 커져도 배열의 크기가 엄청 커진다는 점이다. 그렇기에 우리는 불필요한 위치까지 탐색할 필요가 없다. 여기서 중요한 점은 전체 배열의 크기를 줄인다는것에 있다. 즉 문제에서 주어지는 r, c는 가만히 두되 전체 배열의 크기를 점점 줄여 나가면서 (r,c)가 위치한 사분면에 따라 분할하고 재귀적으로 ..
[백준] 1003 피보나치 함수 (JAVA) 풀이 이 문제는 dp를 이용한 피보나치 수열문제의 연장선이다. 문제에서는 0과 1이 출력하는 수 구하라고 하였는데 이는 곧 dp로 치환하여 풀면 다음과 같다. f_0(n) --> n일때 0의 출력수 f_1(n) --> n일때 1의 출력수 라고 가정을 한다면 이는 f_0(2) = f_0(1) +f_0(0), f_0(3) = f_0(2) + f_0(1) 과 같다. 그러므로 기존에 하던 dp그대로 하면된다. 하지만 여기서 주의해야할 점은 0과1 을 동시에 처리해줘야하는것이다. (아니면 시간초과가 난다... 자바....ㅜㅜ) 코드 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import ja..
[백준] 14503 로봇 청소기 (JAVA) 풀이 이 문제는 처음에 보았을떄는 난해하였으나 천천히 보면 크게 두가지로 볼수있다. 해당 위치에서 상하좌우로 탐색하는 경우와 탐색할 수있는곳이 없는 두가지가 있다. 첫번째는 재귀를 이용한 DFS처럼 하여 탐색을 한다, 이때 만약 탐색이 가능하다면 따로 boolean 변수를 이용해 확인을 한다. 이때 역시 재귀를 이용한 DFS를 이용해서 탐색한다. 코드 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; class Main { public static int N, M; public static int[][] map; public st..
[백준] 14500 테트로노미노 (JAVA) 풀이 이 문제를 처음 접근할떄는 어떠한 규칙이 있는지 확인 하였다. 그러나 문득 어느 한점에서 DFS처럼 갈수있는 공간을 하나씩 만들다보면 테트로노미노를 대칭 혹은 회전시킨 도형이 나온다는것을 알아차리고 DFS로 하였다. 물론 이러면서 중복이 발생하는 경우도 있었지만 신경쓰지 않고 진행하였다. 그리고 마지막으로 ㅗ모양을 따로 처리를 해주어야 한다. 또한 중간에 Math.max함수를 사용할수 있음에도 사용하지 않은 이유는 풀이시간이 차이가 나기때문이다. 처음 통과하였을떄는 Math.max를 하였는 결과값이고 두번째는 삼항연산자로 하였는것이다. 코드 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamRead..
[백준] 9251 LCS (JAVA) 풀이 dp를 이용하여 푸는 문제이다 주의해야할점은 dp배열이 2차원이라는 것이다. 나는 아래의 블로그를 참고하였다. https://st-lab.tistory.com/139 [백준] 9251번 : LCS - JAVA [자바] www.acmicpc.net/problem/9251 9251번: LCS LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAY.. st-lab.tistory.com 코드 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; class ..
[백준] 1753 최단경로 (JAVA) 풀이 위 문제는 자료구조에서 접할수있는 기본적인 그래프 문제이다. 이 문제에서는 전부 양의 간선이고 방향이 있기에 다익스트라 알고리즘을 사용하였다 또한 그래프를 탐색할때는 우선순위 큐를 사용했는데 우선순위큐를 사용한 이유에 대해서는 조금더 고민을 해보아야 할것 같다. 코드 import java.io.*; import java.util.*; class Main { static class Node implements Comparable { int end; int weight; public Node(int end, int wright) { this.end = end; this.weight = wright; } @Override public int compareTo(Node o) { return weight -..
[백준] 14502 연구소 (JAVA) 풀이 위의 문제는 BFS와 DFS를 적당히 조합하여 푸는 문제이다. 문제를 푸는 순서는 다음과 같다. 문제에서 벽을 3개를 세워 안전구역의 최대값을 구하라고 하였다. 우리는 벽을 세우고 바이러스를 퍼트리는 일을 한번에 할수 없으니 벽을 먼저 세우고 만약 세운 벽의 개수가 3개이면 바이러스를 퍼트리는 식으로 하였다. 벽을 세우는 과정은 브루트 포스로 처음부터 끝까지 모든 경우의 수를 확인 하였고 바이러스를 퍼트리는 과정은 퍼트리기전 바이러스의 위치를 큐에 전부 넣고 큐에 있는 바이러스 위치를 토대로 하나씩 뽑아 가면서 퍼트릴수있다면 퍼트리고 큐에 추가하는 방식으로 진행하였다. 코드 import java.io.BufferedReader; import java.io.IOException; import java..