프로그래밍 공부

SWEA 1859번 백만 장자 프로젝트 본문

Problem Solving/SW Expert Academy

SWEA 1859번 백만 장자 프로젝트

khj1999 2021. 6. 28. 13:26

문제를 보자마자 딱 떠오른 아이디어가 입력할 때 최대 값이 있는 인덱스를 구하고
최대 값 인덱스를 지나치면 최대 값 인덱스 + 1부터 다시 탐색을 해서 최대 값 인덱스를 구해주고

이를 반복하는 아이디어를 생각했다. 근데 이렇게 구해보니 역순으로 탐색하면 함수를 사용 안 하고 풀 수 있을 거 같아서 알아보니 많은 분들이 역순으로 문제를 해결했다고 해서 역순으로도 풀어봤는데 역순으로 푸는 게

MAX값을 찾는 함수를 쓰지 않아서인지 효율이 더 좋았다.

참고로 답을 구하는 변수는 int형 범위를 초과할수 있으니 long 또는 long long자료형을 써야한다

 

1. 순서대로 탐색한 코드

#include <iostream>
#include <vector>
#define INT long long
using namespace std;

INT Scan_Max(vector<INT> v, INT start) { // MAX값을 구하는 함수
	INT len = v.size();
	INT max = 0, max_index = 0;
	for (INT i = start; i < len; i++) {
		if (v[i] > max) {
			max = v[i];
			max_index = i;
		}
	}
	return max_index;
}

int main() {
	INT t;
	cin >> t;
	for (INT i = 0; i < t; i++) {
		vector<INT> v;
		INT profit = 0;
		INT n = 0, max = 0, max_index = 0;
		cin >> n;
		for (INT j = 0; j < n; j++) {
			INT num;
			cin >> num; v.push_back(num);
			if (max < v[j]) {
				max = v[j];
				max_index = j;
			}
		}
		for (INT j = 0; j < n; j++) {
			if (max_index == j) {
				max_index = Scan_Max(v, max_index + 1); MAX값의 다음 인덱스부터 검색
				continue;
			}
			profit += v[max_index] - v[j];
		}
		cout << "#" << i + 1 << ' ' << profit << '\n';
	}
	return 0;
}

2. 역순으로 탐색한 코드

#include <iostream>
#include <vector>
#define INT long long
using namespace std;

int main() {
	INT t;
	cin >> t;
	for (INT i = 0; i < t; i++) {
		vector<INT> v;
		INT profit = 0;
		INT n = 0, max = 0;
		cin >> n;
		for (INT j = 0; j < n; j++) {
			INT num;
			cin >> num; v.push_back(num);
		}
		int len = v.size();
		max = v[len - 1];
		for (INT j = len - 2; j >= 0; j--) {
			if (max < v[j]) {
				max = v[j];
			}
			profit += max - v[j];
		}
		cout << "#" << i + 1 << ' ' << profit << '\n';
	}
	return 0;
}

 

 

'Problem Solving > SW Expert Academy' 카테고리의 다른 글

SWEA 1209 Sum  (1) 2023.11.19
1208 Flatten  (2) 2023.11.19
1205 View  (1) 2023.11.18
1240 단순 2진 암호코드  (0) 2023.11.18
18662 등차수열 만들기  (0) 2023.11.15
Comments