문제

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

 

7568번: 덩치

우리는 사람의 덩치를 키와 몸무게, 이 두 개의 값으로 표현하여 그 등수를 매겨보려고 한다. 어떤 사람의 몸무게가 x kg이고 키가 y cm라면 이 사람의 덩치는 (x, y)로 표시된다. 두 사람 A 와 B의 덩

www.acmicpc.net

 

풀이

기준을 정확히 잡고 풀면 쉬운 문제였다. 이중 for문을 통해 전부 비교해주면서 자기보다 키, 몸무게 모두 큰 사람이 있다면 1씩 cnt를 증가하면 된다.  (&&사용)

 

그게 아니라면 cnt는 그대로 유지한다.

 

코드

#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int N;
vector<int> result;
vector<pair<int, int>> arr;
int main() {

	cin >> N;

	for (int i = 0; i < N; i++) {
		int a, b;
		cin >> a >> b;
		arr.push_back({ a,b });

	}
	int cnt = 0;
	for (int i = 0; i < N; i++) {
		cnt = 1;
		for (int j = 0; j < N; j++) {
			if (arr[i].first < arr[j].first && arr[i].second < arr[j].second) {
				cnt++;
			}


		}
		result.push_back(cnt);
	}


	for (int i = 0; i < result.size(); i++) {
		cout << result[i] << " ";
	}
	return 0;
}

문제

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

 

10989번: 수 정렬하기 3

첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다.

www.acmicpc.net

 

풀이

굉장히 쉬운 정렬 문제인 줄 알고 그냥 들이댔다가 큰코다쳤다. 

메모리 초과가 뜬 걸 보고 문제를 다시 천천히 읽었다. N이 10,000,000까지 가능하다. 

이를 전부 입력받고 sort()하면 메모리가 남아나질않음을 인지했어야 했다.

 

다시 문제를 처음으로 돌아가 result배열에 한 칸씩 카운트를 늘려주는 방식으로 풀었다. (입력 숫자는 10000 이하이므로)

좋은 문제 같다.

 

코드

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int result[10001];
int N;
int main() {
//단순하게 sort()로 풀면 메모리초과 (공간복잡도)
//입력값을 전부 저장하면 메모리 초과 (10,000,000)
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> N;
	

	for (int i = 0; i < N; i++) {
		int a;
		cin >> a;

		result[a]++;
	}
	//탐색
	for (int j = 0; j < 10001; j++) {
		for (int k = 0; k<result[j];k++){
			if (result[j] == 0) break;
			else{
				cout << j << '\n';
			}


		}

	}

	return 0;
}

문제

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

 

10814번: 나이순 정렬

온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을

www.acmicpc.net

 

풀이

구조체를 만들어 각 입력에 순서표를 달아주었다.

이를 통하여 Sort() + 우선순위 조건을 추가하여 정렬하는 문제였다.

 

코드

#include<vector>
#include<iostream>
#include<queue>
#include<algorithm>
#include<string>
using namespace std;
int N;
struct human{
	int num;
	int age;
	string name;

};

bool cmp(human a,human b) {
	if (a.age == b.age) {
		return	a.num < b.num;

	}
	
	return a.age < b.age;
	
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	
	cin >> N;
	vector<human> arr;
	for (int i = 0; i < N; i++) {
		int a;
		string b;
		cin >> a >> b;

		arr.push_back({ i,a,b });

	}

	sort(arr.begin(), arr.end(), cmp);

	for (int i = 0; i < N; i++) {
		cout << arr[i].age << " " << arr[i].name << '\n';
	}



	return 0;
}

문제

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

 

 

4949번: 균형잡힌 세상

하나 또는 여러줄에 걸쳐서 문자열이 주어진다. 각 문자열은 영문 알파벳, 공백, 소괄호("( )") 대괄호("[ ]")등으로 이루어져 있으며, 길이는 100글자보다 작거나 같다. 입력의 종료조건으로 맨 마

www.acmicpc.net

 

풀이

초반부터 설계를 제대로 하고 풀지 않아서 오래 걸렸다. 

쉽게 금방 풀릴줄알아서 바로 코드에 들어간 게 문제였다. 

 

신경 써야 할 점은

 

1. 공백 또한 입력받아야 한다. (string 헤더의 getline() 사용 필요 )

2. 스택의 경우의 수를 모두 생각 ->  ')' or ']'가 등장하였을 때 스택에 문자가 있긴 한지, 있다면 그사이 문자열 또한 균형이 잡혀있는지 판단하여야 한다.

 

 

 

코드

#include<iostream>
#include<vector>
#include<queue>
#include<string>
#include<stack>
using namespace std;
string arr;
stack<char> st;
vector<bool> result;
int main() {


	while (1) {
		bool flag = false;
		
			//<srting> 헤더의 getline()을 활용한 공백문자 입력 포함 , 개행(enter)까지 문자를 받음 
			
			getline(cin, arr);
			
			
		if (arr.size() == 1 && arr[0]=='.') break; //종료조건

		for (int i = 0; i < arr.size(); i++) {

			if (arr[i] == '(' || arr[i] == '[') st.push(arr[i]);
			
			if (!st.empty()) { 
				if (arr[i] == ')' && st.top() == '(') {
					st.pop();
				}
				else if (arr[i] == ']' && st.top() == '[') {
					st.pop();
				}
				else if (arr[i] == ')' && st.top() != '(') {
					flag = true;
					break;
				}
				else if (arr[i] == ']' && st.top() != '[') {
					flag = true;
					break;
				}
			}
			else { //비었을때
				if (arr[i] == ')' || arr[i] == ']') {
					flag = true;
					break;
				}
			}

		
			

		}

		if (st.size() == 0 && flag == false) result.push_back(true);
		else result.push_back(false);

		//다음을 위해 스택,문자열비우기 

		while (!st.empty()) {
			st.pop();
		}
		arr.clear();

	}

	for (int j = 0; j < result.size(); j++) {
		if (result[j] == true) cout << "yes" << endl;
		else cout << "no" << endl;
	}

	return 0;
}

+ Recent posts