์ฐ์ ๊ธฐ๋ก ๐ช
[๋ฐฑ์ค 1620]-๋๋์ผ ํฌ์ผ๋ชฌ ๋ง์คํฐ ์ด๋ค์(C++)/์ด์งํ์, ์ซ์์ฌ๋ถ ๋ณธ๋ฌธ
[๋ฐฑ์ค 1620]-๋๋์ผ ํฌ์ผ๋ชฌ ๋ง์คํฐ ์ด๋ค์(C++)/์ด์งํ์, ์ซ์์ฌ๋ถ
kite707 2021. 7. 28. 19:29https://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;
}
}
}
}
}
'Problem Solving > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค 1676]- ํฉํ ๋ฆฌ์ผ 0์ ๊ฐ์(C++) (0) | 2021.07.30 |
---|---|
[๋ฐฑ์ค 1463] -1๋ก๋ง๋ค๊ธฐ(C++)/๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ (0) | 2021.07.29 |
[๋ฐฑ์ค1978]-์์ ์ฐพ๊ธฐ(C++) (0) | 2021.07.18 |
[๋ฐฑ์ค2609]-์ต๋๊ณต์ฝ์์ ์ต์๊ณต๋ฐฐ์(C++)/์ ํด๋ฆฌ๋ ํธ์ ๋ฒ (0) | 2021.07.18 |
[๋ฐฑ์ค1012] ์ ๊ธฐ๋ ๋ฐฐ์ถ(C++) (0) | 2021.07.08 |