ยซ   2025/02   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Archives
Recent Posts
02-17 02:53

Today
Total

Recent Comments
๊ด€๋ฆฌ ๋ฉ”๋‰ด

์—ฐ์˜ ๊ธฐ๋ก ๐Ÿช

[๋ฐฑ์ค€ 1620]-๋‚˜๋Š”์•ผ ํฌ์ผ“๋ชฌ ๋งˆ์Šคํ„ฐ ์ด๋‹ค์†œ(C++)/์ด์ง„ํƒ์ƒ‰, ์ˆซ์ž์—ฌ๋ถ€ ๋ณธ๋ฌธ

Problem Solving/BOJ

[๋ฐฑ์ค€ 1620]-๋‚˜๋Š”์•ผ ํฌ์ผ“๋ชฌ ๋งˆ์Šคํ„ฐ ์ด๋‹ค์†œ(C++)/์ด์ง„ํƒ์ƒ‰, ์ˆซ์ž์—ฌ๋ถ€

kite707 2021. 7. 28. 19:29

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

 

1620๋ฒˆ: ๋‚˜๋Š”์•ผ ํฌ์ผ“๋ชฌ ๋งˆ์Šคํ„ฐ ์ด๋‹ค์†œ

์ฒซ์งธ ์ค„์—๋Š” ๋„๊ฐ์— ์ˆ˜๋ก๋˜์–ด ์žˆ๋Š” ํฌ์ผ“๋ชฌ์˜ ๊ฐœ์ˆ˜ N์ด๋ž‘ ๋‚ด๊ฐ€ ๋งž์ถฐ์•ผ ํ•˜๋Š” ๋ฌธ์ œ์˜ ๊ฐœ์ˆ˜ M์ด ์ฃผ์–ด์ ธ. N๊ณผ M์€ 1๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 100,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ธ๋ฐ, ์ž์—ฐ์ˆ˜๊ฐ€ ๋ญ”์ง€๋Š” ์•Œ์ง€? ๋ชจ๋ฅด๋ฉด

www.acmicpc.net

 

์ด ๋ฌธ์ œ์—์„œ ๋ฐฐ์šด๊ฒƒ์€ ๋ฌธ์ž์—ด-์ˆซ์ž ๋ณ€ํ™˜, ์ด์ง„ํƒ์ƒ‰์ด๋‹ค. ์ด์ง„ํƒ์ƒ‰์€ ์ด๋ก ์€ ์•Œ๊ณ  ์žˆ์—ˆ๋Š”๋ฐ ์‚ฌ์šฉํ•  ์ƒ๊ฐ์„ ์ž๊พธ ๋ชปํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

 

๋ฌธ์ž์—ด๊ณผ ์ˆซ์ž

์šฐ์„  ์ž…๋ ฅ๋ฐ›์€ ๊ฐ’์ด ์ˆซ์ž์ธ์ง€ ์ˆซ์ž๊ฐ€ ์•„๋‹Œ์ง€ ํŒ์ •์„ ํ•ด์•ผ ํ–ˆ๋Š”๋ฐ ๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด ํ•จ์ˆ˜๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์—ˆ๋‹ค. isdigit()ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ–ˆ๋‹ค.

//isdigit( [charํ˜• ๋ฌธ์ž] ) -> ํ•ด๋‹น ๋ฌธ์ž๊ฐ€ ์ˆซ์ž์ธ์ง€ ์•„๋‹Œ์ง€ ๋ฆฌํ„ดํ•ด์ค€๋‹ค.

bool isNumber(string str) {
	for (auto k : str) {
		if (isdigit(k) == false) {
			return false;
		}
	}
	return true;
}

๋˜ ๊ฐ’์„ ๋ฌธ์ž์—ด(string)์— ์ž…๋ ฅ๋ฐ›์•„ ์ด๊ฒŒ ์ˆซ์ž๋ฉด ๋‚˜์ค‘์— intํ˜•์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ์—ˆ๋Š”๋ฐ ๊ทธ๊ฑด ์•„๋ž˜์™€ ๊ฐ™์ด ํ•˜๋ฉด ๋œ๋‹ค.

atoi()ํ•จ์ˆ˜์™€ c_str()ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ–ˆ๋‹ค.

atoi => char to int
atof => char to float
atol => char to long int

c_str => string์˜ ์ฒซ๋ฒˆ์งธ ๋ฌธ์ž์˜ ์ฃผ์†Œ๊ฐ’ ๋ฐ˜ํ™˜. char *ํ˜• ๋ฐ˜ํ™˜

์ฆ‰ stringํ˜•์˜ ์ž๋ฃŒํ˜•์„ c_str()๋กœ char* ํ˜•์œผ๋กœ ๋ฐ”๊ฟ”์ค€ ํ›„, ์ด๋ฅผ atoiํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ๋ฐ›์•„ intํ˜•์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•œ๋‹ค.

string question="12";
int num=atoi(question.c_str());

//13
cout<<num;

 

์ด์ง„ํƒ์ƒ‰

์ด์ง„ํƒ์ƒ‰์€ ์‰ฝ๊ฒŒ ๋งํ•ด์„œ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ์—์„œ ์ฐพ์œผ๋ ค๋Š” ๊ฐ’๊ณผ ์ค‘๊ฐ„ ๊ฐ’์„ ๋น„๊ตํ•˜๋ฉฐ ๊ฐ’์„ ์ฐพ์•„ ๋‚˜๊ฐ€๋Š” ๊ฒƒ์ด๋‹ค. ์ผ๋ฐ˜์ ์ธ ์˜ˆ์‹œ๊ฐ€ ๋ฐฐ์—ด์ด๋‹ˆ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์—์„œ ๊ฐ’์„ ์ฐพ๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ์•„๋ž˜๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•œ ์˜ˆ์‹œ์ด๋‹ค.

#include<iostream>
using namespace std;

//์•„๋ž˜ ๋ฐฐ์—ด์—์„œ 7์„ ์ฐพ๋Š” ์˜ˆ์ œ
int arr [10]= { 1,2,3,4,5,6,7,8,9,10 };

int main() {
	//์ฐพ์„ ๊ฐ’ ๋ฒ”์œ„ ์ค‘ ์ฒซ๋ฒˆ์งธ ์ธ๋ฑ์Šค, ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค์˜ ์œ„์น˜์ด๋‹ค.
	int low = 0;
	int high = 9;

	int ans = 7;
	//๋ช‡๋ฒˆ๋งŒ์— ์ฐพ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•จ
	int count = 0;

	int mid = 0;
	while (low <= high) {
		count++;
		mid = (low + high) / 2;

		if (arr[mid] < ans) {
			low = mid + 1;
		}
		else if (arr[mid > ans]) {
			high = mid - 1;
		}
		if (arr[mid]==ans) {
			cout << count << "๋ฒˆ ๋งŒ์— ์ฐพ์•˜์Šต๋‹ˆ๋‹ค!";
			break;
		}
		
	}


}

 

์•„๋ž˜ ๋ธ”๋กœ๊ทธ์— ๋”์šฑ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

https://blockdmask.tistory.com/167

 

[ํƒ์ƒ‰] ์ด์ง„ํƒ์ƒ‰ (Binary Search) ๊ตฌํ˜„ ๋ฐฉ๋ฒ•

์•ˆ๋…•ํ•˜์„ธ์š”. BlockDMask ์ž…๋‹ˆ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ฝ”๋”ฉ ์‚ฌ์ดํŠธ(๋ฐฑ์ค€ ์˜จ๋ผ์ธ ์ €์ง€)์—์„œ '์ˆ˜ ์ฐพ๊ธฐ' ๋ฌธ์ œ๋ฅผ ํ’€๋‹ค๊ฐ€ ์ด์ง„ํƒ์ƒ‰(Binary Search)์ด ๋‚˜์™€์„œ, ์ด๋ฒˆ ๊ธฐํšŒ์— ์ •๋ฆฌ๋ฅผ ํ•ด๋ณผ๊นŒ ํ•ฉ๋‹ˆ๋‹ค. 1. ์ด์ง„ํƒ์ƒ‰(Binary Search)

blockdmask.tistory.com

์ „์ฒด ์ฝ”๋“œ

#include <iostream>
#include <vector>
#include <algorithm>
#define P pair<string,int>
using namespace std;

string arr[100001];
vector<P> vec;

bool isNumber(string str) {
	for (auto k : str) {
		if (isdigit(k) == false) {
			return false;
		}
	}
	return true;
}

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

	int N, M;
	cin >> N >> M;
	vec.push_back(P("", 0));
	for (int i = 1; i <= N; i++) {
		string name;
		cin >> name;
		arr[i] = name;
		vec.push_back(P(name, i));
	}

	sort(vec.begin(), vec.end());
	



	string question;
	for (int i = 0; i < M; i++) {
		cin >> question;
		//์ž…๋ ฅ๊ฐ’์ด ์ˆซ์ž๋ฉด, ํ•ด๋‹น ์ธ๋ฑ์Šค์— ์žˆ๋Š” ๊ฐ’ ๊ฐ€์ ธ์˜ด
		if (isNumber(question)) {
			int num = atoi(question.c_str());
			cout << arr[num] << "\n";
		}
		else {
			//์ž…๋ ฅ๊ฐ’์ด ๋ฌธ์ž์—ด์ด๋ฉด ์ด์ง„ํƒ์ƒ‰์œผ๋กœ ๊ฐ’ ์ฐพ์Œ(๊ทธ๋ƒฅ ์ฐพ์œผ๋ฉด ์‹œ๊ฐ„์ดˆ๊ณผ)
			int low = 1;
			int high = N;
			int mid = (low + high) / 2;
			while (low <= high) {
				mid = (low + high) / 2;
				if (vec[mid].first == question) {
					cout << vec[mid].second << "\n";
					break;
				}
				else if (question > vec[(low + high) / 2].first) {
					low = mid+1;
				}
				else {
					high = mid-1;
				}
			}
			
		}
	}

	
}