Hello Ocean! ๐ŸŒผ

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/C++] ํฌ๋ ˆ์ธ ์ธํ˜•๋ฝ‘๊ธฐ ๊ฒŒ์ž„ ๋ณธ๋ฌธ

Algorithm

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/C++] ํฌ๋ ˆ์ธ ์ธํ˜•๋ฝ‘๊ธฐ ๊ฒŒ์ž„

bba_dda 2020. 12. 29. 23:56
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ ์„ค๋ช…

๊ฒŒ์ž„๊ฐœ๋ฐœ์ž์ธ ์ฃ ๋ฅด๋””๋Š” ํฌ๋ ˆ์ธ ์ธํ˜•๋ฝ‘๊ธฐ ๊ธฐ๊ณ„๋ฅผ ๋ชจ๋ฐ”์ผ ๊ฒŒ์ž„์œผ๋กœ ๋งŒ๋“ค๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
์ฃ ๋ฅด๋””๋Š” ๊ฒŒ์ž„์˜ ์žฌ๋ฏธ๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด ํ™”๋ฉด ๊ตฌ์„ฑ๊ณผ ๊ทœ์น™์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฒŒ์ž„ ๋กœ์ง์— ๋ฐ˜์˜ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๊ฒŒ์ž„ ํ™”๋ฉด์€ 1 x 1 ํฌ๊ธฐ์˜ ์นธ๋“ค๋กœ ์ด๋ฃจ์–ด์ง„ N x N ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐ ๊ฒฉ์ž์ด๋ฉฐ ์œ„์ชฝ์—๋Š” ํฌ๋ ˆ์ธ์ด ์žˆ๊ณ  ์˜ค๋ฅธ์ชฝ์—๋Š” ๋ฐ”๊ตฌ๋‹ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. (์œ„ ๊ทธ๋ฆผ์€ 5 x 5 ํฌ๊ธฐ์˜ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค). ๊ฐ ๊ฒฉ์ž ์นธ์—๋Š” ๋‹ค์–‘ํ•œ ์ธํ˜•์ด ๋“ค์–ด ์žˆ์œผ๋ฉฐ ์ธํ˜•์ด ์—†๋Š” ์นธ์€ ๋นˆ์นธ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์ธํ˜•์€ 1 x 1 ํฌ๊ธฐ์˜ ๊ฒฉ์ž ํ•œ ์นธ์„ ์ฐจ์ง€ํ•˜๋ฉฐ ๊ฒฉ์ž์˜ ๊ฐ€์žฅ ์•„๋ž˜ ์นธ๋ถ€ํ„ฐ ์ฐจ๊ณก์ฐจ๊ณก ์Œ“์—ฌ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ์‚ฌ์šฉ์ž๋Š” ํฌ๋ ˆ์ธ์„ ์ขŒ์šฐ๋กœ ์›€์ง์—ฌ์„œ ๋ฉˆ์ถ˜ ์œ„์น˜์—์„œ ๊ฐ€์žฅ ์œ„์— ์žˆ๋Š” ์ธํ˜•์„ ์ง‘์–ด ์˜ฌ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง‘์–ด ์˜ฌ๋ฆฐ ์ธํ˜•์€ ๋ฐ”๊ตฌ๋‹ˆ์— ์Œ“์ด๊ฒŒ ๋˜๋Š” ๋ฐ, ์ด๋•Œ ๋ฐ”๊ตฌ๋‹ˆ์˜ ๊ฐ€์žฅ ์•„๋ž˜ ์นธ๋ถ€ํ„ฐ ์ธํ˜•์ด ์ˆœ์„œ๋Œ€๋กœ ์Œ“์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ทธ๋ฆผ์€ [1๋ฒˆ, 5๋ฒˆ, 3๋ฒˆ] ์œ„์น˜์—์„œ ์ˆœ์„œ๋Œ€๋กœ ์ธํ˜•์„ ์ง‘์–ด ์˜ฌ๋ ค ๋ฐ”๊ตฌ๋‹ˆ์— ๋‹ด์€ ๋ชจ์Šต์ž…๋‹ˆ๋‹ค.

๋งŒ์•ฝ ๊ฐ™์€ ๋ชจ์–‘์˜ ์ธํ˜• ๋‘ ๊ฐœ๊ฐ€ ๋ฐ”๊ตฌ๋‹ˆ์— ์—ฐ์†ํ•ด์„œ ์Œ“์ด๊ฒŒ ๋˜๋ฉด ๋‘ ์ธํ˜•์€ ํ„ฐ๋œจ๋ ค์ง€๋ฉด์„œ ๋ฐ”๊ตฌ๋‹ˆ์—์„œ ์‚ฌ๋ผ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์œ„ ์ƒํƒœ์—์„œ ์ด์–ด์„œ [5๋ฒˆ] ์œ„์น˜์—์„œ ์ธํ˜•์„ ์ง‘์–ด ๋ฐ”๊ตฌ๋‹ˆ์— ์Œ“์œผ๋ฉด ๊ฐ™์€ ๋ชจ์–‘ ์ธํ˜• ๋‘ ๊ฐœ๊ฐ€ ์—†์–ด์ง‘๋‹ˆ๋‹ค.

ํฌ๋ ˆ์ธ ์ž‘๋™ ์‹œ ์ธํ˜•์ด ์ง‘์–ด์ง€์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋Š” ์—†์œผ๋‚˜ ๋งŒ์•ฝ ์ธํ˜•์ด ์—†๋Š” ๊ณณ์—์„œ ํฌ๋ ˆ์ธ์„ ์ž‘๋™์‹œํ‚ค๋Š” ๊ฒฝ์šฐ์—๋Š” ์•„๋ฌด๋Ÿฐ ์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฐ”๊ตฌ๋‹ˆ๋Š” ๋ชจ๋“  ์ธํ˜•์ด ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์„ ๋งŒํผ ์ถฉ๋ถ„ํžˆ ํฌ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. (๊ทธ๋ฆผ์—์„œ๋Š” ํ™”๋ฉดํ‘œ์‹œ ์ œ์•ฝ์œผ๋กœ 5์นธ๋งŒ์œผ๋กœ ํ‘œํ˜„ํ•˜์˜€์Œ)

๊ฒŒ์ž„ ํ™”๋ฉด์˜ ๊ฒฉ์ž์˜ ์ƒํƒœ๊ฐ€ ๋‹ด๊ธด 2์ฐจ์› ๋ฐฐ์—ด board์™€ ์ธํ˜•์„ ์ง‘๊ธฐ ์œ„ํ•ด ํฌ๋ ˆ์ธ์„ ์ž‘๋™์‹œํ‚จ ์œ„์น˜๊ฐ€ ๋‹ด๊ธด ๋ฐฐ์—ด moves๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ํฌ๋ ˆ์ธ์„ ๋ชจ๋‘ ์ž‘๋™์‹œํ‚จ ํ›„ ํ„ฐํŠธ๋ ค์ ธ ์‚ฌ๋ผ์ง„ ์ธํ˜•์˜ ๊ฐœ์ˆ˜๋ฅผ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.

[์ œํ•œ์‚ฌํ•ญ]

  • board ๋ฐฐ์—ด์€ 2์ฐจ์› ๋ฐฐ์—ด๋กœ ํฌ๊ธฐ๋Š” 5 x 5 ์ด์ƒ 30 x 30 ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • board์˜ ๊ฐ ์นธ์—๋Š” 0 ์ด์ƒ 100 ์ดํ•˜์ธ ์ •์ˆ˜๊ฐ€ ๋‹ด๊ฒจ์žˆ์Šต๋‹ˆ๋‹ค.
    • 0์€ ๋นˆ ์นธ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
    • 1 ~ 100์˜ ๊ฐ ์ˆซ์ž๋Š” ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์ธํ˜•์˜ ๋ชจ์–‘์„ ์˜๋ฏธํ•˜๋ฉฐ ๊ฐ™์€ ์ˆซ์ž๋Š” ๊ฐ™์€ ๋ชจ์–‘์˜ ์ธํ˜•์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • moves ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋Š” 1 ์ด์ƒ 1,000 ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • moves ๋ฐฐ์—ด ๊ฐ ์›์†Œ๋“ค์˜ ๊ฐ’์€ 1 ์ด์ƒ์ด๋ฉฐ board ๋ฐฐ์—ด์˜ ๊ฐ€๋กœ ํฌ๊ธฐ ์ดํ•˜์ธ ์ž์—ฐ์ˆ˜์ž…๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ

board moves result
[[0,0,0,0,0],[0,0,1,0,3],[0,2,5,0,1],[4,2,4,4,2],[3,5,1,3,1]] [1,5,3,5,1,2,1,4] 4

์ž…์ถœ๋ ฅ ์˜ˆ ์„ค๋ช…

์ธํ˜•์˜ ์ฒ˜์Œ ์ƒํƒœ๋Š” ๋ฌธ์ œ์— ์ฃผ์–ด์ง„ ์˜ˆ์‹œ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํฌ๋ ˆ์ธ์ด [1, 5, 3, 5, 1, 2, 1, 4] ๋ฒˆ ์œ„์น˜์—์„œ ์ฐจ๋ก€๋Œ€๋กœ ์ธํ˜•์„ ์ง‘์–ด์„œ ๋ฐ”๊ตฌ๋‹ˆ์— ์˜ฎ๊ฒจ ๋‹ด์€ ํ›„, ์ƒํƒœ๋Š” ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์œผ๋ฉฐ ๋ฐ”๊ตฌ๋‹ˆ์— ๋‹ด๋Š” ๊ณผ์ •์—์„œ ํ„ฐํŠธ๋ ค์ ธ ์‚ฌ๋ผ์ง„ ์ธํ˜•์€ 4๊ฐœ ์ž…๋‹ˆ๋‹ค.

ํ’€์ด

1. ์ž…๋ ฅ๋˜๋Š” board ๋ฐฐ์—ด ํ˜•ํƒœ ์œ ์˜ํ•˜๊ธฐ 

  • ์ฒ˜์Œ์— board๋ฐฐ์—ด์˜ ์—ด๋“ค์ด ํ•˜๋‚˜์˜ vector๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ, board[i] = ํ•˜๋‚˜์˜ column์ด๋ผ๊ณ  ๋ณด๊ณ , ๊ฐ column vector๋“ค์„ ํ•˜๋‚˜์˜ stack์ฒ˜๋Ÿผ ์ด์šฉํ•ด์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋”ฉํ–ˆ๋‹ค.
  • ํ•˜์ง€๋งŒ ์ด๋Š” ์™„์ „ํžˆ ์ž˜๋ชป๋œ ์ ‘๊ทผ์ด์—ˆ๋‹ค. ์ž…๋ ฅ๋˜๋Š” board ๋ฐฐ์—ด์˜ 2์ฐจ์› ํ˜•ํƒœ๋ฅผ ์œ ์‹ฌํžˆ ์‚ดํŽด๋ณด๋‹ˆ, board[i]๋Š” ๋‹น์—ฐํ•˜๊ฒŒ๋„ ํ•˜๋‚˜์˜ 'ํ–‰'์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ ‘๊ทผ์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 
  • ์ „์น˜๋ฅผ ์ด์šฉํ•ด์„œ ๊ธฐ์กด์— board[i]๋ฅผ ํ•˜๋‚˜์˜ stack์ฒ˜๋Ÿผ ์ด์šฉํ•ด๋ณด๋ ค๊ณ  ํ–ˆ์œผ๋‚˜, ์›ํ•˜๋Š”๋Œ€๋กœ ์ž˜ ๋˜์ง€ ์•Š์•„ stack์€ board์—์„œ ๊ฐ€์ ธ์˜จ ์ธํ˜•์„ ๋‹ด๋Š”๋ฐ์—๋งŒ ์‚ฌ์šฉํ•˜๊ณ , board์—์„œ ์ธํ˜•์„ ์„ ํƒํ•˜๋Š” ๋ถ€๋ถ„์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•œ ์ ‘๊ทผ๋ฐฉ์‹์„ ์ด์šฉํ–ˆ๋‹ค. 
int solution(vector<vector<int>> board, vector<int> moves) {
	int answer = 0;
	int index,temp;
	vector<int> basket;

	for (int i = 0;i < moves.size();i++) {
		index = moves[i]-1;
		temp = 0;
		vector<int> column = board[index];
		cout << 1 << endl;
		while (board[index].size() > 0) {
			temp = board[index].back(); //๋ฌธ์ œ ๋ถ€๋ถ„
			board[index].pop_back();
			if (temp != 0)
				break;
		}
		if (temp != 0) {
			if (basket.size() <= 0) {
				basket.push_back(temp);
			}	
			else {
				if (basket.back() == temp) {
					basket.pop_back();
					answer++;
				}
				else {
					basket.push_back(temp);
				}
			}
		}
	}
	return answer;
}

2. ํ•ด๋‹น ์—ด์— ์„ ํƒํ•  ์ธํ˜•์ด ์—†๋Š” ๊ฒฝ์šฐ ์•„๋ฌด์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค 

  • board์—์„œ ์ธํ˜•์„ ์„ ํƒํ•  ๋•Œ, ์„ ํƒํ•œ ํ›„์— ํ•ด๋‹น ์นธ์˜ ๊ฐ’์€ ๊ทธ๋Œ€๋กœ ๋‘๊ณ , ํ•ด๋‹น ์—ด์˜ ๊ผญ๋Œ€๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” top[c]๊ฐ’์„ ๋ฐ”๊พธ์–ด ์ด์šฉํ–ˆ๋‹ค.
  • ์ด ๊ณผ์ •์—์„œ ํ•ด๋‹น ์—ด์˜ ๋งˆ์ง€๋ง‰ ์ธํ˜•์„ ์„ ํƒํ•  ๋•Œ, ์ดํ›„์— ์ธ๋ฑ์Šค ์ ‘๊ทผ ์˜ค๋ฅ˜๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด if๋ฌธ์„ ์ด์šฉํ•ด์„œ top์ด n๋ณด๋‹ค ์ปค์ง€์ง€ ์•Š๋„๋ก (๋ฒ”์œ„๋ฅผ ๋„˜์–ด๊ฐ€์ง€ ์•Š๋„๋ก) ์กฐ์ •ํ–ˆ๋Š”๋ฐ, ์ด๊ฒƒ์œผ๋กœ ์ธํ•ด ํ•ด๋‹น ์—ด์˜ ๋งˆ์ง€๋ง‰ ์ธํ˜•์ด ๊ณ„์†ํ•ด์„œ ์„ ํƒ๋˜๋Š” ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ฒผ๋‹ค. 
  • ๋”ฐ๋ผ์„œ board์—์„œ ์ธํ˜•์„ ์„ ํƒํ•  ๋•Œ, ์„ ํƒํ•œ ํ›„์— ํ•ด๋‹น ์นธ์˜ ๊ฐ’์„ 0์œผ๋กœ ๋ฐ”๊พธ๋Š” ๋ถ€๋ถ„์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

์ตœ์ข… ์ฝ”๋“œ

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

int solution(vector<vector<int>> board, vector<int> moves) {
	int answer = 0;
	int index,temp;
	vector<int> basket;
	vector<int> top(board.size(), 0);
	
	for (int j = 0;j < board.size();j++) {
		for (int i = board.size()-1;i >=0;i--) {
			if (board[i][j] != 0)
				top[j] = i;
		}
	}
	for (int i = 0;i < moves.size();i++) {
		index = moves[i] -1;
		temp = 0;
		vector<int> column = board[index];
		temp = board[top[index]][index];
        board[top[index]][index] = 0;
		if (top[index] < board.size()-1)
			top[index]++;
		if (temp != 0) {
			if (basket.size() <= 0) {
				basket.push_back(temp);
			}	
			else {
				if (basket.back() == temp) {
					basket.pop_back();
					answer++;
				}
				else {
					basket.push_back(temp);
				}
			}
		}
	}
	return answer*2;
}

 

์ถ”๊ฐ€  

  • vector.pop_back()์˜ return๊ฐ’์€ ์—†๋‹ค! (void)์ด๋‹ค. pop๋˜๋Š” ๊ฐ’์„ ์–ป๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ, vector.back()์œผ๋กœ ๋งˆ์ง€๋ง‰ ๊ฐ’์„ ๋ฐ›์•„์˜จ ํ›„, pop_back()ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. 
  • ์ž…์ถœ๋ ฅ ํ˜•ํƒœ๋ฅผ ๋ถ„์„ํ•œ ํ›„์— ๋ฌธ์ œ๋ฅผ ํ’€์ž.
๋ฐ˜์‘ํ˜•