๊ธฐ๋ก๋ฐฉ

BOJ_1021 : ํšŒ์ „ํ•˜๋Š” ํ ๋ณธ๋ฌธ

CodingTest/C++

BOJ_1021 : ํšŒ์ „ํ•˜๋Š” ํ

Soom_1n 2022. 3. 27. 02:34

๐Ÿ‘‰ ๋ฌธ์ œ๋งํฌ

 

1021๋ฒˆ: ํšŒ์ „ํ•˜๋Š” ํ

์ฒซ์งธ ์ค„์— ํ์˜ ํฌ๊ธฐ N๊ณผ ๋ฝ‘์•„๋‚ด๋ ค๊ณ  ํ•˜๋Š” ์ˆ˜์˜ ๊ฐœ์ˆ˜ M์ด ์ฃผ์–ด์ง„๋‹ค. N์€ 50๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๊ณ , M์€ N๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” ์ง€๋ฏผ์ด๊ฐ€ ๋ฝ‘์•„๋‚ด๋ ค๊ณ  ํ•˜๋Š” ์ˆ˜์˜ ์œ„์น˜๊ฐ€

www.acmicpc.net


๐Ÿ”น ๋ฌธ์ œ ๐Ÿ”น

์ง€๋ฏผ์ด๋Š” N๊ฐœ์˜ ์›์†Œ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ์–‘๋ฐฉํ–ฅ ์ˆœํ™˜ ํ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
์ง€๋ฏผ์ด๋Š” ์ด ํ์—์„œ ๋ช‡ ๊ฐœ์˜ ์›์†Œ๋ฅผ ๋ฝ‘์•„๋‚ด๋ ค๊ณ  ํ•œ๋‹ค.
์ง€๋ฏผ์ด๋Š” ์ด ํ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ 3๊ฐ€์ง€ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
  1. ์ฒซ ๋ฒˆ์งธ ์›์†Œ๋ฅผ ๋ฝ‘์•„๋‚ธ๋‹ค. ์ด ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋ฉด, ์›๋ž˜ ํ์˜ ์›์†Œ๊ฐ€ a1, ..., ak์ด์—ˆ๋˜ ๊ฒƒ์ด a2, ..., ak์™€ ๊ฐ™์ด ๋œ๋‹ค.
  2. ์™ผ์ชฝ์œผ๋กœ ํ•œ ์นธ ์ด๋™์‹œํ‚จ๋‹ค. ์ด ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋ฉด, a1, ..., ak๊ฐ€ a2, ..., ak, a1์ด ๋œ๋‹ค.
  3. ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ•œ ์นธ ์ด๋™์‹œํ‚จ๋‹ค. ์ด ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋ฉด, a1, ..., ak๊ฐ€ ak, a1, ..., ak-1์ด ๋œ๋‹ค.
ํ์— ์ฒ˜์Œ์— ํฌํ•จ๋˜์–ด ์žˆ๋˜ ์ˆ˜ N์ด ์ฃผ์–ด์ง„๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ง€๋ฏผ์ด๊ฐ€ ๋ฝ‘์•„๋‚ด๋ ค๊ณ  ํ•˜๋Š” ์›์†Œ์˜ ์œ„์น˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (์ด ์œ„์น˜๋Š” ๊ฐ€์žฅ ์ฒ˜์Œ ํ์—์„œ์˜ ์œ„์น˜์ด๋‹ค.)
์ด๋•Œ, ๊ทธ ์›์†Œ๋ฅผ ์ฃผ์–ด์ง„ ์ˆœ์„œ๋Œ€๋กœ ๋ฝ‘์•„๋‚ด๋Š”๋ฐ ๋“œ๋Š” 2๋ฒˆ, 3๋ฒˆ ์—ฐ์‚ฐ์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

๐Ÿ”น ์ž…๋ ฅ ๐Ÿ”น

์ฒซ์งธ ์ค„์— ํ์˜ ํฌ๊ธฐ N๊ณผ ๋ฝ‘์•„๋‚ด๋ ค๊ณ  ํ•˜๋Š” ์ˆ˜์˜ ๊ฐœ์ˆ˜ M์ด ์ฃผ์–ด์ง„๋‹ค.
N์€ 50๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๊ณ , M์€ N๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค.
๋‘˜์งธ ์ค„์—๋Š” ์ง€๋ฏผ์ด๊ฐ€ ๋ฝ‘์•„๋‚ด๋ ค๊ณ  ํ•˜๋Š” ์ˆ˜์˜ ์œ„์น˜๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค.
์œ„์น˜๋Š” 1๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , N๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค.

๐Ÿ”น ์ถœ๋ ฅ ๐Ÿ”น

์ฒซ์งธ ์ค„์— ๋ฌธ์ œ์˜ ์ •๋‹ต์„ ์ถœ๋ ฅํ•œ๋‹ค.

 


๐Ÿ”ธ ๋ฌธ์ œ ๋ถ„์„ ๐Ÿ”ธ

์–‘๋ฐฉํ–ฅ ์ˆœํ™˜ ํ๋ฅผ ํ™œ์šฉํ•œ ๋ฌธ์ œ์ด๋‹ค. ํ•˜์ง€๋งŒ ์—ฐ์‚ฐ์€ ํ์˜ ๋งจ ์•ž ์›์†Œ์˜ ์ œ๊ฑฐ๋งŒ ์ˆ˜ํ–‰ํ•œ๋‹ค.

ํ๋Š” ์ขŒ์šฐ๋กœ ์›์†Œ์˜ ์‰ฌํ”„ํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค. ๋ฐฐ์—ด, vector ๋ชจ๋‘ ํ’€์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ vector๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

๐Ÿ”ธ ์ฝ”๋“œ ๐Ÿ”ธ

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

int main(void) {
	int N, M, answer = 0;
	cin >> N >> M;

	vector<int> que(N);	//ํ๋กœ ์‚ฌ์šฉํ•  vector

	for (int i = 0; i < N; i++)	//ํ์— 1~N ๊ฐ’ ๋„ฃ์–ด์ฃผ๊ธฐ
		que[i] = i + 1;

	int size = N, pick, idx, temp;	//ํ˜„์žฌ ํ์˜ ํฌ๊ธฐ, ์ฐพ๋Š” ๊ฐ’, ์ฐพ๋Š” ๊ฐ’์˜ ์ธ๋ฑ์Šค, ์ž„์‹œ ๋ณ€์ˆ˜

	for (int i = 0; i < M; i++) {
		cin >> pick;	//์ฐพ๋Š” ๊ฐ’
		idx = find(que.begin(), que.end(), pick) - que.begin();	//์ฐพ๋Š” ๊ฐ’์˜ ์ธ๋ฑ์Šค

		//์ถœ๋ ฅ ํ…Œ์ŠคํŠธ
		/*cout << "\nque : ";
		for (int j : que) {
			cout << j << " ";
		}
		cout << "\npic : " << pick << "  idx : " << idx << endl;*/
		
		while (true) {
			if (que.front() == pick) {	//๊ฐ’์„ ์ฐพ์Œ
				que.erase(que.begin());
				size--;
				break;
			}
			if (idx <= size / 2) {		//ํ๋ฅผ ์™ผ์ชฝ์œผ๋กœ ๋ฐ€๊ธฐ
				temp = que.front();
				que.erase(que.begin());
				que.push_back(temp);
			}
			else {						//ํ๋ฅผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋ฐ€๊ธฐ
				temp = que.back();
				que.erase(que.end()-1);
				que.insert(que.begin(), temp);
			}
			answer++;
		}
	}
	cout << answer;
	return 0;
}

๐Ÿ”ธ ์ฝ”๋“œ ํ•ด์„ ๐Ÿ”ธ

vector<int> que(N);	//ํ๋กœ ์‚ฌ์šฉํ•  vector

intํ˜• vector๋ฅผ ์–‘๋ฐฉํ–ฅ ํ๋กœ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

 

for (int i = 0; i < N; i++)	//ํ์— 1~N ๊ฐ’ ๋„ฃ์–ด์ฃผ๊ธฐ
	que[i] = i + 1;

๋ฌธ์ œ์—์„œ๋Š” ์„ค๋ช…์ด ๋ถ€์กฑํ–ˆ์ง€๋งŒ, ํ๋Š” ์ž๋™์œผ๋กœ 1~N ๊นŒ์ง€์˜ ๊ฐ’์ด ์ž…๋ ฅ๋œ๋‹ค.

(์›๋ž˜ ์ฐพ๋Š” ๊ฐ’์€ ์ฒ˜์Œ ํ ์ƒํƒœ์˜ ์›์†Œ์˜ ์œ„์น˜์ด๊ธฐ ๋•Œ๋ฌธ)

 

cin >> pick;	//์ฐพ๋Š” ๊ฐ’
idx = find(que.begin(), que.end(), pick) - que.begin();	//์ฐพ๋Š” ๊ฐ’์˜ ์ธ๋ฑ์Šค

์ฐพ๋Š” ๊ฐ’์„ ์ž…๋ ฅ๋ฐ›์œผ๋ฉด, ๊ทธ ๊ฐ’์˜ ํ˜„์žฌ ์ธ๋ฑ์Šค๋ฅผ ํ™•์ธํ•œ๋‹ค.

 

while (true) {
	if (que.front() == pick) {	//๊ฐ’์„ ์ฐพ์Œ
		que.erase(que.begin());
		size--;
		break;
	}
	if (idx <= size / 2) {		//ํ๋ฅผ ์™ผ์ชฝ์œผ๋กœ ๋ฐ€๊ธฐ
		temp = que.front();
		que.erase(que.begin());
		que.push_back(temp);
	}
	else {						//ํ๋ฅผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋ฐ€๊ธฐ
		temp = que.back();
		que.erase(que.end()-1);
		que.insert(que.begin(), temp);
	}
	answer++;
}

ํ์˜ ์ฒ˜์Œ ๊ฐ’์ด ์ฐพ๋Š” ๊ฐ’๊ณผ ๊ฐ™์œผ๋ฉด ์ œ๊ฑฐํ•œ๋‹ค. (ํ์˜ ๋งจ ์•ž์—์„œ๋งŒ pop์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ)

์•„๋‹ˆ๋ผ๋ฉด, ํ˜„์žฌ ์ธ๋ฑ์Šค๋ฅผ ํ™•์ธํ•˜๊ณ  ๋” ๊ฐ€๊นŒ์šด ๋ฐฉํ–ฅ์œผ๋กœ ์‰ฌํ”„ํŠธ ํ•œ๋‹ค. (๋ฐ˜๋ณต)


๐Ÿ”ธ code review ๐Ÿ”ธ

  • A : fine๋ถ€๋ถ„์˜ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์„๊นŒ์š”?
    • find ์‚ฌ์šฉ ํ•˜์‹ค ๋•Œ, empty์— ๋Œ€ํ•œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€ ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    • find ํ–ˆ์„ ๋•Œ, ํ•ด๋‹น ์ž๋ฃŒ๊ฐ€ ์—†์œผ๋ฉด vector์˜ size๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. (์—„๋ฐ€ํžˆ ๋งํ•˜๋ฉด, vector์˜ end)
      • ํฌ์ธํ„ฐ ์—ฐ์‚ฐ์„ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—(vector์˜ begin ์ฃผ์†Œ๋ฅผ ๋บŒ) vector์˜ size๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒƒ.
if (idx == que.size()) {
    continue;
}
  • B : ์ผ๋ฐ˜์ (์‹ค๋ฌด์ )์œผ๋กœ ํƒ€๋‹นํ•œ ์˜๊ฒฌ์ด์ง€๋งŒ ์ด์™€ ๊ฐ™์ด ์ž…๋ ฅ์˜ ๋ฒ”์œ„์™€ ์กฐ๊ฑด์ด ๋ช…ํ™•ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œํ’€์ด์—์„œ๋Š” ์˜ˆ์ƒ ๋ถˆ๊ฐ€๋Šฅํ•œ ์˜ˆ์™ธ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋Ÿด ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋„ find์—์„œ๋Š” ์ฐพ๋Š” ๊ฐ’์ด ํ•ญ์ƒ ์žˆ์„ ์ˆ˜ ๋ฐ–์— ์—†๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฒ„ํ—ค๋“œ๋งŒ ์ฆ๊ฐ€ํ•  ๋ฟ ๋ฌด์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 

  • A : while๋ฌธ์— ์ฒซ if๋ฌธ์„ while๋ฌธ ์กฐ๊ฑด์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

๐Ÿ”ธ feedback code ๐Ÿ”ธ

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

int main(void) {
	int N, M, answer = 0;
	cin >> N >> M;

	vector<int> que(N);	//ํ๋กœ ์‚ฌ์šฉํ•  vector

	for (int i = 0; i < N; i++)	//ํ์— 1~N ๊ฐ’ ๋„ฃ์–ด์ฃผ๊ธฐ
		que[i] = i + 1;

	int size = N, pick, idx, temp;	//ํ˜„์žฌ ํ์˜ ํฌ๊ธฐ, ์ฐพ๋Š” ๊ฐ’, ์ฐพ๋Š” ๊ฐ’์˜ ์ธ๋ฑ์Šค, ์ž„์‹œ ๋ณ€์ˆ˜

	for (int i = 0; i < M; i++) {
		cin >> pick;	//์ฐพ๋Š” ๊ฐ’
		idx = find(que.begin(), que.end(), pick) - que.begin();	//์ฐพ๋Š” ๊ฐ’์˜ ์ธ๋ฑ์Šค
		
		while (que.front() != pick) { //์ฐพ๋Š” ๊ฐ’์ด ๋‚˜์˜ฌ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
			if (idx <= size / 2) {		//ํ๋ฅผ ์™ผ์ชฝ์œผ๋กœ ๋ฐ€๊ธฐ
				temp = que.front();
				que.erase(que.begin());
				que.push_back(temp);
			}
			else {						//ํ๋ฅผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋ฐ€๊ธฐ
				temp = que.back();
				que.erase(que.end()-1);
				que.insert(que.begin(), temp);
			}
			answer++;
		}
		que.erase(que.begin());
		size--;
	}
	cout << answer;
	return 0;
}

๐Ÿ”ธ end ๐Ÿ”ธ

์˜ค๋ฒ„ํ—ค๋“œ, ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋“ฑ์„ ์‹ ๊ฒฝ์“ฐ๋ฉด์„œ ์ฝ”๋”ฉํ•˜๋ ค๋‹ˆ ์ƒˆ๋กญ๊ฒŒ ์‹ ๊ฒฝ์จ์•ผ ํ•  ๋ถ€๋ถ„์ด ๋งŽ์•„์ง„ ๊ฒƒ ๊ฐ™๋‹ค.

์•„์ง ์ต์ˆ™ํ•˜์ง€ ์•Š์•„์„œ ๊ทธ๋Ÿฐ ๊ฒƒ ๊ฐ™์€๋ฐ, ์ข‹์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ธฐ ์œ„ํ•ด์„œ ๋” ์ฒ ์ €ํžˆ ๋”ฐ์ ธ๋ณด์•„์•ผ ๊ฒ ๋‹ค.

 

 

 

728x90