https://www.acmicpc.net/problem/2979

 

2979번: 트럭 주차

첫째 줄에 문제에서 설명한 주차 요금 A, B, C가 주어진다. (1 ≤ C ≤ B ≤ A ≤ 100) 다음 세 개 줄에는 두 정수가 주어진다. 이 정수는 상근이가 가지고 있는 트럭이 주차장에 도착한 시간과 주차장

www.acmicpc.net

 

풀이 과정

 탐색해야할 시간이 1 ~ 100까지 작았기 때문에 시간대별 주차장 상황을 나타내줄 arr[]를 만들었고, arr의 상태를 감시하며 요금을 부과했다.

 

느낀 점

 오타로 10여분 정도 헤맸다. 문제없다고 생각한 코드에서 문제가 발생했을 때, 오타를 보는게 참 어려운 것 같다. 중간 중간 디버깅을 해보며, i와 j를 헷갈려 쓴 곳을 고치고, 3대가 주차되었을 때 요금 합산이 되지 않는 것을 발견하며 오타를 발견하게 되었다.

 

 

#include<bits/stdc++.h>
using namespace std;

int ca, cb, cc, in, out, ret;
int arr[101];

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	cin >> ca >> cb >> cc;

	for (int i = 0; i < 3; i++) {
		cin >> in >> out;
		for (int j = in; j < out; j++) arr[j]++;
	}


	for (int i = 0; i < 101; i++) {
		if (arr[i] == 1) {
			ret += ca;
		}
		else if (arr[i] == 2) {
			ret += (cb * 2);
		}
		else if (arr[i] == 3) {
			ret += (cc * 3);
		}
	}

	cout << ret << "\n";

	return 0;
}

 

https://www.acmicpc.net/problem/10808

 

10808번: 알파벳 개수

단어에 포함되어 있는 a의 개수, b의 개수, …, z의 개수를 공백으로 구분해서 출력한다.

www.acmicpc.net

 

풀이 과정

 알파벳 개수만큼 배열을 만들고 string에 입력을 받았다. 문자열을 0 -> str.size() 까지 검사하며, 알파벳에 해당하는 인덱스를 ++했다. 그리고 alpha[]배열을 차례로 출력했다.

 

느낀 점

 간단한 문자열 문제였다. '소문자' - 'a' 와 같이 연속되는 문자열 첫글자를 빼줘서 문자열과 인덱스 번호를 맞췄다. 또 대문자 'A' = 65, 소문자 'a' = 97, 알파벳 개수 = 26 정도 암기하면 좋은 문제였다.

 

#include<bits/stdc++.h>
using namespace std;

string str;
int alpha[26];

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	cin >> str;

	for (int i = 0; i < str.size(); i++) {
		alpha[str[i] - 'a']++;
	}

	for (int i = 0; i < 26; i++) {
		cout << alpha[i] << " ";
	}
    
	return 0;
}

'알고리즘 : C++ > BaekJoon' 카테고리의 다른 글

백준 11655번 - ROT13  (0) 2023.05.19
백준 1159번 - 농구 경기  (0) 2023.05.19
백준 10988번 - 팰린드롬인지 확인하기  (1) 2023.05.19
백준 2979번 - 트럭 주차  (0) 2023.05.19
백준 2309번 - 일곱 난쟁이  (0) 2023.05.19

https://www.acmicpc.net/problem/2309

 

2309번: 일곱 난쟁이

아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.

www.acmicpc.net

 

풀이 과정

 9명의 난쟁이 중 7명을 뽑아 그 수가 100이 되면 출력했다. 어떤 경우든 한 번만 출력하면 되기때문에, find_seven() 함수에서 next_permutation을 사용해 순열을 구한 후, [앞에 7개의 배열만 읽으며 합이 100이 되었을 때] (중복이 있지만 조합이라고 볼 수 있다. print_ans() 함수를 호출해 정답을 출력했다.

 

느낀 점

 예전 문제들을 처음부터 복습하고 있다. 아래 첨부한 소스 코드가 예전코드인데, 당시 모든 경우의 수를 vector에 담고 무작위 인덱스를 만들거나, 입력 예외 처리를 안내하는 등 불필요한 코드가 많았다. 이번에는 문제 해결에만 포커스를 두었다. 문제의 탐색 범위가 작기 때문에 next_permutation을 이용해 빠르게 정답을 구현하는데 집중했다.

 

//이번 코드
#include<bits/stdc++.h>
using namespace std;

const int SUM = 100;
int smp[9];

void print_ans(int arr[]) {
	sort(&arr[0], &arr[0] + 7);
	for (int i = 0; i < 7; i++) {
		cout << arr[i] << "\n";
	}
	return;
}

bool find_seven(int arr[]) {
	int temp[7];
	fill(&temp[0], &temp[0] + 7, 0);
	bool ans_flag = false;
	do {
		int sum = 0;
		for (int i = 0; i < 7; i++) {
			sum += arr[i];
		}
		if (sum == SUM) {
			ans_flag = true;
			break;
		}
	} while (next_permutation(&arr[0], &arr[9]));

	if (ans_flag) {
		print_ans(arr);
		return 0;
	}
	return 1;
}


int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	for (int i = 0; i < 9; i++) {
		cin >> smp[i];
	}

	sort(&smp[0], &smp[0] + 9);
	
	find_seven(smp);

	return 0;
}

 

//예전 코드
#include <bits/stdc++.h>
using namespace std;
int n = 9;
int k = 7, sum;
vector<vector<int>> temp;
int input[9];

void print_vec(vector<int> b) {
	for (int i : b) cout << i << "\n";
}

void combi(int start, vector<int> b) {
	if ((int)b.size() == k) {		
		//요소 합이 100일 때 조건
		sum = 0;
		for (int i : b) sum += i;
		if (sum == 100) {
			temp.push_back(b);
		}
		return;
	}
	for (int i = start + 1; i < n; i++) {
		b.push_back(input[i]);
		combi(i, b);
		b.pop_back();
	}
	return;
}

int main() {
	vector<int> a;
	srand(time(NULL));

	for (int i = 0; i < n; i++) {
		cin >> input[i];
		if (input[i] > 100) {
			cout << "잘못된 입력 입니다.\n";
			return 0;
		}
	}

	combi(-1, a);
	
	if (temp.size() != 0) {
		int random = rand() % temp.size();
		sort(temp[random].begin(), temp[random].end());
		print_vec(temp[rand() % temp.size()]);
	}

	return 0;
}

 

'알고리즘 : C++ > BaekJoon' 카테고리의 다른 글

백준 11655번 - ROT13  (0) 2023.05.19
백준 1159번 - 농구 경기  (0) 2023.05.19
백준 10988번 - 팰린드롬인지 확인하기  (1) 2023.05.19
백준 2979번 - 트럭 주차  (0) 2023.05.19
백준 10808번 - 알파벳 개수  (0) 2023.05.19

+ Recent posts