SWEA

SWEA 19113. 식료품 가게 D3 C++

2024. 5. 12. 18:15

 

 

 

 

 

처음 작성한 코드는 다음과 같다.

100개의 테스트 케이스 중 24개만 맞았다는 결과가 나왔다.

#include<iostream>
using namespace std;

int main(int argc, char** argv){
    // t 입력받기 
    int t;
    cin >> t;
    
    // 계산해 출력하기
    int n;
    for(int i=0; i<t; i++) {
    	cin >> n;
        
        long long arr[n*2];
        for(int j=0; j<n*2; j++) {
        	cin >> arr[j];
        }
        
        bool check[n*2] = {false, };
        for(int j=0; j<n*2; j++) {
            for(int k=j+1; k<n*2; k++) {
                if( check[j]==false && arr[k] == arr[j]/0.75 ) {
                    check[j] = true;
                    break;
                }
            }
        }      
        
        cout << "#" << i+1 << " ";
        for(int j=0; j<n*2; j++) {
        	if(check[j] == true) 
                cout << arr[j] << " ";
        }
        cout << "\n";
    }
    
	return 0;//정상종료시 반드시 0을 리턴해야합니다.
}

 

 

 

 

 

1. 위에서는 먼저 계산을 하고 마지막에 한꺼번에 할인된 가격들을 출력하는 식으로 했는데, 

그냥 더 간단한 구현을 위해 계산하며 출력하는 방식으로 진행했다.

2. 또 위에 코드에서 오류가 났던 이유는 check[k]==false를 조건으로 해주지 않아서였다.

이 조건을 고려해주지 않고 check[j]==false만 고려했던 위의 코드에서는 다음과 같은 문제가 발생했다.

할인된 가격들은 할인된 가격임을 알아내면 check[j]==false가 있기에 더이상 고려되지 않고 끝나지만,

원래 가격에 대해서는 이미 할인된 가격에 대한 원래 가격인 것을 알았음에도, check[k]==false 조건이 없어서, 다음번에 할인된 가격으로 또 고려하게 되는 (같은 가격을 여러번 고려하게 되는) 문제가 발생했다.

다시 작성한 코드는 다음과 같다.

#include<iostream>
using namespace std;

int main(int argc, char** argv){
    // t 입력받기 
    int t;
    cin >> t;
    
    // 계산해 출력하기
    int n;
    for(int i=0; i<t; i++) {
    	cin >> n;
        
        long long arr[n*2];
        for(int j=0; j<n*2; j++) {
        	cin >> arr[j];
        }
        
        cout << "#" << i+1 << " ";
        
        bool check[n*2] = {false }; //-1이면 아직 비어있음, 0이면 할인된 가격, 1이면 원래가격
        for(int j=0; j<n*2; j++) {
            if( check[j]==false ) {
            	for(int k=j+1; k<n*2; k++) {
                	if( check[k]==false && arr[k] == arr[j]*4/3 ) {
                        cout << arr[j] << " ";
                    	check[j] = true;
                        check[k] = true;
                    	break;
                	}
            	}            	
            }
        }      
        
        cout << "\n";
    }
    
	return 0;//정상종료시 반드시 0을 리턴해야합니다.
}