- λ¬Έμ
μλμ΄λ μ΅κ·Όμ νμ΄μ λ°ν΄λ₯Ό ꡬ맀νλ€. μλμ΄λ λ°ν΄μ κ° μΉΈμ μνλ²³ λλ¬Έμλ₯Ό μλ κ·Έλ¦Όκ³Ό κ°μ΄ μ μλ€.
λ°ν΄μ κ°μ κΈμλ λ λ² μ΄μ λ±μ₯νμ§ μλλ€. λ, λ°ν΄λ μκ³λ°©ν₯μΌλ‘λ§ λμκ°λ€. λ°ν΄ μμλ νμ΄νκ° μλλ°, μ΄ νμ΄νλ νμ ν κ³³μ κ°λ¦¬ν€κ³ μμΌλ©°, λμκ°λ λμ κ°λ¦¬ν€λ κΈμλ λ°λκ² λλ€. μμ κ·Έλ¦Όμμλ 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 ν¨μλ₯Ό ν΅ν΄ κ·μΉ μλ°μ νμΈνκ³ κ·μΉμ μ΄κΈλμ§ μμΌλ©΄ μμ μΆλ ₯, κ·Έλ μ§ μμΌλ©΄ '!' μΆλ ₯