목록Data Structure & Algorithm/PS - JAVA (270)
Dev.baelanche

배열에 이름과 키를 담아 키가 최대값인 이름만 출력시키면 된다. public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while(true) { int n = sc.nextInt(); String s[][] = new String[n][2]; if(n==0) break; float max = 0; for(int i=0; i max ? Float.parseFloat(s[i][1]) : max; } String name = ""; for(int i=0; i

아기 상어가 도움을 요청하지 않고 사냥도 안하고 무한정 머무를 수 있으므로 문제에서 요구하는 것은 최소 시간이다. 따라서 BFS로 배열을 순회하면 되겠다. 탐색 조건이 까다로워 BFS 를 "잘" 구현해야한다. *조건 1. 물고기 크기가 상어보다 작아야 잡아먹을 수 있다. 2. 물고기 크기와 상어의 크기가 같다면 크 위치로 이동할 수 있지만 먹을수는 없다. 3. 잡아먹을 수 있는 물고기가 여러마리이면 가장 위쪽의 물고기를 먹는다. 3-1. 3번 조건에서 가장 위쪽에 물고기가 없다면 가장 왼쪽의 물고기를 먹는다. 4. 잡아먹을 수 있는 물고기가 없다면 엄마 상어를 부른다. 필자가 구현할 로직을 아래에 서술하겠다. 1. 아기 상어의 위치에서 BFS 를 한다. 2. 잡아먹을수 있는 물고기가 있으면 잡아먹고 BF..

길이가 1일때 10(1+1+1+1+...+1) 길이가 2일때 55(1+2+3+4+...+10) 길이가 3일때 220(1+3+6+10+...+55) 이다. dp[2][1] = dp[1][1] dp[2][2] = dp[1][1] + dp[1][2] dp[2][3] = dp[1][1] + dp[1][2] + dp[1][3] ...... 을 바탕으로 점화식을 세워 풀이한다. 각 인덱스를 더하면 자료형의 범위를 초과할 수 있으므로 매 연산마다 10007 로 나누어주고 마지막에도 나누어주면 되겠다. public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); in..

수열은 자주 나오는 DP 문제이다. 이곳에서 LCS에 대한 설명을 확인할 수 있다. 위에서 나온 설명대로 점화식을 구현하여 풀었다. public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String a = " " + sc.next(); String b = " " + sc.next(); int dp[][] = new int[b.length()][a.length()]; for(int i=1; i

예제 1, 6, 9, 3, 6, 7 로 설명해보겠다. (집중국 개수 k=2) 1. 오름차순으로 정렬한다. (1, 3, 6, 6, 7, 9) 2. 새로운 배열 m을 만들어 각 센서 사이의 거리 정보를 담는다. (2, 3, 0, 1, 2) 3. m의 값 중 가장 큰 수를 뺀다. (필자는 0을 대입하는 방식으로 했다.) 4. 3번을 k-1 번 반복한다. 5. m배열의 모든 값을 더하여 출력한다. 채점 99% 에서 계속 런타임에러가 발생했는데, n = 1 일때에 대한 예외가 발생해서였다. 아래 코드에서 n = 1이면 m 배열의 길이가 0이어서 예외처리를 해주었다. 마찬가지로 n

public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int m = sc.nextInt(); char a[][] = new char[n][m]; for(int i=0; i

그리디 알고리즘 문제는 모두 최대값 구하는 방법만 찾아내면 된다. 입력이 40, 20, 30, 10 일때를 예로 들어보겠다. 1. 로프 중량을 오름차순으로 정렬한다. => 10, 20, 30, 40 2-1. 4개 로프를 모두 사용했을때 10 로프는 10*4의 무게를 들 수 있다. 2-2. 10을 제외한 3개 로프를 사용했을때 20 로프는 20*3의 무게를 들 수 있다. 2-3. 10, 20을 제외한 2개 로프를 사용했을때 30 로프는 30*2의 무게를 들 수 있다. 2-4. 40 로프만 사용했을때 40*1의 무게를 들 수 있다. 3. 위 경우 중 최대값을 출력한다. public class Main { public static void main(String[] args) { Scanner sc = new ..

그리디한 방식으로 접근하여 풀었다. 플러그를 뽑는 조건만 잘 잡으면 여러 방식으로 풀 수 있는데 나는 문제 그대로 구현하는 방식으로 했다. 1. 플러그에 빈 공간이 있으면 플러그를 꼽는다. 2. 플러그에 빈 공간이 없으면 이미 꽂혀져 있는 기기에 대한 사용 계획을 찾아야 한다. 2-0. 꽂혀져 있는 플러그와 지금 꽂을 플러그가 같은 기기라면 통과한다. 2-1. 꽂혀져 있는 플러그 중 이후에 사용 계획이 없다면 최우선으로 뽑는다. 2-2. 꽂혀져 있는 플러그 모두가 이후에도 사용 계획이 있다면 사용 계획이 느린 것부터 뽑는다. 무턱대고 구현한 코드라 주석을 많이 남겼다. public class Main { public static void main(String[] args) { Scanner sc = ne..