BookStore 문제 질문드립니다.

  • CodeMach
    CodeMach

    웬만한 테스트 케이스 모두 정상적으로 출력되는데 오답으로 나오는군요 ㅠㅠ

    구현 알고리즘은 다음과 같습니다.

    1. 구매한 책의 값과 적립금을 받아온다.

    2. 현재 이미 적립되어 있는 적립금이 있는지 확인하고, 없을 경우 현재 가격(nowPrice)에 받아온 책의 값(pivBookPrice)을 더해준다.

    3. 이미 적립된 적립금이 있을 경우, 책의 값이 적립금보다 큰지 작은지 확인해준다.
      책의 값이 기존 적립금보다 클 경우 책의 값에서 적립금을 뺀 금액을 현재 가격에 더해주고 기존 적립금을 0원으로 만든다.
      책의 값이 적립금보다 작을 경우 기존 적립금에서 현재 책의 가격만큼 빼준다.

    4. 마지막으로 구매한 책의 적립금을 내 현재 적립금에 더해준다.

    뭐가 문제인지 도와주시면 감사하겠습니다 ㅠㅠ

    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.LinkedList;
    import java.util.Scanner;

    class Book implements Comparable{
    private int bookPrice, bookPoint;

    public Book(int price, int point) {
        this.bookPrice = price;
        this.bookPoint = point;
    }
    
    public void setBookInfo(int bookPrice, int bookPoint) {
        this.bookPrice = bookPrice;
        this.bookPoint = bookPoint;
    }
    
    public int getBookPrice() {
        return bookPrice;
    }
    
    public int getBookPoint() {
        return bookPoint;
    }
    
    public void printBookInfo() {
        System.out.println(bookPrice + " " + bookPoint);
    }
    
    @Override
    public int compareTo(Book o) {
        int comparePoint = o.getBookPoint();
    
        return comparePoint - this.bookPoint;
    }

    }

    public class Main {
    private static Scanner sc;
    private LinkedList bookList = new LinkedList();

    public static void main(String[] args) {
        ArrayList<LinkedList<Main>> caseList;
        LinkedList<Main> storeList;
        int caseNum, bookNum, storeNum;
        int nowPoint, nowPrice;
        int resultPrice = 0;
    
        sc = new Scanner(System.in);
        caseNum = sc.nextInt();
        caseList = new ArrayList<LinkedList<Main>>();
    
        for (int i = 0; i < caseNum; i++) {
            bookNum = sc.nextInt();
            storeNum = sc.nextInt();
            storeList = new LinkedList<Main>();
            caseList.add(storeList);
    
            for (int j = 0; j < storeNum; j++) {
                storeList.add(new Main());
            }
    
            for (int m = 0; m < bookNum; m++) {
                for (int k = 0; k < storeNum; k++) {
                    storeList.get(k).bookList.add(new Book(sc.nextInt(), sc.nextInt()));
                }
            }
    
            for (int l = 0; l < storeNum; l++) {
                Collections.sort(storeList.get(l).bookList);
                nowPrice = 0;
                nowPoint = 0;
                for (int o = 0; o < bookNum; o++) {
                    Book pivBook = storeList.get(l).bookList.get(o);
                    int pivBookPrice = pivBook.getBookPrice();
    
                    if (nowPoint > 0) {
                        if (pivBookPrice <= nowPoint) {
                            nowPoint -= pivBookPrice;
                        } else {
                            nowPrice += (pivBookPrice - nowPoint);
                            nowPoint = 0;
                        }
                    } else {
                        nowPrice += pivBookPrice;
                    }
    
                    nowPoint += pivBook.getBookPoint();
                }
    
                if (resultPrice == 0 || resultPrice > nowPrice) {
                    resultPrice = nowPrice;
                }
            }
            System.out.println(resultPrice);
        }
    }

    }


    9년 전
1개의 댓글이 있습니다.
  • amok
    amok

    적립금이 큰 책부터 먼저 사야 합니다. compareTo()를 본문과 같이 작성하시면 적립금이 가장 큰 책이 정렬된 리스트의 맨 뒤에 오게 됩니다.


    9년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.