n = int(input())
bag = 0

while n >= 0:
    if n % 5 == 0:
        bag += (n // 5)
        print(bag)
        break
    # 5로만 나눠지지 않는 경우
    n -= 3
    bag += 1
else:
    print(-1)

⊙ 문제

 

사람수만큼 걸리는 시간을 입력받았을때 걸리는 시간을 최소화 하려면

시간이 적게 걸리는 사람부터 인출을 하면 된다.

따라서 사람수 만큼 시간을 입력받고 오름차순 정렬을 해주면 문제를 해결할 수 있다.

이때 사람마다 걸리는 시간과 총 걸리는 시간 변수를 따로 만들어 답을 얻을 수 있다.

import java.util.Arrays;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		
		int n = in.nextInt();	// 사람수 입력받기
		int p[] = new int[n];	// 각각 사람별 걸리는 시간
		int delayTime=0;
		int sum = 0;
		
		// 사람별 걸리는 시간 입력받기
		for(int i=0;i<n;i++) {
			p[i] = in.nextInt();
		}
		Arrays.sort(p);
		
		for(int i=0;i<p.length;i++) {
			delayTime = delayTime + p[i];;
			sum = sum + delayTime;
		}
		
		System.out.println(sum);
		
	}

}

 

문제


문제에서 예시로 제시한 시간들을 정리해보면 겹치지 않는 시간은

(1,4), (5,7), (8,11), (12,14)임을 알 수 있다.

 


JAVA 정렬

java.util.Arrays 유틸리티 클래스를 사용해 배열을 정렬, 복제, 리스트로 변환 등의 작업을 할 수 있다.

sort()메서드로 오름차순 정렬이 가능하다. 이때, 오름차순인 이유는 Class 내에 Comparable Interface의 compareTo메서드가 기준이기 떄문이다.

 

오름차순이 아닌 다른 정렬조건으로 하려면 Class내에 구현된 Comparable인터페이스의 compareTo()메서드를 원하는 조건으로 오버라이드해서 compare()메서드를 원하는 조건으로 오버라이드해서 사용하면 된다.

 

예를 들면 밑에와 같은 방법으로 사용할 수 있다.

Integer[] arr = {3, 50, 30, 29, 59};

Arrays.sort(arr, new Comparator<Integer>() {
    @Override
    public int compare(Integer i1, Integer i2) {
        return i2 - i1;
    }
});

코드

package greedy;

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

public class num1931 {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		
		int num = in.nextInt();	// 회의의 수 입력받음.
		int [][] time = new int[num][2];	// 회의의 수만큼 시작시간, 끝나는시간 입력받음. 행은 회의수만큼 열은 2개씩
		
		for(int i=0;i<num;i++) {
			time[i][0]=in.nextInt();	// 0열에는 시작시간
			time[i][1]=in.nextInt();	// 1행에는 끝나는 시간
		}
		
		// 정렬해주기
		Arrays.sort(time, new Comparator<int[]>() {
			@Override
			public int compare(int[] i1, int[] i2) {
				if(i1[1] == i2[1]) {
					return i1[0] - i2[0];
				}
				return i1[1] - i2[1];
			}
		});
		
		int count = 0;
		int end_time = 0;
		
		for(int i=0;i<num;i++) {	// 회의 수만큼 반복
			if(end_time<=time[i][0]) {	// 시작하는 시간이 전타임 끝나는 시간보다 많거나 같아야됨.
				end_time = time[i][1];	//	끝나는 시간이 다시 이전타임으로 변경
				count++;	// 가능한 회의 수 추가
			}
		}
		System.out.println(count);
	}
}

1931 백준 문제

https://www.acmicpc.net/problem/1931

 

1931번: 회의실 배정

(1,4), (5,7), (8,11), (12,14) 를 이용할 수 있다.

www.acmicpc.net


◎ 문제

 

동전 종류의 개수를 n으로 주고 뒤에 금액 k를 적으면 최소로 동전을 사용한 개수를 구하는 문제이다.

 

처음에 동전의 개수가 10개일때,

화폐 단위는 1원 5원 10원 50원 100원 500원 1000원 5000원 10000원 50000원으로 예시를 들어서 화폐 단위 규칙이 x5,x2가 반복되는 문제로 풀었는데 아니였다.. 그냥 예시로 둔게 1,5,10...이였고 화폐단위 역시 사용자에게 입력을 받아 언제든 달라질수 있는 값들이였다.


◎ 코드

package greedy;

import java.util.Scanner;

public class num11047 {

	public static void main(String[] args) {
		try {
			Scanner in = new Scanner(System.in);
			
			int n = in.nextInt();	// 동전의 개수
			int k = in.nextInt();	// 돈
			int count = 0;			// 최소 동전 개수

			int coin[] = new int[n];	//입력받은 동전의 개수많큼 동전 단위 입력받기
			
			for(int i=0;i<n;i++) {
				coin[i] = in.nextInt();	// 화폐 단위 개수 만큼 입력 받기
			}
			
			for(int j=n-1;j>=0;j--) {	//입력받은 개수 큰것부터 글자 나누기
				if(coin[j]<=k) {	// 입력받은 돈보다 동전 화폐단위가 작거나 같아야됨
					count = count + k/coin[j];	// 큰 화폐단위 동전부터 나눠서 개수 count에 쌓기
					k = k%coin[j];	// 나머지 돈으로 다시 세팅
				}
			}
			System.out.println(count);
			
		} catch (Exception e) {
			System.out.println(e);
		}
		
		
	}

}

위는 이클립스에 따로 풀어본 것이고 백준에 제출할때는

패키지를 지우고 클래스 이름을 Main으로 해야 정답으로 인정받을 수 있다.

 

백준 입력시 정답

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		try {
			Scanner in = new Scanner(System.in);
			
			int n = in.nextInt();	// 동전의 개수
			int k = in.nextInt();	// 돈
			int count = 0;			// 최소 동전 개수

			int coin[] = new int[n];	//입력받은 동전의 개수많큼 동전 단위 입력받기
			
			for(int i=0;i<n;i++) {
				coin[i] = in.nextInt();	// 화폐 단위 개수 만큼 입력 받기
			}
			
			for(int j=n-1;j>=0;j--) {	//입력받은 개수 큰것부터 글자 나누기
				if(coin[j]<=k) {	// 입력받은 돈보다 동전 화폐단위가 작거나 같아야됨
					count = count + k/coin[j];	// 큰 화폐단위 동전부터 나눠서 개수 count에 쌓기
					k = k%coin[j];	// 나머지 돈으로 다시 세팅
				}
			}
			System.out.println(count);
			
		} catch (Exception e) {
			System.out.println(e);
		}
		
		
	}

}

 

+ Recent posts