백준 1774 - 듣보잡(C++)

CodingTest/백준|2022. 6. 2. 16:18

사전순을 못봐 정렬을 안하여 틀렸지만 쉬운 문제여서 바로 코드를 올립니다.

 

#include <iostream>
#include <vector>
#include <map>
#include <string>
#include <algorithm>
using namespace std;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int iN = 0, iM = 0;
	cin >> iN >> iM;
	map<string, int> map_First;
	vector<string> pAnswer;
	string strTemp;
	pAnswer.reserve(iN > iM ? iN : iM);
	for (int i = 0; i < iN; i++)
	{
		cin >> strTemp;
		map_First.emplace(strTemp, 1);
	}
	for (int i = 0; i < iM; i++)
	{
		cin >> strTemp;
		if (map_First.find(strTemp) != map_First.end())
			pAnswer.emplace_back(strTemp);
	}
	cout << pAnswer.size() << "\n";
	sort(pAnswer.begin(), pAnswer.end());
	for (auto& iter : pAnswer)
		cout << iter << "\n";
	return 0;
}

추후 굳이 map을 안쓰고 vector만 이용하여

binary_search를 사용하여도 된다는 것을 알았습... algorithm에 있다는걸 까먹

 

binary_search : Algorithm 헤더의 함수로써 정렬된 배열을 이진 탐색으로 true와 false로 찾아줌

 

'CodingTest > 백준' 카테고리의 다른 글

백준 18870 - 좌표 압축(C++)  (0) 2022.06.02
백준 17219 - 비밀번호 찾기(C++)  (0) 2022.06.02
백준 18111 - 마인크래프트(C++)  (0) 2022.06.02
백준 2108 - 통계학(C++)  (0) 2022.05.31
백준 2805 - 나무 자르기(C++)  (0) 2022.05.31

댓글()

백준 18870 - 좌표 압축(C++)

CodingTest/백준|2022. 6. 2. 15:41

문제를 읽고 vector를 2개를 두고

정렬한 후에 unique로 제외하여 lower_bound를 사용하여

풀이가 가능할 것 같았지만 괜히 unique를 안쓰고 싶어져서 코드가 더럽다.

 

 

#include <iostream>
#include <vector>
#include <map>
using namespace std;
int iN = 0;

int main()
{
	cin >> iN;
	vector<int> vUnorder;
	map<int, vector<int>> map_Order;
	vUnorder.reserve(iN);
	int iTemp = 0;
	for (int i = 0; i < iN; i++)
	{
		cin >> iTemp;
		vUnorder.emplace_back(iTemp);
		if (map_Order.find(iTemp) != map_Order.end())
			map_Order.find(iTemp)->second.emplace_back(i);
		else
			map_Order.emplace(iTemp, vector<int>(1, i));
	}
	auto iter_map = map_Order.begin();
	for (int i = 0; i < map_Order.size(); i++)
	{
		int iNum = iter_map->first;
		for (int j = 0; j < map_Order[iNum].size(); j++)
			vUnorder[map_Order[iNum][j]] = i;
		iter_map++;
	}
	for (int i = 0; i < iN; i++)
		cout << vUnorder[i] << " ";
	cout << "\n";
	return 0;
}

 

map을 사용하여 중복을 제거하고 물론 옳은 방법은 아닌거 같다

map의 key를 사용하여 정렬된 순서로 0부터 순차적으로 압축한 값을 출력하였다.

'CodingTest > 백준' 카테고리의 다른 글

백준 1774 - 듣보잡(C++)  (0) 2022.06.02
백준 17219 - 비밀번호 찾기(C++)  (0) 2022.06.02
백준 18111 - 마인크래프트(C++)  (0) 2022.06.02
백준 2108 - 통계학(C++)  (0) 2022.05.31
백준 2805 - 나무 자르기(C++)  (0) 2022.05.31

댓글()

백준 17219 - 비밀번호 찾기(C++)

CodingTest/백준|2022. 6. 2. 14:27

 

이 문제는 tie와 sync_with_stdio를 알려주는 문제같다.

문제 자체는 어렵지 않으니 바로 코드를 첨부하려한다.

 

#include <iostream>
#include <unordered_map>
#include <string>
using namespace std;
int iSite = 0, iPassWord = 0;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	cin >> iSite >> iPassWord;
	unordered_map<string, string> umap_Site;
	umap_Site.reserve(iSite);

	for (int i = 0; i < iSite; i++)
	{
		string strSite = "";
		string strPass = "";
		cin >> strSite >> strPass;
		umap_Site.emplace(make_pair(strSite, strPass));
	}
	for (int i = 0; i < iPassWord; i++)
	{
		string strFind = "";
		cin >> strFind;
		cout << umap_Site.find(strFind)->second << "\n";
	}
	return 0;
}

'CodingTest > 백준' 카테고리의 다른 글

백준 1774 - 듣보잡(C++)  (0) 2022.06.02
백준 18870 - 좌표 압축(C++)  (0) 2022.06.02
백준 18111 - 마인크래프트(C++)  (0) 2022.06.02
백준 2108 - 통계학(C++)  (0) 2022.05.31
백준 2805 - 나무 자르기(C++)  (0) 2022.05.31

댓글()

백준 18111 - 마인크래프트(C++)

CodingTest/백준|2022. 6. 2. 14:12

 

먼저 B의 값을 보고 long long으로 타입 지정을 결정했고

감이 잘 안와 시간이 오래 걸렸다.

 

배열의 최대값에서부터 내려가며 검사 후 인벤과 비교하며 수행하려니

너무 복잡한 코드가 나올 것 같아 패스하였고

 

그렇다고 0부터 최대 높이인 256까지 검사를 진행하면 너무 많은 시간이 소비될 것 같아

1차 배열의 각 높이를 Count하고 0부터 256까지 257번의 계산을 수행하여 계산을 진행하였다.

이렇게 하면 0부터 시작하여 O(n^3)이 아닌 O(n^2)으로 계산을 할 수 있어 진행을 하였다.

 

int main()
{
	vector<int> vMap;
	cin >> iCol >> iRow >> iInven;
	vMap.assign(MAX_HEIGHT, 0);
	int iHight = 0;
	for (int i = 0; i < iCol; i++)
	{
		for (int j = 0; j < iRow; j++)
		{
			cin >> iHight;
			vMap[iHight]++;
		}
	}
	for (int z = 0; z < MAX_HEIGHT; z++)
		SearchMap(vMap, z);
	cout << iDstT << " " << iDstH << "\n";
	return 0;
}

 

먼저 vMap을 MAX_HEIGHT(257)개의 배열로 초기화를 수행 후 각각의 입력된 값을 높이에 저장하여

Hash와 비슷하게 구현을 하였고 MAX_HEIGHT만큼의 SerachMap을 수행하여 계산을 하였다.

 

void SearchMap(const vector<int>& vMap, int iDstHeight)
{
	int iPushCnt = 0, iPopCnt = 0;
	for (int i = 0; i < iDstHeight; i++)	//목표 높이보다 낮으니 추가
		iPushCnt += (iDstHeight - i) * vMap[i];

	for (int i = iDstHeight + 1; i < MAX_HEIGHT; i++ )	//목표 높이보다 높으니 차감
		iPopCnt += (i - iDstHeight) * vMap[i];

	if (iPushCnt <= iInven + iPopCnt)
	{
		if (iDstT >= (iPushCnt + (iPopCnt * 2)))
		{
			iDstT = (iPushCnt + (iPopCnt * 2));
			iDstH = iDstHeight;
		}
	}
}

 

SearchMap은 반복문으로 들어오는 목표 높이를 기준으로

목표 높이보다 낮거나 높을때를 Count하여 인벤과 비교하여 현재 높이가 성립이 되고

이미 구해진 최단시간보다 작으면 갱신을 하였다.

 

아래는 전체 코드이다.

 

#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
using namespace std;

int MAX_HEIGHT = 257;
long long iCol = 0, iRow = 0, iMin = 0, iMax = 0, iInven = 0;
long long iDstT = INT_MAX, iDstH = 0;

void SearchMap(const vector<int>& vMap, int iDstHeight)
{
	int iPushCnt = 0, iPopCnt = 0;
	for (int i = 0; i < iDstHeight; i++)	//목표 높이보다 낮으니 추가
		iPushCnt += (iDstHeight - i) * vMap[i];

	for (int i = iDstHeight + 1; i < MAX_HEIGHT; i++ )	//목표 높이보다 높으니 차감
		iPopCnt += (i - iDstHeight) * vMap[i];

	if (iPushCnt <= iInven + iPopCnt)
	{
		if (iDstT >= (iPushCnt + (iPopCnt * 2)))
		{
			iDstT = (iPushCnt + (iPopCnt * 2));
			iDstH = iDstHeight;
		}
	}
}

int main()
{
	vector<int> vMap;
	cin >> iCol >> iRow >> iInven;
	vMap.assign(MAX_HEIGHT, 0);
	int iHight = 0;
	for (int i = 0; i < iCol; i++)
	{
		for (int j = 0; j < iRow; j++)
		{
			cin >> iHight;
			vMap[iHight]++;
		}
	}
	for (int z = 0; z < MAX_HEIGHT; z++)
		SearchMap(vMap, z);
	cout << iDstT << " " << iDstH << "\n";
	return 0;
}

'CodingTest > 백준' 카테고리의 다른 글

백준 1774 - 듣보잡(C++)  (0) 2022.06.02
백준 18870 - 좌표 압축(C++)  (0) 2022.06.02
백준 17219 - 비밀번호 찾기(C++)  (0) 2022.06.02
백준 2108 - 통계학(C++)  (0) 2022.05.31
백준 2805 - 나무 자르기(C++)  (0) 2022.05.31

댓글()

백준 2108 - 통계학(C++)

CodingTest/백준|2022. 5. 31. 15:48

제출 현황

Round 함수에 대한 Math 헤더를 추가 안하였다...ㅠ

 

 

문제를 읽고 단순 구현문제라고 판단하여 바로 구현을 시작하였다.

 

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	cin >> iNum;
	vMap.resize(iNum);
	for (int i = 0; i < iNum; i++)
		cin >> vMap[i];
	sort(vMap.begin(), vMap.end());
	cout << Sum() << "\n";
	cout << vMap[iNum / 2] << "\n";
	cout << Mode() << "\n";
	cout << vMap.back() - vMap.front() << "\n";
}

 

Main에 입력과 출력문으로만 구성을 하였고

 

int Sum()
{
	long long int iSum = 0;
	for (int i = 0; i < iNum; i++)
		iSum += vMap[i];
	return (int)round((float)iSum / (float)iNum);
}

 

1번 더하기는 각수를 더한 후 round처리로 반올림 처리를 하였다.

round() : 반올림

ceil() : 무조건 올림

floor() : 무조건 내림

Math.h 헤더 선언 필요... (Visual 2022에서 선언없이 실행이 되어 실행 되는줄...)

 

int Mode()
{
	if (iNum == 1)
		return vMap[0];
	vector<pair<int, int>> vMode;
	vMode.resize(iNum);
	int iCnt = 0;
	while (iCnt < iNum)
	{
		int iTemp = upper_bound(vMap.begin(), vMap.end(), vMap[iCnt])
					- lower_bound(vMap.begin(), vMap.end(), vMap[iCnt]);
		vMode[iCnt] = make_pair(iTemp, vMap[iCnt]);
		iCnt += iTemp;
	}
	sort(vMode.begin(), vMode.end(), cmp);
	int iModeVal = vMode[0].first;
	vector<int> vResultMode;
	vResultMode.reserve(iNum);
	for (int i = 0; i < iNum; i++)
	{
		if(vMode[i].first == iModeVal)
			vResultMode.emplace_back(vMode[i].second);
	}
	if (vResultMode.size() > 1)
		return vResultMode[1];
	else
		return vResultMode.front();
}

 

최빈값을 이렇게 처리하였지만 고수분들은 더 깔끔하게 하였을것 같다... 너무 더럽다...

먼저 pair<int, int>로 upper_bound와 lower_bound를 사용하여 중첩된 수를 체크 후

최고 개수로 다시 vector를 구성하여

개수가 2개 이상 → 2번째 인자 출력

개수가 1개 → 첫번째 인자 출력

 

pair에 대한 정렬은 cmp를 정의하여 pair에 대한 비교를 수행하였다.

bool cmp(pair<int, int> pFront, pair<int, int> pBack)
{
	if (pFront.first == pBack.first)
		return pFront.second < pBack.second;
	return pFront.first > pBack.first;
}

 

pair는 (중첩 개수, 해당 인자 값) 으로 구성하였고

중첩 수가 같다면 인자의 값으로 정렬을 하였다.

 

아래는 모든 코드입니다.

#include <iostream>
#include <vector>
#include <algorithm>
#include <math.h>
using namespace std;

int iNum = 0;
vector<int> vMap;

int Sum()
{
	long long int iSum = 0;
	for (int i = 0; i < iNum; i++)
		iSum += vMap[i];
	return (int)round((float)iSum / (float)iNum);
}

bool cmp(pair<int, int> pFront, pair<int, int> pBack)
{
	if (pFront.first == pBack.first)
		return pFront.second < pBack.second;
	return pFront.first > pBack.first;
}

int Mode()
{
	if (iNum == 1)
		return vMap[0];
	vector<pair<int, int>> vMode;
	vMode.resize(iNum);
	int iCnt = 0;
	while (iCnt < iNum)
	{
		int iTemp = upper_bound(vMap.begin(), vMap.end(), vMap[iCnt])
					- lower_bound(vMap.begin(), vMap.end(), vMap[iCnt]);
		vMode[iCnt] = make_pair(iTemp, vMap[iCnt]);
		iCnt += iTemp;
	}
	sort(vMode.begin(), vMode.end(), cmp);
	int iModeVal = vMode[0].first;
	vector<int> vResultMode;
	vResultMode.reserve(iNum);
	for (int i = 0; i < iNum; i++)
	{
		if(vMode[i].first == iModeVal)
			vResultMode.emplace_back(vMode[i].second);
	}
	if (vResultMode.size() > 1)
		return vResultMode[1];
	else
		return vResultMode.front();
}

int main()
{
	cin >> iNum;
	vMap.resize(iNum);
	for (int i = 0; i < iNum; i++)
		cin >> vMap[i];
	sort(vMap.begin(), vMap.end());
	cout << Sum() << "\n";
	cout << vMap[iNum / 2] << "\n";
	cout << Mode() << "\n";
	cout << vMap.back() - vMap.front() << "\n";
}

'CodingTest > 백준' 카테고리의 다른 글

백준 1774 - 듣보잡(C++)  (0) 2022.06.02
백준 18870 - 좌표 압축(C++)  (0) 2022.06.02
백준 17219 - 비밀번호 찾기(C++)  (0) 2022.06.02
백준 18111 - 마인크래프트(C++)  (0) 2022.06.02
백준 2805 - 나무 자르기(C++)  (0) 2022.05.31

댓글()

백준 2805 - 나무 자르기(C++)

CodingTest/백준|2022. 5. 31. 14:40

 

제출현황

 

문제를 읽고 각각의 나무를 자를 평균값을 초기값 선정을 생각하여

이분탐색을 생각하였고

삽입은 맨 끝으로만 진행하고 삭제는 없기 때문에

STL은 Vector를 선정하였다.

또한 max_element로 최대값을 구할 수 있지만

백트레킹?으로 중간에 목표하는 나무값보다 크다면 종료하여 기준값 변경을 위해

내림차순으로 정렬한 후에 더한 값이 더 커지면 다음 기준값으로 변경하여

시간을 줄여보았다. 

 

sort로 하지않고 이분탐색만 사용을 하였을 때는 164ms가 걸렸지만

 

sort하여 내림차순으로 중간을 넘어갔을때에는

 

156ms로 12ms를 줄여보았다.

아래는 작성한 코드이다.

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int iNum = 0, iMid = 0, iResult = 0;
long long int iMaxSum = 0;
vector<int> vTree;

void SearchTree()
{
	int iStart = 0, iEnd = vTree[0];
	while (iStart <= iEnd)
	{
		long long int iSum = 0;
		iMid = (iStart + iEnd) / 2;
		for (int i = 0; i < iNum; i++)
		{
			if (vTree[i] > iMid)
			{
				iSum += vTree[i] - iMid;
				if (iSum > iMaxSum)
					break;
			}
		}
		if (iSum < iMaxSum)
			iEnd = iMid - 1;
		else
		{
			iStart = iMid + 1;
			iResult = iMid;
		}
	}
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	cin >> iNum >> iMaxSum;
	vTree.resize(iNum);
	for (int i = 0; i < iNum; i++)
		cin >> vTree[i];
	sort(vTree.begin(), vTree.end(), greater<int>());
	SearchTree();
	cout << iResult << "\n";
}

 

 

 

'CodingTest > 백준' 카테고리의 다른 글

백준 1774 - 듣보잡(C++)  (0) 2022.06.02
백준 18870 - 좌표 압축(C++)  (0) 2022.06.02
백준 17219 - 비밀번호 찾기(C++)  (0) 2022.06.02
백준 18111 - 마인크래프트(C++)  (0) 2022.06.02
백준 2108 - 통계학(C++)  (0) 2022.05.31

댓글()