상세 컨텐츠

본문 제목

9229. 한빈이와 Spot Mart D3

알고리즘/SWExpertAcademy

by 아리따운노을 2020. 1. 3. 19:39

본문

두 번째 글이다 ㅎㅎ;;

알고리즘 문제를 오랜만에 푸려니 머리가 잘 안돌아가기도 하고...

STL은 기본적인거 말고 죄다 까먹어 버렸다...

 

 

일단

두 번째 문제다

 

한빈이는 퇴근길에 스팟마트에 들러 과자 두 봉지를 사서 양 손에 하나씩 들고 가려고 한다.

스팟마트에는 N개의 과자 봉지가 있으며, 각 과자 봉지는 ai그램의 무게를 가진다.

배가 많이 고픈 한빈이는 최대한 양이 많은 (무게가 많이 나가는) 과자 봉지를 고르고 싶으나,

과자 두 봉지의 무게가 M 그램을 초과하면 무거워서 과자를 들고 다닐 수 없다.

한빈이가 들고 다닐수 있는 과자들의 최대 무게 합을 출력하라. 한빈이는 과자를 “정확히” 두 봉지 사야 함에 유의하라.

 

 

[입력]

첫 번째 줄에 테스트 케이스의 수 TC 가 주어진다.

이후 TC 개의 테스트 케이스가 새 줄로 구분되어 주어진다. 각 테스트 케이스는 다음과 같이 구성되었다.

첫 번째 줄에 과자 봉지의 개수와 무게 합 제한을 나타내는 자연수 N, M이 주어진다.
(2 ≤ N ≤ 1000 , 2 ≤ M ≤ 2000000)

이후 N개의 줄에 각 과자봉지의 무게 가 주어진다. (1 ≤ ai ≤ 1000000)

 

[출력]

테스트 케이스마다 ‘#x’(x는 테스트 케이스 번호를 의미, 1부터 시작)를 출력하고,

한빈이가 들고 갈 수 있는 과자 봉지의 무게 합 최대를 출력하라.

 

만약 한빈이가 두 과자를 들고 갈 방법이 없는 경우에는 -1을출력한다.

 

문제 해결 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
#include <algorithm>
using namespace std;
int solve(int *ARR, int MAX,int SIZE)
{
    int ret=0,temp;
    for(int i = 0;i < SIZE; i++)
    {
        for (int j = SIZE-1;j>i;j--)
        {
            if(ARR[i]+ARR[j]<=MAX){
                temp=ARR[i]+ARR[j];
                if(temp>ret)
                    ret=temp;
                if(ret==MAX){
                    return ret;
                }
            }
        }
    }
    if(ret==0)
        return -1;
    else
        return ret;
 
}
int main()
{
    cin.tie(NULL);
    cout.tie(NULL);
    ios_base::sync_with_stdio(false);
    int TC,N,M;
    cin>>TC;
    for (int t=1;t<=TC;t++)
    {
        cin>>N>>M;
        int *ARR = new int[N];
        for(int i=0;i<N;i++)
            cin>>ARR[i];
        sort(ARR, ARR+N);
        cout<<"#"<<t<<' '<<solve(ARR,M,N)<<'\n';
    }
    return 0;
}
 
cs

기본적인 생각은 인풋을 받아 오름차순으로 정렬한 다음 2중 for문을 돌려서 

배열의 앞과 뒤에서부터 더하면 덧셈하는 양을 최대한 줄일 수 있을 것 같았다.

그래서 main문에서는 입력과 sort만 진행을 하고

따로 solve 함수를 빼서 문제를 풀었다. 이렇게 풀면 중간에 MAX값에 도달 할 때, 쉽게 연산을 그만 둘 수 있어서 시간이 줄어들것이라 생각했다.

 

2중 for문안의 내용은 이렇다.

1. i는 앞에서 부터 시작

2. j는 뒤에서 부터 i+1까지 

3. ARR[i]+ARR[j] < MAX 를 만족하면 이전 ret의 크기와 비교해 ret를 갱신

4. 만약 ret==MAX 라면 바로 return

 

for문 안에서 함수가 끝나지 않을 것을 대비해 solve 함수 마지막에 -1과 ret를 return 함

 

멍청하게 2중 for문안에 j>i를 해야하는데 j>0을 하는 바람에 계속 Fail 했다.. ㅋㅇㅋ

실수를 더 줄이자...! 

 

 

 

 

 

 

 

 

'알고리즘 > SWExpertAcademy' 카테고리의 다른 글

8934. 팰린드롬 공포증 D4  (0) 2020.01.08
8840. 아바바바 D3  (0) 2020.01.07
9088. 다이아몬드 D4  (0) 2020.01.05
8993. 하지 추측 D4  (0) 2020.01.04
8931. 제로 D3  (0) 2019.12.20

관련글 더보기

댓글 영역