처음 작성한 코드는 다음과 같다.
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을 리턴해야합니다.
}
'SWEA' 카테고리의 다른 글
SWEA 6913. 동철이의 프로그래밍 대회 D3 C++ (0) | 2024.05.12 |
---|---|
SWEA 18662. 등차수열 만들기 D3 C++ (0) | 2024.05.12 |
SWEA 1926. 간단한 369게임 D2 C++ (0) | 2024.05.11 |
SWEA 2005. 파스칼의 삼각형 D2 C++ (0) | 2024.05.11 |
SWEA 17319. 문자열문자열 D3 C++ (0) | 2024.05.10 |