목록그리디 (15)
Dev.baelanche
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bbpEun/btqvIk9ZmRm/RKkdwHCIdHMUhLFeztGjpk/img.png)
30의 배수인지를 확인하려면 두가지를 검사하면 된다. 1. 수에 0이 적어도 1개 있어야 한다. 2. 각 자리수의 합이 3의 배수여야 한다. 위 두가지를 만족한다면 각 자리수를 내림차순으로 정렬하여 출력해주면 된다. public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); char c[] = sc.next().toCharArray(); Integer a[] = new Integer[c.length]; for(int i=0; i
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/posYK/btquJGZYr8e/aK5BbUsenn5phjGeQz14ok/img.png)
예제 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
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bd4mPr/btquLaMO1tf/k3JZbDyYF1kR4yQIN8e9a0/img.png)
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
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/l4vZm/btquL1hycg4/bNMuoYmLVwyN0ZUNjgHpg1/img.png)
그리디 알고리즘 문제는 모두 최대값 구하는 방법만 찾아내면 된다. 입력이 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 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/E5Fl8/btquKIC0e9K/Ze8A7SKuesSOTkz5c4rbo0/img.png)
그리디한 방식으로 접근하여 풀었다. 플러그를 뽑는 조건만 잘 잡으면 여러 방식으로 풀 수 있는데 나는 문제 그대로 구현하는 방식으로 했다. 1. 플러그에 빈 공간이 있으면 플러그를 꼽는다. 2. 플러그에 빈 공간이 없으면 이미 꽂혀져 있는 기기에 대한 사용 계획을 찾아야 한다. 2-0. 꽂혀져 있는 플러그와 지금 꽂을 플러그가 같은 기기라면 통과한다. 2-1. 꽂혀져 있는 플러그 중 이후에 사용 계획이 없다면 최우선으로 뽑는다. 2-2. 꽂혀져 있는 플러그 모두가 이후에도 사용 계획이 있다면 사용 계획이 느린 것부터 뽑는다. 무턱대고 구현한 코드라 주석을 많이 남겼다. public class Main { public static void main(String[] args) { Scanner sc = ne..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/ct4Vjs/btquGEgJdGq/LzBMYn1fqwOZEQkaTNAgFk/img.png)
좌측에 주어진 수부터 테이프로 메꾼다. 테이프는 -0.5, +0.5 만큼 덮어야하므로 구멍의 위치가 1, 2 테이프 길이가 1이면 2개가 있어야 모두 덮을 수 있다. 따라서 범위 조건은 1
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/HqzVH/btquI1BMJUp/ta0KsWJNQlr2OQnVaCi2N1/img.png)
캠핑장 이용일 수를 최대로 하기 위해, 전체 휴가 수에서 캠핑 이용일 수를 빼고 캠핑장 이용 불가능 한 수를 번갈아 빼며 진행한다. public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int c = 1; while(true) { int l = sc.nextInt(); int p = sc.nextInt(); int v = sc.nextInt(); if(l == 0 && p == 0 && v == 0) break; int use = 0; while(true) { if(v >= l) { v -= l; use += l; } else { use += v; v = 0; } v -= p - l;..