본문 바로가기
PS/BOJ

[자바] 백준 26059 - Вендомат (java)

by Nahwasa 2022. 11. 26.

 문제 : 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();
    }
}

댓글