자료구조&알고리즘/백준

[C++] 백준 5543번 - 상근날드

celinayk 2022. 12. 27. 19:29
반응형

문제

상근날드에서 가장 잘 팔리는 메뉴는 세트 메뉴이다. 주문할 때, 자신이 원하는 햄버거와 음료를 하나씩 골라, 세트로 구매하면, 가격의 합계에서 50원을 뺀 가격이 세트 메뉴의 가격이 된다.
햄버거는 총 3종류 상덕버거, 중덕버거, 하덕버거가 있고, 음료는 콜라와 사이다 두 종류가 있다.
햄버거와 음료의 가격이 주어졌을 때, 가장 싼 세트 메뉴의 가격을 출력하는 프로그램을 작성하시오.

입력

입력은 총 다섯 줄이다. 첫째 줄에는 상덕버거, 둘째 줄에는 중덕버거, 셋째 줄에는 하덕버거의 가격이 주어진다. 넷째 줄에는 콜라의 가격, 다섯째 줄에는 사이다의 가격이 주어진다. 모든 가격은 100원 이상, 2000원 이하이다

출력

첫째 줄에 가장 싼 세트 메뉴의 가격을 출력한다

접근

제일 처음에는 햄버거를 저장하는 벡터, 음료를 저장하는 벡터를 만든 후 각각 벡터를 돌면서 순서대로 가장 작은 수가 제일 앞에 오게 정렬해준 다음 각각의 0번째 인덱스의 값들을 더해서 출력하는 방법을 이용했다

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
using namespace std;

int main() {

	vector<int>burger(3);
	vector<int>bev(2);

	for (int i = 0; i < burger.size(); i++) {
		scanf("%d", &burger[i]);
	}
	for (int i = 0; i < bev.size(); i++) {
		scanf("%d", &bev[i]);
	}
	int tmp;
	for (int i = 0; i < burger.size() - 1; i++) {
		for (int j = 0; j < burger.size() - 1 - i; i++) {
			if (burger[j] > burger[j + 1]) {
				tmp = burger[j];
				burger[j] = burger[j + 1];
				burger[j + 1] = tmp;
			}
		}
	}
	for (int i = 0; i < bev.size() - 1; i++) {
		for (int j = 0; j < bev.size() - 1 - i; i++) {
			if (bev[j] > bev[j + 1]) {
				tmp = bev[j];
				bev[j] = bev[j + 1];
				bev[j + 1] = tmp;
			
		}
	}
	printf("%d", burger[0]+bev[0]-50);

	return 0;
}

하지만 컴파일 에러라고 떴고 결론은 틀린답이었다.

내가 봐도 이중반복문을 두번이나 도는게 비효율적으로 느껴졌다. 그래서 다른분들의 코드를 참고해서 새로운 접근방법으로 문제를 풀었다. 

 

코드

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>

using namespace std;

int main() {

	int B = 0;
	int D = 0;
	int b, d;
	for (int i = 0; i < 3; i++) {
		scanf("%d", &b);
		if (B == 0) {
			B = b; //처음입력할때 
		}
		if (b < B) {
			B = b; //B에값있는데b가더작으면그게B가됨
		}
	}
	for (int i = 0; i < 2; i++) {
		scanf("%d", &d);
		if (D == 0) {
			D = d;
		}
		if (d < D) {
			D = d;
		}
	}
	printf("%d", B + D - 50);
	
	return 0;
}

리뷰

가장작은 햄버거값을 B라고 하면 B를 처음부터 0으로 고정해놓고 b를 입력받는다.

B랑 비교하면서 일일히 값을 다 받아서 정렬할 필요 없이 B값을 바로 알수 있다

 

학습

되게 쉬운 문제같은데 나는 이런 알고리즘을(?) 생각하지 못했다. 우선 값을 전부 받은 후 이후에 어떻게 가장 작은 수를 도출해낼지에 대해서 초점이 맞춰져 있었다. 애초에 값을 다 받지말고 이렇게 간단하게 풀 수도 있다는 것을 깨달았다. 나도 언젠가 이렇게 간단하게 풀 수 있는 날이 올까....하여튼 문제를 해결 할때 더 폭넓은 관점에서 바라볼수있도록 노력해야겠다 그러기위해선 문제를 많이 풀어야겟쥐...ㅋ

 

출처

5543번: 상근날드 (acmicpc.net)

 

5543번: 상근날드

입력은 총 다섯 줄이다. 첫째 줄에는 상덕버거, 둘째 줄에는 중덕버거, 셋째 줄에는 하덕버거의 가격이 주어진다. 넷째 줄에는 콜라의 가격, 다섯째 줄에는 사이다의 가격이 주어진다. 모든 가

www.acmicpc.net