1. N 이 작은 문제

2. O(N) 까지 할 수 있을것 같지만 귀찮다.

3. memoization 배열에는 i 일에 최대 받을 수 있는 금액 저장

4. 오늘 받을 수 있는 금액 + memoization[j] 중 최대 큰 값

5. 4 번을 쭉 돌리면 된다.

import java.util.*;
import java.io.*;
/**
* https://www.acmicpc.net/problem/14501
* BOJ 백준온라인져지 14501 퇴사 풀이
*/
public class Main {
private static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
private static int memoization[] = new int[16];
private static int arr[][];
private static int N;
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
arr = new int[N][2];
for (int i = 0; i < N; i++) {
String str2[] = br.readLine().split(" ");
arr[i][0] = Integer.parseInt(str2[0]);
arr[i][1] = Integer.parseInt(str2[1]);
}
int result = 0;
for (int i = 0; i < N; i++) {
if (arr[i][0] + i <= N) memoization[i] = arr[i][1];
int temp = 0;
for (int j = 0; j < i; j++) {
if (arr[j][0] + j <= i) temp = Math.max(memoization[j], temp);
}
result = Math.max(memoization[i] += temp, result);
}
bw.write(String.valueOf(result));
bw.flush();
}
}
view raw Main.java hosted with ❤ by GitHub
시간 제한메모리 제한제출정답맞은 사람정답 비율
2 초512 MB84393751248643.393%

문제

상담원으로 일하고 있는 백준이는 퇴사를 하려고 한다.

오늘부터 N+1일째 되는날 퇴사를 하기 위해서, 남은 N일 동안 최대한 많은 상담을 하려고 한다.

백준이는 비서에게 최대한 많은 상담을 잡으라고 부탁을 했고, 비서는 하루에 하나씩 서로 다른 사람의 상담을 잡아놓았다.

각각의 상담은 상담을 완료하는데 걸리는 기간 Ti와 상담을 했을 때 받을 수 있는 금액 Pi로 이루어져 있다.

N = 7인 경우에 다음과 같은 상담 일정표를 보자.

 1일2일3일4일5일6일7일
Ti3511242
Pi102010201540200

1일에 잡혀있는 상담은 총 3일이 걸리며, 상담했을 때 받을 수 있는 금액은 10이다. 5일에 잡혀있는 상담은 총 2일이 걸리며, 받을 수 있는 금액은 15이다.

상담을 하는데 필요한 기간은 1일보다 클 수 있기 때문에, 모든 상담을 할 수는 없다. 예를 들어서 1일에 상담을 하게 되면, 2일, 3일에 있는 상담은 할 수 없게 된다. 2일에 있는 상담을 하게 되면, 3, 4, 5, 6일에 잡혀있는 상담은 할 수 없다.

또한, N+1일 째에는 회사에 없기 때문에, 6, 7일에 있는 상담을 할 수 없다.

퇴사 전에 할 수 있는 상담의 최대 이익은 1일, 4일, 5일에 있는 상담을 하는 것이며, 이 때의 이익은 10+20+15=45이다.

상담을 적절히 했을 때, 백준이가 얻을 수 있는 최대 수익을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N (1 ≤ N ≤ 15)이 주어진다.

둘째 줄부터 N개의 줄에 Ti와 Pi가 공백으로 구분되어서 주어지며, 1일부터 N일까지 순서대로 주어진다. (1 ≤ Ti ≤ 5, 1 ≤ Pi ≤ 1,000)

출력

첫째 줄에 백준이가 얻을 수 있는 최대 이익을 출력한다.

예제 입력 1 

7
3 10
5 20
1 10
1 20
2 15
4 40
2 200

예제 출력 1 

45

예제 입력 2 

10
1 1
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10

예제 출력 2 

55

예제 입력 3 

10
5 10
5 9
5 8
5 7
5 6
5 10
5 9
5 8
5 7
5 6

예제 출력 3 

20

예제 입력 4 

10
5 50
4 40
3 30
2 20
1 10
1 10
2 20
3 30
4 40
5 50

예제 출력 4 

90

힌트

출처


1.  O(2^N) - 1

2. 공집합은 카운트를 하면 안된다. (S == 0)

import java.util.*;
import java.io.*;
/**
* https://www.acmicpc.net/problem/1182
* BOJ 백준온라인져지 1182 부분집합의 합 풀이
*/
public class Main {
private static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
private static int arr[];
private static int N, S, result = 0;
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str1[] = br.readLine().split(" ");
N = Integer.parseInt(str1[0]);
S = Integer.parseInt(str1[1]);
String str2[] = br.readLine().split(" ");
arr = new int[N];
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(str2[i]);
}
bruteforce(0, 0, 0);
bw.write(String.valueOf(result));
bw.flush();
}
private static void bruteforce (int sum, int i, int check) {
if (i == N) {
if (sum == S && check > 0) result++;
return;
}
bruteforce(sum + arr[i], i + 1, check + 1);
bruteforce(sum, i + 1, check);
}
}
view raw Main.java hosted with ❤ by GitHub

문제

N개의 정수로 이루어진 집합이 있을 때, 이 집합의 공집합이 아닌 부분집합 중에서 그 집합의 원소를 다 더한 값이 S가 되는 경우의 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1≤N≤20, |S|≤1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절대값은 100,000을 넘지 않는다. 같은 수가 여러번 주어질 수도 있다.

출력

첫째 줄에 합이 S가 되는 부분집합의 개수를 출력한다.

예제 입력 1 

5 0
-7 -3 -2 5 8

예제 출력 1 

1

힌트


1. 이분 탐색

2. 내 코드에서는 tempC 같은 역할을 해주는 변수가 없으면 풀지 못한다.

3. 다른 풀이들은 확인해보지 않음.

4. tempC 는 파 하나로 여러 개의 닭에 나눠넣는 것을 확인하는 변수

import java.util.*;
import java.io.*;
/**
* https://www.acmicpc.net/problem/14627
* BOJ 백준온라인져지 14627 파닭파닭 풀이
*/
public class Main {
private static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str1[] = br.readLine().split(" ");
int S = Integer.parseInt(str1[0]);
int C = Integer.parseInt(str1[1]);
int arr[] = new int[S];
for (int i = 0; i < S; i++) {
arr[i] = Integer.parseInt(br.readLine());
}
Arrays.sort(arr);
int l = 1;
int r = arr[S - 1];
long result = 0;
while (l <= r) {
int mid = (l + r) / 2;
long tempSum = 0;
int tempC = C;
for (int i = 0; i < S; i++) {
tempC -= arr[i] / mid;
tempSum += arr[i] % mid;
}
if (tempC <= 0) {
l = mid + 1;
result = tempSum + (-tempC) * mid;
} else r = mid - 1;
}
bw.write(String.valueOf(result));
bw.flush();
}
}
view raw Main.java hosted with ❤ by GitHub

문제

평소 요리에 관심이 많은 승균이는 치킨집을 개업하였다. 승균이네 치킨집은 파닭이 주메뉴다. 승균이는 가게를 오픈하기 전에 남부시장에 들러서 길이가 일정하지 않은 파를 여러 개 구매하였다. 승균이는 파닭의 일정한 맛을 유지하기 위해 각각의 파닭에 같은 양의 파를 넣는다. 또 파닭 맛은 파의 양에 따라 좌우된다고 생각하기 때문에 될 수 있는 한 파의 양을 최대한 많이 넣으려고 한다. (하지만 하나의 파닭에는 하나 이상의 파가 들어가면 안 된다.) 힘든 하루를 마치고 승균이는 파닭을 만들고 남은 파를 라면에 넣어 먹으려고 한다. 이때 라면에 넣을 파의 양을 구하는 프로그램을 작성하시오. 승균이네 치킨집 자는 정수만 표현되기 때문에 정수의 크기로만 자를 수 있다.

입력

첫째 줄에 승균이가 시장에서 사 온 파의 개수 S(1≤S≤1,000,000), 그리고 주문받은 파닭의 수 C(1≤C≤1,000,000)가 입력된다. 파의 개수는 항상 파닭의 수를 넘지 않는다. (S≤C) 그 후, S 줄에 걸쳐 파의 길이 L(1≤L≤1,000,000,000)이 정수로 입력된다.

출력

승균이가 라면에 넣을 파의 양을 출력한다.

예제 입력 1 

3 5
440
350
230

예제 출력 1 

145

힌트

파닭 하나당 넣을 수 있는 최대 파의 길이는 175cm으로, 440cm 파에서 2개, 350cm 파에서 2개, 230cm 파에서 1개, 총 5개의 파닭을 만들 수 있고, 각각의 파에서 90cm + 0cm + 55cm = 145cm의 파가 남는다.


1. 1 ~ 제일 큰 랜선의 길이 까지 다 시도해보면 됨

2. 오버플로우 조심하자.

import java.util.*;
import java.io.*;
/**
* https://www.acmicpc.net/problem/1654
* BOJ 백준온라인져지 1654 랜선 자르기 풀이
*/
public class Main {
private static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str1[] = br.readLine().split(" ");
int K = Integer.parseInt(str1[0]);
int N = Integer.parseInt(str1[1]);
int lanArray[] = new int[K];
for (int i = 0; i < K; i++) {
lanArray[i] = Integer.parseInt(br.readLine());
}
Arrays.sort(lanArray);
long l = 1;
long r = lanArray[K - 1];
while (l <= r) {
long mid = (l + r) / 2;
long remain = 0;
for (int i = 0; i < K; i++) {
remain += lanArray[i] / mid;
}
if (remain >= N) l = mid + 1;
else r = mid - 1;
}
bw.write(String.valueOf(r));
bw.flush();
}
}
view raw Main.java hosted with ❤ by GitHub

문제

집에서 시간을 보내던 오영식은 박성원의 부름을 받고 급히 달려왔다. 박성원이 캠프 때 쓸 N개의 랜선을 만들어야 하는데 너무 바빠서 영식이에게 도움을 청했다.

이미 오영식은 자체적으로 K개의 랜선을 가지고 있다. 그러나 K개의 랜선은 길이가 제각각이다. 박성원은 랜선을 모두 N개의 같은 길이의 랜선으로 만들고 싶었기 때문에 K개의 랜선을 잘라서 만들어야 한다. 예를 들어 300cm 짜리 랜선에서 140cm 짜리 랜선을 두 개 잘라내면 20cm 은 버려야 한다.(이미 자른 랜선은 붙일 수 없다.)

편의를 위해 랜선을 자르거나 만들 때 손실되는 길이는 없다고 가정하며, 기존의 K개의 랜선으로 N개의 랜선을 만들 수 없는 경우는 없다고 가정하자. 그리고 자를 때는 항상 센티미터 단위로 정수길이만큼 자른다고 가정하자. 이 때 만들 수 있는 최대 랜선의 길이를 구하는 프로그램을 작성하시오.

입력

첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수이다. 그리고 항상 K ≦ N 이다. 그 후 K줄에 걸쳐 이미 가지고 있는 각 랜선의 길이가 센티미터 단위의 정수로 입력된다. 랜선의 길이는 231-1보다 작거나 같은 자연수이다.

출력

첫째 줄에 N개를 만들 수 있는 랜선의 최대 길이를 센티미터 단위의 정수로 출력한다.

예제 입력 1 

4 11
802
743
457
539

예제 출력 1 

200

힌트

802cm 랜선에서 4개, 743cm 랜선에서 3개, 457cm 랜선에서 2개, 539cm 랜선에서 2개를 잘라내 모두 11개를 만들 수 있다.


1. 일반 배열 또는 리스트를 사용하면 시간초과

2. HashMap 또는 Set 을 사용해야된다.

3. HashMap 은 사용안해봤다. (이 문제에서)

import java.util.*;
import java.io.*;
/**
* https://www.acmicpc.net/problem/7785
* BOJ 백준온라인져지 7785 회사에 있는 사람 풀이
*/
public class Main {
private static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
Set<String> nameSet = new HashSet<>();
for (int i = 0; i < N; i++) {
String str1[] = br.readLine().split(" ");
String name = str1[0];
boolean isLeave = str1[1].equals("leave");
if (!isLeave) nameSet.add(name);
else nameSet.remove(name);
}
String nameArray[] = nameSet.toArray(new String[nameSet.size()]);
Arrays.sort(nameArray);
for (int i = nameArray.length - 1; i >= 0; i--) {
bw.write(nameArray[i] + "\n");
}
bw.flush();
}
}
view raw Main.java hosted with ❤ by GitHub

문제

상근이는 세계적인 소프트웨어 회사 기글에서 일한다. 이 회사의 가장 큰 특징은 자유로운 출퇴근 시간이다. 따라서, 직원들은 반드시 9시부터 6시까지 회사에 있지 않아도 된다.

각 직원은 자기가 원할 때 출근할 수 있고, 아무때나 퇴근할 수 있다.

상근이는 모든 사람의 출입카드 시스템의 로그를 가지고 있다. 이 로그는 어떤 사람이 회사에 들어왔는지, 나갔는지가 기록되어져 있다. 로그가 주어졌을 때, 현재 회사에 있는 모든 사람을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 로그에 기록된 출입 기록의 수 n이 주어진다. (2 ≤ n ≤ 106) 다음 n개의 줄에는 출입 기록이 순서대로 주어지며, 각 사람의 이름이 주어지고 "enter"나 "leave"가 주어진다. "enter"인 경우는 출근, "leave"인 경우는 퇴근이다.

회사에는 동명이인이 없으며, 대소문자가 다른 경우에는 다른 이름이다.

출력

현재 회사에 있는 사람의 이름을 사전 순의 역순으로 한 줄에 한 명씩 출력한다.

예제 입력 1 

4
Baha enter
Askar enter
Baha leave
Artem enter

예제 출력 1 

Askar
Artem

힌트


1. 하나씩 다 해보면 됨

2. 큰순으로 출력

3. (W - 2) * (H - 2)  = 갈색 블록

4. W * 2 + (H - 2) = 레드 블록

import java.util.*;
import java.io.*;
/**
* https://www.acmicpc.net/problem/2858
* BOJ 백준온라인져지 2858 기숙사 바닥 풀이
*/
public class Main {
private static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str1[] = br.readLine().split(" ");
int R = Integer.parseInt(str1[0]);
int B = Integer.parseInt(str1[1]);
int sum = R + B;
for (int i = 1; i < R; i++) {
for (int j = 1; j < R; j++) {
if (i * 2 + (j - 2) * 2 == R && (i - 2) * (j - 2) == B) {
System.out.println(j + " " + i);
return;
}
}
}
bw.flush();
}
}
view raw Main.java hosted with ❤ by GitHub

문제

상근이는 기숙사 생활을 한다. 상근이의 방의 크기는 L*W 이다.

수업시간에 타일 채우기 경우의 수를 계산하던 상근이는 자신의 방도 1*1크기 타일로 채우려고 한다. 이 때, 가장자리는 빨간색으로, 나머지는 갈색으로 채우려고 한다.

아래 그림은 상근이의 방의 크기가 4*3일 때 이다.

어느날 상근이네 방에 하근이가 놀러왔다. 하근이는 아름다운 타일 배치에 감동받았다. 다시 방으로 돌아온 하근이는 빨간색과 갈색 타일의 개수는 기억했지만, 방의 크기는 기억해내지 못했다.

빨간색과 갈색 타일의 개수가 주어졌을 때, 상근이 방의 크기를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 빨간색 블럭의 수 R과 갈색 블럭의 B가 주어진다. (8 ≤ R ≤ 5000, 1 ≤ B ≤ 2,000,000)

출력

첫째 줄에 상근이네 방의 크기 L과 W을 공백으로 구분하여 출력한다. 만약, 두 수가 다르다면, 큰 수가 L이 되고 작은 수가 W이 된다. 항상 정답이 유일한 경우만 입력으로 주어진다.

예제 입력 1 

10 2

예제 출력 1 

4 3

힌트


1. 1개에서

2. 1 + 5개

3. 1 + 5 + 13

4. 각 사이가 (h - 1) * 4 만큼 차이난다.

5. 끝

import java.util.*;
import java.io.*;
/**
* https://www.acmicpc.net/problem/9827
* BOJ 백준온라인져지 9827 아즈텍 피라미드 풀이
*/
public class Main {
private static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int n = 1;
int h = 1;
int sum = 1;
while (sum <= N) {
n += h * 4;
h++;
sum += n;
}
bw.write(String.valueOf(h - 1));
bw.flush();
}
}
view raw Main.java hosted with ❤ by GitHub

문제

아즈텍의 황제 쿠이틀라우악은 자신의 명예를 위해 피라미드를 만드려고 한다.

아즈텍 피라미드는 돌 블럭을 이용해서 만든다. 블럭은 1×1×1 크기의 정육면체이다. 쿠이틀라우악은 피라미드의 설립식 때, 블럭 하나를 직접 땅에 놓았다. 그 다음 블럭부터는 인부들이 설치하며, 이전에 놓여진 블럭과 적어도 한 면 전체를 공유해야 한다.

왼쪽 두 개는 가능한 블럭의 배치, 오른쪽 세 개는 불가능한 배치이다.

블럭은 땅의 바로 위에 있거나, 블럭의 아래에 있는 블럭의 모든 면이 땅이나 다른 블럭과 접할 때, 안정적이라고 한다. 피라미드의 모든 블럭은 안정적이어야 한다.

아래 그림은 회색 블럭을 놓았을 때이며, 그 블럭이 안정적인 경우는 왼쪽 세 개, 아닌 경우는 오른쪽 두 개이다.

사용할 수 있는 블럭의 개수가 주어졌을 때, 그 블럭으로 만들 수 있는 가장 높은 안정적인 피라미드의 높이를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 사용할 수 있는 블럭의 수 n이 주어진다. (1 ≤ n ≤ 109)

출력

첫째 줄에 블럭 n개로 만들 수 있는 가장 높은 안정적인 피라미드의 높이를 출력한다.

예제 입력 1 

6

예제 출력 1 

2

힌트


1. 1 ~ N 까지에서 가장 Ki가 높은것들을 차례대로 될때까지 뺀다.

import java.util.*;
import java.io.*;
/**
* https://www.acmicpc.net/problem/15708
* BOJ 백준온라인져지 15708 미네크래프트 풀이
*/
public class Main {
private static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str1[] = br.readLine().split(" ");
int N = Integer.parseInt(str1[0]);
long T = Long.parseLong(str1[1]);
long P = Long.parseLong(str1[2]);
String str2[] = br.readLine().split(" ");
int sum = 0;
PriorityQueue<Integer> pq = new PriorityQueue<>();
int max = 0;
for (int i = 0; i < N; i++) {
int K = Integer.parseInt(str2[i]);
sum += K;
pq.offer(-K);
while (sum > T - i * P) {
if (pq.size() == 0) break;
sum += pq.poll();
}
max = Math.max(max, pq.size());
}
bw.write(String.valueOf(max));
bw.flush();
}
}
view raw Main.java hosted with ❤ by GitHub

문제

미네크래프트에 있는 디디는 집을 짓기 위해 돌을 채취하려고 한다. N개의 바위들이 일렬로 놓여져 있고, 디디는 현재 첫번째 바위에 위치해 있다. 각 바위 i는 서로 같거나 다른 강도를 가지고 있어서, 바위에서 돌을 채취하기 위해 해야 하는 곡괭이질의 수 Ki 또한 서로 같거나 다르다. 디디는 돌을 채취하기 위해 다음과 같은 행동을 할 수 있다.

  1. 시간 1을 소비하여, 디디 앞에 있는 바위에 곡괭이질을 1번 한다.
  2. 시간 P를 소비하여, 이웃한 바위로 이동한다.


디디에게 T만큼의 시간이 주어졌을 때, 채취할 수 있는 돌의 최대 개수를 출력하는 프로그램을 작성하라.

입력

첫째 줄에 정수 N(1 ≤ N ≤ 105), T(1 ≤ T ≤ 109), P(1 ≤ P ≤ 105)가 공백으로 구분되어 주어진다.

둘째 줄에 바위 i(i = 1, 2, ..., N)를 채취하기 위해 필요한 곡괭이질의 수 Ki(1 ≤ Ki ≤ 105)가 공백으로 구분되어 주어진다.

출력

문제의 정답을 출력하라.

예제 입력 1 

6 17 1
3 5 2 6 9 1

예제 출력 1 

4

힌트


1. 랭작!

import java.util.*;
import java.io.*;
/**
* https://www.acmicpc.net/problem/15680
* BOJ 백준온라인져지 15680 연세대학교 풀이
*/
public class Main {
private static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
bw.write(N == 0 ? "YONSEI" : "Leading the Way to the Future");
bw.flush();
}
}
view raw Main.java hosted with ❤ by GitHub

문제

연세대학교의 영문명은 YONSEI, 슬로건은 Leading the Way to the Future이다.

이를 출력하는 프로그램을 작성해보도록 하자.

입력

첫째 줄에 N이 주어진다. (N = 0 또는 1)

출력

  • N = 0일 경우: 연세대학교의 영문명을 출력한다.
  • N = 1일 경우: 연세대학교의 슬로건을 출력한다.

대소문자 구별에 주의하도록 하자.

예제 입력 1 

0

예제 출력 1 

YONSEI

힌트


1. 0의 개수는 즉 10^C 랑 같다.

2. 반올림은 0~(10^C)/2 이면 내림, 아니면 올림해서 계산하면 된다.

import java.util.*;
import java.io.*;
/**
* https://www.acmicpc.net/problem/2909
* BOJ 백준온라인져지 2909 캔디 구매 풀이
*/
public class Main {
private static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str1[] = br.readLine().split(" ");
int C = Integer.parseInt(str1[0]);
int K = Integer.parseInt(str1[1]);
int money = (int) Math.pow(10, K);
int result = C / money * money;
if (C % money >= money / 2) result += money;
bw.write(String.valueOf(result));
bw.flush();
}
}
view raw Main.java hosted with ❤ by GitHub

문제

오늘은 화이트데이이다. 상근이는 여자친구를 위해서 사탕을 사려고 한다. 하지만, 상근이는 독특한 성격을 가지고 있어서, 특정 액면가의 지폐만 가지고 있는다. 또, 거스름든은 받지 않는다. 따라서, 사탕 가게의 사장과 상근이는 다음과 같은 합의를 했다. 상근이는 사장에게 자신이 가지고 있는 지폐의 액면가를 말해준다. 그럼 사장은 상근이가 지불할 수 있는 가장 가까운 금액으로 사탕의 가격을 반올림해준다.

예를 들어, 상근이가 가지고 있는 지폐의 액면가가 100원이라고 하자. 만약 상근이가 고른 사탕의 가격이 150원이라면, 사장은 가격을 200원으로 반올림해서 상근이가 낼 수 있도록 해준다. 또, 가격이 149원이라면, 사장은 가격을 100원으로 반올림해서 상근이가 지불할 수 있도록 해준다.

상근이가 가지고 있는 지폐의 액면가는 항상 1, 10, 100, 1000, ..., 1,000,000,000 중 하나이다. 또, 지폐를 무한개 가지고 있다.

사탕 가격과 상근이가 가지고 있는 지폐의 액면가가 주어졌을 때, 사장은 가격을 얼마로 바꿔줄 것인지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 사탕의 가격 C와 상근이가 가지고 있는 지폐의 액면가에 적혀있는 0의 개수 K가 주어진다. (0 ≤ C ≤ 1,000,000,000, 0 ≤ K ≤ 9)

출력

첫째 줄에 상근이가 내야하는 가격을 출력한다.

예제 입력 1 

184 1

예제 출력 1 

180

힌트


+ Recent posts