코딩테스트/문제풀이

[코드트리] 스승의 은혜3

알렉스 페레이라 2023. 5. 4. 13:53

진짜,,, 정말 쉬운문젠데,,,, 너무 어렵게 생각해서 못풀었던 문제라 반성하는 의미로 기록한다..

하나의 객체에서 두개의 변수를 각각 정렬하고, 각각의 객체를 더해서 살수있는 물건의 갯수 찾는 문젠데,, 

물건가격, 배송비 따로 정렬하려고 해서 특정 테스트케이스에서만 막혔다....... 정답은 물건가격이랑 배송비를 같이 더해서 오름차순 정렬하면 되는건데,, 막상 처음 틀리면 이생각이 절대 안난다... 흑흑

 


선생님이 N명의 학생에게 B만큼의 예산으로 선물을 주려고 합니다. 학생 i가 원하는 선물의 가격 P(i)와 배송비 S(i)가 있고, 선생님에게는 선물 하나를 정해서 반값으로 할인받을 수 있는 쿠폰이 있습니다. 선생님이 선물 가능한 학생의 최대 명수를 구하는 프로그램을 작성해보세요. 단, 선물의 가격은 항상 짝수입니다.

 

입력 형식

첫 번째 줄에 학생 수 N과 예산 B가 주어집니다.

두 번째 줄부터 각 줄마다 학생 N명이 원하는 선물의 가격 P(i)와 배송비 S(i)가 공백을 사이에 두고 주어집니다.

  • 1 ≤ N ≤ 1,000
  • 1 ≤ B ≤ 1,000
  • 0 ≤ P(i), S(i) ≤ 1,000

출력 형식

첫 번째 줄에 선생님이 선물 가능한 학생의 최대 명수를 출력합니다.

입출력 예제

예제1

입력:

5 24
4 2
2 0
8 1
6 3
12 5

출력:

4

 

예제 설명

선생님이 만약에 3번 학생의 선물에 쿠폰을 쓴다면 1번 학생부터 4번 학생까지 선물해줄 수 있습니다. (4+2)+(2+0)+(4+1)+(6+3) = 22. 만약에 1번 학생이나 4번 학생의 선물에 쿠폰을 썼어도 여전히 1번부터 4번 학생까지 선물해 줄 수 있습니다.

 


내 코드

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt(); //학생 수
        int b = sc.nextInt(); //예산
        int[] p = new int[n]; //선물가격 배열
        int[] s = new int[n]; //배송가격 배열

        //배열에 입력
        for(int i = 0; i < n; i++){
            p[i] = sc.nextInt();
            s[i] = sc.nextInt();
        }

        int max = Integer.MIN_VALUE;

        //하나씩 선물값을 반값을 해본다.
        for(int i = 0; i < n; i++){
            int[] temp = new int[n];
            for(int j = 0; j < n; j++){
                int price = (i==j) ? p[j] / 2 : p[j];
                int del = s[j];
                temp[j] = price + del; //물건값과 배송비를 더해서 정렬하면 된다.......... 이걸 생각못했음
            }

            Arrays.sort(temp);

            int count = 0;
            int sum = 0;
            for(int j = 0; j < n; j++){
                if(sum + temp[j] > b){
                    break;
                }else{
                    sum += temp[j];
                    count++;
                }
            }  
            max = Math.max(max, count);
        }
        System.out.print(max);
    }
}

 

문제를 틀렸다고 내 로직이 틀렸을까 생각하기보다는 접근방법이 틀렸는지부터 다시 접근하는 습관을 가져야 하겠다...