문제 : boj26059
필요 알고리즘 개념
- 구현, 파싱, 문자열
- 일단 문제가 이해가 됬다면 문자열 파싱을 통해 제시된 대로 구현해주면 된다.
- 눈치 및 번역(?)
- 번역기만 돌려선 좀 이해하기 힘든 문제이다. 눈치(?)가 좀 있어야 한다.
※ 제 코드에서 왜 main 함수에 로직을 직접 작성하지 않았는지, 왜 Scanner를 쓰지 않고 BufferedReader를 사용했는지 등에 대해서는 '자바로 백준 풀 때의 팁 및 주의점' 글을 참고해주세요. 백준을 자바로 풀어보려고 시작하시는 분이나, 백준에서 자바로 풀 때의 팁을 원하시는 분들도 보시는걸 추천드립니다.
풀이
자세한 번역을 쓰고싶진 않으니(나도 모르겠음), 그냥 결론적으로 어떻게 푸는지만 이해되도록 작성하겠다.
입력은 이하와 같이 들어온다고 하자. N은 이하 몇개의 칩 정보가 들어오는지, TR은 가진 루블, TC는 가진 코펙이다(루블과 코펙은 러시아 화폐단위임). chipNameN은 칩의 이름이다. Rn과 Cn은 칩의 가격을 루블과 코펙으로 주어진 것이다.
N TR,TC
chipName1 R1,C1
chipName2 R2,C2
...
chipNameN Rn,Cn
그리고 대충 번역 때려보면 거스름돈이 생기지 않게한다. 뭐 그런 말이 있는데, 그게 뭐냐면 각 칩에 대해 TR>=Rn && TC>=Cn 이라는 의미이다. 즉, 각 칩을 입력받았는데 저걸 만족하지 않으면 그 칩은 그냥 패스한다(조건1). 그렇게 패스된 애들 중에 가장 가치가 높은 칩의 이름을 출력(조건2)해주면 되는데, 이 가치는 또 다른 방식으로 해야된다. 여기서 필요한 정보는 100코펙 = 1루블이라는 점이다.
그럼 정리하면, (조건1)을 만족하는 칩 중에서 (조건2)를 만족하는 칩의 이름을 출력해주고, 모든 칩이 (조건1)을 만족하지 못하면 '-1'을 출력해주면 된다.
코드 : github
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
class Money implements Comparable<Money> {
int rubles, kopecks;
public Money(final String rublesAndKopecks) {
final StringTokenizer tmp = new StringTokenizer(rublesAndKopecks, ",");
this.rubles = Integer.parseInt(tmp.nextToken());
this.kopecks = Integer.parseInt(tmp.nextToken());
}
@Override
public int compareTo(Money o) {
return this.rubles*100+this.kopecks - (o.rubles*100+o.kopecks);
}
public boolean withoutRemainCheck(Money chip) {
return this.rubles>=chip.rubles && this.kopecks>=chip.kopecks;
}
}
public class Main {
private void solution() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
Money total = new Money(st.nextToken());
Money max = new Money("-1,0");
String answer = "-1";
while (n-->0) {
st = new StringTokenizer(br.readLine());
String chipName = st.nextToken();
Money cur = new Money(st.nextToken());
if (total.withoutRemainCheck(cur) && max.compareTo(cur)<0) {
answer = chipName;
max = cur;
}
}
System.out.println(answer);
}
public static void main(String[] args) throws Exception {
new Main().solution();
}
}
'PS > BOJ' 카테고리의 다른 글
[자바] 백준 12781 - PIZZA ALVOLOC (java) (0) | 2022.11.26 |
---|---|
[C++] 백준 15687 - 직사각형 (cpp) (0) | 2022.11.26 |
[자바] 백준 5691 - 평균 중앙값 문제 (java) (0) | 2022.11.25 |
[자바] 백준 25600 - Triathlon (java) (0) | 2022.11.25 |
[자바] 백준 26040 - 특정 대문자를 소문자로 바꾸기 (java) (0) | 2022.11.25 |
댓글