[백준] 방 번호 (java) Math

2020-02-26

방 번호 (백준> Math)

문제 링크

문제설명

다솜이는 은진이의 옆집에 새로 이사왔다. 다솜이는 자기 방 번호를 예쁜 플라스틱 숫자로 문에 붙이려고 한다.

다솜이의 옆집에서는 플라스틱 숫자를 한 세트로 판다. 한 세트에는 0번부터 9번까지 숫자가 하나씩 들어있다. 다솜이의 방 번호가 주어졌을 때, 필요한 세트의 개수의 최솟값을 출력하시오. (6은 9를 뒤집어서 이용할 수 있고, 9는 6을 뒤집어서 이용할 수 있다.)

입력

첫째 줄에 다솜이의 방 번호 N이 주어진다. N은 1,000,000보다 작거나 같은 자연수 또는 0이다.

출력

첫째 줄에 필요한 세트의 개수를 출력한다.

예제 입력 1 복사

9999

예제 출력 1 복사

2


풀이

package Math;

import java.util.*;

public class beak_방번호 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		String s = sc.nextLine();
		
		int arr[] = new int[10];
		
		for(int i=0;i<s.length();i++) {
			int k = s.charAt(i)-'0';			
			if(k==9)
				arr[6]++;
			else
				arr[k]++;
		}

        
		int max = 0;
        arr[6] = Math.round(arr[6]/2.0f); // 반올림!!!!!!!
        for(int i=0;i<10;i++)
            max=Math.max(max, arr[i]);
        
		System.out.println(max);
	}
}

후기 (30min)

9일때도, 6일때도 전부 arr[6]에 넣어주고,
그냥 2로 나누는게 아니고, 반올림을 해줘야 한다!!


tip

  1. math 함수 잘 익혀놓자!
Read More

[백준] 대회 or 인턴 (java) Greedy

2020-02-26

대회 or 인턴 (백준> Greedy)

문제 링크

문제설명

백준대학교에서는 대회에 나갈 때 2명의 여학생과 1명의 남학생이 팀을 결성해서 나가는 것이 원칙이다. (왜인지는 총장님께 여쭈어보는 것이 좋겠다.)

백준대학교는 뛰어난 인재들이 많아 올해에도 N명의 여학생과 M명의 남학생이 팀원을 찾고 있다.

그런데 올해에는 대회에 참여하려는 학생들 중 K명을 반드시 인턴쉽 프로그램에 참여하라는 학교의 방침이 생기게 되었다. 인턴쉽에 참여하는 학생은 대회에 참여하지 못한다.

백준대학교에서는 뛰어난 인재들이 많기 때문에, 많은 팀을 만드는 것이 최선이다.

여러분은 N명의 여학생과 M명의 남학생, K명의 인턴쉽에 참여해야하는 인원이 주어질 때 만들 수 있는 최대의 팀 수를 구하면 된다.

입력

첫째 줄에 N, M, K가 순서대로 주어진다. (0 ≤ M ≤ 100), (0 ≤ N ≤ 100), (0 ≤ K ≤ M+N),

출력

만들 수 있는 팀의 최댓값을 출력하면 된다.

예제 입력 1 복사

6 3 2

예제 출력 1 복사

2


풀이

package Greedy;

import java.util.*;

public class beak_대회or인턴 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int n = sc.nextInt();
		int m = sc.nextInt();
		int k = sc.nextInt();
		
		//k==0: 인턴 0이면 적게 만들 수 있는 팀으로 나간다
		//k!=0: 인턴으로 나가야 하는 인원이 있다면 -> 인원만큼 빼고 팀으로 나갈 수 있는 인원 체크
		System.out.println( Math.min(Math.min(n/2, m), (m+n-k)/3));
		
	}
}

후기 (30min)

  1. 인턴이 0일때
    1. 여자로 만들 수 있는 팀 (n/2) 과 남자로 만들 수 있는 팀(m) 중 작은거
  2. 인턴이 0이 아닐때
    1. 인원만큼 빼고 팀으로 나갈 수 있는 팀원 체크 (m+n-k)/3

이 모든 조건중 가장 min이 답!

참고링크

https://jaimemin.tistory.com/726

Read More

[백준] 30 (java) Greedy

2020-02-26

30 (백준> Greedy)

문제 링크

문제설명

어느 날, 미르코는 우연히 길거리에서 양수 N을 보았다. 미르코는 30이란 수를 존경하기 때문에, 그는 길거리에서 찾은 수에 포함된 숫자들을 섞어 30의 배수가 되는 가장 큰 수를 만들고 싶어한다.

미르코를 도와 그가 만들고 싶어하는 수를 계산하는 프로그램을 작성하라.

입력

N을 입력받는다. N는 최대 105개의 숫자로 구성되어 있으며, 0으로 시작하지 않는다.

출력

미르코가 만들고 싶어하는 수가 존재한다면 그 수를 출력하라. 그 수가 존재하지 않는다면, -1을 출력하라.

예제 입력 1 복사

30

예제 출력 1 복사

30

예제 입력 2 복사

102

예제 출력 2 복사

210


풀이

package Greedy;

import java.util.*;

//35
public class beak_30 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		String a = sc.nextLine();
		
		int arr[] = new int[10]; //9까지 담아야함
		int sum = 0;
		
		for(int i=0;i<a.length(); i++) {
			arr[a.charAt(i)-'0']++;
			sum = sum + a.charAt(i)-'0';
		}
		
		//30의 배수가 되는 조건
		//1) 각 자리수의 합이 3의 배수이다
		//2) 0의 개수가 1개 이상인 모든 조건을 만족할때만 true
		if(sum%3 !=0 || !a.contains("0")) {
			System.out.println(-1);
			return;
		}
		
		//string을 쓰는 것과 stringBuilder를 쓰는 것에 약 10배의 ms차이가 났다
		StringBuilder s = new StringBuilder();
		for(int i=9; i>=0; i--) {
			while(arr[i]>0) {
				s.append(i);
				arr[i]--;
			}
		}
		System.out.println(s.toString());
	}
	
}

후기 (35min)

30의 배수가 될 수 있는 조건을 먼저 파악한다

  1. 각 자리수의 합이 3의 배수이다
  2. 0의 개수가 1개 이상이다

1,2를 만족할 때, 큰 수부터 차례대로 string에 담아준다!


tip

  1. 자꾸 시간초과가 떴는데 시간초과를 10배이상 줄이는 방법은 StringBuilder를 사용하는 거였다!

참고링크

https://pangsblog.tistory.com/87

Read More

[백준] 쉬운 계단 수 (java) Dynamic_programming

2020-02-26

쉬운 계단 수 (백준> Dynamic_programming)

문제 링크

문제설명

45656이란 수를 보자.

이 수는 인접한 모든 자리수의 차이가 1이 난다. 이런 수를 계단 수라고 한다.

세준이는 수의 길이가 N인 계단 수가 몇 개 있는지 궁금해졌다.

N이 주어질 때, 길이가 N인 계단 수가 총 몇 개 있는지 구하는 프로그램을 작성하시오. (0으로 시작하는 수는 없다.)

입력

첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 100보다 작거나 같은 자연수이다.

출력

첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.

예제 입력 1 복사

1

예제 출력 1 복사

9


풀이

package Dynamic_programming;

import java.util.*;

//1h
public class beak_쉬운계단수 {
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int n = sc.nextInt();
		
		long dp[][] = new long[101][11];
		
		for(int i=1;i<=9;i++)
			dp[1][i] = 1; //자리수 1은 전부 값 ->1
		
		for(int i=2;i<=n;i++) {
			dp[i][0] = dp[i-1][1];
			
			for(int j=1; j<=9; j++) { //9까지 해야 10의 값도 구할 수 있음
				dp[i][j] = (dp[i-1][j-1] +dp[i-1][j+1]) % 1000000000;
			}
			
		}
		
		long ans = 0;
		
		for(int i=0; i<=9; i++)
			ans = ans + dp[n][i];
		
		System.out.println(ans%1000000000);
	}
}

후기 (1h)

대체 어떻게 하면 이렇게.. 천재처럼 풀 수 있는걸까! 복습 철저히 하자


tip

  1. 이차원 배열로 만들어야 했따

참고링크

https://zorba91.tistory.com/99

https://mygumi.tistory.com/260

Read More

[백준] 이친수 (java) Dynamic_programming

2020-02-26

이친수 (백준> Dynamic_programming)

문제 링크

문제설명

0과 1로만 이루어진 수를 이진수라 한다. 이러한 이진수 중 특별한 성질을 갖는 것들이 있는데, 이들을 이친수(pinary number)라 한다. 이친수는 다음의 성질을 만족한다.

  1. 이친수는 0으로 시작하지 않는다.
  2. 이친수에서는 1이 두 번 연속으로 나타나지 않는다. 즉, 11을 부분 문자열로 갖지 않는다.

예를 들면 1, 10, 100, 101, 1000, 1001 등이 이친수가 된다. 하지만 0010101이나 101101은 각각 1, 2번 규칙에 위배되므로 이친수가 아니다.

N(1 ≤ N ≤ 90)이 주어졌을 때, N자리 이친수의 개수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N이 주어진다.

출력

첫째 줄에 N자리 이친수의 개수를 출력한다.

예제 입력 1 복사

3

예제 출력 1 복사

2


풀이

package Dynamic_programming;

import java.util.*;

//16 min
public class beak_이친수 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int n = sc.nextInt();
		
		//값이 클 수 있으므로 int형이 아닌 long형으로 선언
		long dp[] = new long[91];
		
		dp[1] = 1;
		dp[2] = 1;
		
		for(int i=3;i<=90; i++) {
			dp[i] = dp[i-1] + dp[i-2];
		}
		
		System.out.println(dp[n]);
	}
}

후기 (16min)

생각보다 점화식이 쉽게 나오는 dp문제였다


tip

  1. 값이 클 수 있으므로 dp는 long으로 설정해야 성공한다
Read More