λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μ•Œκ³ λ¦¬μ¦˜ πŸ‘©πŸ»‍πŸ’»/λ°±μ€€

#2840

by flowing1ife 2023. 3. 17.
  • 문제

μƒλ•μ΄λŠ” μ΅œκ·Όμ— ν–‰μš΄μ˜ 바퀴λ₯Ό κ΅¬λ§€ν–ˆλ‹€. μƒλ•μ΄λŠ” λ°”ν€΄μ˜ 각 칸에 μ•ŒνŒŒλ²³ λŒ€λ¬Έμžλ₯Ό μ•„λž˜ κ·Έλ¦Όκ³Ό 같이 μ μ—ˆλ‹€.

바퀴에 같은 κΈ€μžλŠ” 두 번 이상 λ“±μž₯ν•˜μ§€ μ•ŠλŠ”λ‹€. 또, λ°”ν€΄λŠ” μ‹œκ³„λ°©ν–₯으둜만 λŒμ•„κ°„λ‹€. 바퀴 μ˜†μ—λŠ” ν™”μ‚΄ν‘œκ°€ μžˆλŠ”λ°, 이 ν™”μ‚΄ν‘œλŠ” 항상 ν•œ 곳을 가리킀고 있으며, λŒμ•„κ°€λŠ” λ™μ•ˆ κ°€λ¦¬ν‚€λŠ” κΈ€μžλŠ” λ°”λ€Œκ²Œ λœλ‹€. μœ„μ˜ κ·Έλ¦Όμ—μ„œλŠ” Hλ₯Ό 가리킀고 μžˆλ‹€.

μƒλ•μ΄λŠ” 바퀴λ₯Ό μ—°μ†ν•΄μ„œ K번 돌릴 것이닀. 맀번 바퀴λ₯Ό 돌릴 λ•Œ λ§ˆλ‹€, μƒλ•μ΄λŠ” ν™”μ‚΄ν‘œκ°€ κ°€λ¦¬ν‚€λŠ” κΈ€μžκ°€ λ³€ν•˜λŠ” νšŸμˆ˜μ™€ μ–΄λ–€ κΈ€μžμ—μ„œ νšŒμ „μ„ λ©ˆμΆ”μ—ˆλŠ”μ§€λ₯Ό 쒅이에 μ λŠ”λ‹€.

ν¬μ›μ΄λŠ” 상덕이가 적어놓은 쒅이λ₯Ό λ°œκ²¬ν–ˆλ‹€. κ·Έ 쒅이λ₯Ό λ°”νƒ•μœΌλ‘œ 상덕이가 바퀴에 적은 μ•ŒνŒŒλ²³μ„ μ•Œμ•„λ‚΄λ €κ³  ν•œλ‹€.

상덕이가 쒅이에 적어놓은 λ‚΄μš©κ³Ό λ°”ν€΄μ˜ 칸의 μˆ˜κ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, 바퀴에 적어놓은 μ•ŒνŒŒλ²³μ„ μ•Œμ•„λ‚΄λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

  • μ½”λ“œ
#include <iostream>
#include <vector>
#include <stack>
#include <algorithm>

using namespace std;

bool fillPattern(int n, int k, stack<int>& num, stack<char>& alp, vector<char>& result) {
	result.assign(n, '?'); //μΉΈ 수 만큼 λ§Œλ“€κΈ°
	int tip = 0; // pointer
	int j; // 같은 κΈ€μžκ°€ μœ„μΉ˜ν•œ 자리
	
	result[tip] = alp.top();
	alp.pop();

	for (int i = 1; i < k; i++) {
		tip = (tip + num.top()) % n ; // pointer 이동
		num.pop();


		if (find(result.begin(), result.end(), alp.top()) != result.end()) { //이미 ν•΄λ‹Ή κΈ€μžκ°€ vector에 λ“€μ–΄κ°€ μžˆλŠ” μƒνƒœλΌλ©΄ 
			for (j = 0; j < n; j++) {
				if (result[j] == alp.top()) { //같은 κΈ€μžκ°€ μœ„μΉ˜ν•œ 자리λ₯Ό νŒŒμ•…
					break;
				}
			}
			if (j == tip) { //같은 μžλ¦¬μ— μœ„μΉ˜ν•œλ‹€λ©΄ λ„˜μ–΄κ°
				alp.pop();
				continue;
			}
			else { // 같은 μžλ¦¬μ— μœ„μΉ˜ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ 같은 κΈ€μžκ°€ 두 번 이상 λ“±μž₯
				return false;
			}
		}

		if (result[tip] == '?') {
			//μƒˆλ‘œμš΄ κΈ€μžλΌλ©΄ λ„£μŒ
			result[tip] = alp.top();
			alp.pop();
		}
		else { //이미 같은 μœ„μΉ˜μ— λ‹€λ₯Έ κΈ€μžκ°€ μ±„μ›Œμ Έ μžˆλŠ” κ²ƒμ΄λ―€λ‘œ 
			return false;
		}
	}

	return true;
}



int main()
{
	int n, k; //λ°”ν€΄μ˜ 칸의 수, 상덕이가 바퀴λ₯Ό λŒλ¦¬λŠ” 횟수
	int s; // κΈ€μžκ°€ 바뀐 횟수
	char c; // νšŒμ „μ„ λ©ˆμΆ”μ—ˆμ„ λ•Œ κ°€λ¦¬ν‚€λ˜ κΈ€μž
	stack<int> num; //κΈ€μžκ°€ 바뀐 횟수λ₯Ό μ €μž₯ν•œ λ°°μ—΄
	stack<char> alp; //νšŒμ „μ„ λ©ˆμΆ”μ—ˆμ„ λ•Œ κ°€λ¦¬ν‚€λ˜ κΈ€μžλ₯Ό μ €μž₯ν•œ λ°°μ—΄
	vector<char> result; // κ²°κ³Όλ₯Ό μ €μž₯

	//μž…λ ₯
	cin >> n >> k;

	for (int i = 0; i < k; i++) {
		cin >> s >> c;
		num.push(s);
		alp.push(c);
	}

	//μ—°μ‚° 및 좜λ ₯

	if (fillPattern(n, k, num, alp, result)) {
		for (int i = 0; i < n; i++) {
			cout << result[i];
		}
	}
	else {
		cout << "!";
	}

	return 0;
}
  • ν•΄μ„€

1. fillPattern ν•¨μˆ˜

- μ›νŒμ˜ 칸을 μ±„μš°λŠ” ν•¨μˆ˜

: μœ μΆ”κ°€ λΆˆκ°€λŠ₯ν•œ 곳은 '?'둜 μ„€μ •ν•˜κΈ° μœ„ν•΄ result의 μ΄ˆκΈ°κ°’μ„ '?'둜 μ„€μ •

: λ’€μ—μ„œλΆ€ν„° μœ μΆ”λ₯Ό ν•˜κΈ° μœ„ν•΄ alp의 topμ›μ†Œλ₯Ό result[0]에닀 μ €μž₯

: k회 λ°˜λ³΅ν•˜λ©° 연산을 μ‹œμž‘

: μ›νŒμ΄κΈ° λ•Œλ¬Έμ— queue처럼 pointer μžλ¦¬μ— num의 topμ›μ†Œλ₯Ό λ”ν•˜κ³  이λ₯Ό n으둜 λ‚˜λˆ„μ—ˆμ„ λ•Œμ˜ λ‚˜λ¨Έμ§€λ‘œ tip을 이동

: 이미 ν•΄λ‹Ή κΈ€μžκ°€ vector에 λ“€μ–΄κ°€ μžˆλŠ” μƒνƒœλΌλ©΄ 같은 κΈ€μžκ°€ μœ„μΉ˜ν•œ 자리λ₯Ό μ°Ύμ•„μ„œ 이게 pointer의 μœ„μΉ˜μ™€ κ°™λ‹€λ©΄ κ·Έλƒ₯ λ„˜μ–΄κ°

: κ°™μ§€ μ•Šλ‹€λ©΄ κ·œμΉ™μ— μ–΄κΈ‹λ‚˜λ―€λ‘œ return false

: λ§Œμ•½ μƒˆλ‘œμš΄ κΈ€μžλΌλ©΄ pointer μœ„μΉ˜μ— κΈ€μžλ₯Ό λ„£μŒ 

: κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ 이미 같은 μœ„μΉ˜μ— λ‹€λ₯Έ κΈ€μžκ°€ μ±„μ›Œμ Έ μžˆλŠ” κ²ƒμ΄λ―€λ‘œ κ·œμΉ™μ— μ–΄κΈ‹λ‚˜ return false

: μœ„ 과정을 λͺ¨λ‘ ν†΅κ³Όν•˜λ©΄ κ·œμΉ™ μœ„λ°˜μ— ν•΄λ‹Ήλ˜μ§€ μ•ŠμœΌλ―€λ‘œ return true

 

2. main ν•¨μˆ˜

: numκ³Ό alpλ₯Ό μŠ€νƒμ— λ°›μŒ

: fillPattern ν•¨μˆ˜λ₯Ό 톡해 κ·œμΉ™ μœ„λ°˜μ„ ν™•μΈν•˜κ³  κ·œμΉ™μ— μ–΄κΈ‹λ‚˜μ§€ μ•ŠμœΌλ©΄ μ›μ†Œ 좜λ ₯, κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ '!' 좜λ ₯

'μ•Œκ³ λ¦¬μ¦˜ πŸ‘©πŸ»β€πŸ’» > λ°±μ€€' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

#2981  (0) 2023.03.17
#6588  (1) 2023.03.17
#1735  (0) 2023.03.17
#10757  (0) 2023.03.05
#20126  (0) 2023.03.03