๋žœ๋ค ์ฝ”๋“œ ๋””ํŽœ์Šค
ย - Last update: 2023-06-27

๋žœ๋ค ์ฝ”๋“œ ๋ถ„์„ํ•˜๊ธฐ

Puzzle Game

๋ฌธ์ œ ๊ฐœ์š”: 5๊ฐœ๋กœ ๋œ stack์ด ๋“ค์–ด์˜ด, ๋‘๊ฐ€์ง€ method๊ฐ€ ์กด์žฌํ•จ

  • addToRight: ์˜ค๋ฅธ์ชฝ์— stack์„ ๋ถ™์ž„
  • matchStack: stack์„ ๋’ค์ง‘์–ด์„œ ๋งž์ถฐ์ง€๋Š” ๋ถ€๋ถ„์ด ์žˆ๋Š” ๊ณณ์ด ์žˆ๋Š”์ง€ ํ™•์ธ. ๋งž์ถ˜ stack์€ ์‚ฌ๋ผ์ง„๋‹ค.
const int RA = (1<<20) - 1;
int HL, H[120020], hash[120020];
int spos[1<<20], visited[1<<20], mrk, ce;
void reset() {
HL = 0;
++mrk, ce = 0;
}
// cur์„ Hash์— ์ถ”๊ฐ€ํ•œ๋‹ค.
void append(int cur) {
if(HL) {
int prev = hash[HL - 1];
hash[HL] = (prev << 5 | (cur - prev + 10)) & RA; // ํ•ด์‹œ๊ฐ’ ๋งŒ๋“ค๊ธฐ (ํ•ด์‹œ๊ฐ€ ์•„๋‹ˆ์—ˆ๋‹ค!?)
// ํ•ด์‹œ๊ฐ’ ์ƒ์„ฑ ๋กœ์ง์ด ๋™์ž‘ํ•˜๋Š” ์ด์œ 
// 1) cur - prev๋Š” ์ตœ๋Œ€ -10 ~ 10์ด ๋  ์ˆ˜ ์žˆ๋‹ค.
// 2) ์—ฌ๊ธฐ์— 10์„ ๋”ํ•˜๋ฉด ์ตœ๋Œ€ 20
// 3) bit๋กœ ์ „ํ™˜ํ•˜๋ฉด 5๋น„ํŠธ ์•ˆ์— ๋“ค์–ด๊ฐ
// 4) ์ด ๋ธ”๋ก์ˆ˜๋Š” 5๊ฐœ, ์ฐจ์ด๋ฅผ ๋ณด๋ฏ€๋กœ 4๊ฐœ๋ฅผ ๋ณด๋ฉด ๋จ
// 5) ์ฆ‰, ์ด 20bit
// 6) 20bit๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ฒ”์œ„๋กœ ํ™˜์‚ฐํ•˜๋ฉด 2^20 ์ด๊ณ , ์–ด๋ฆผ์žก์•„ 1MB๊ฐ€ ๋จ (2^10 = 1KB)
if(HL >= 4) {
visited[hash[HL]] = mrk; // visited ์ฒดํฌ์šฉ, ์‹ ๊ทœ๋กœ ๋งค์นญ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ํ‘œ์‹œ
spos[hash[HL]] = ++ce; // 5๊ฐœ์งœ๋ฆฌ ์‹œ์ž‘ ์œ„์น˜ ์ €์žฅ
}
}
H[HL++] = cur;
}
void addToRight(int mStack[]) {
for(int i = 0; i < 5; i++) {
append(mStack[i]);
}
}
int matchStack(int mStack[]) {
int v = 0;
for(int i = 3; i >= 0; i--) {
v = v << 5 | (mStack[i + 1] - mStack[i] + 10); // ํ•ด์‹œ๊ฐ’ ๋งŒ๋“ค๊ธฐ (ํ•ด์‹œ๊ฐ€ ์•„๋‹ˆ์—ˆ๋‹ค!?)
}
if(visited[v] != mrk) return -1; // ์—ฌ๊ธฐ๊นŒ์ง€ ์ด๋ฏธ ๋งค์นญ์€ ํŒ๋‹จ์ด ์™„๋ฃŒ ๋จ
// ์ด ์•„๋ž˜๋Š” ๋งค์นญ์ด ์™„๋ฃŒ๋˜์—ˆ๋‹จ ๊ฒƒ ์ „์ œ๋กœ, ๋งค์นญ๋œ ๋ถ€๋ถ„์„ ์ œ๊ฑฐํ•˜๋Š” ๋กœ์ง
int ansPos = spos[v]; // ์ด๊ฒŒ ๋‹ต์ž„
int oldEnd = HL;
HL = ansPos - 1;
// Hash๋ฅผ ๋‹ค์‹œ ๊ตฌ์„ฑํ•œ๋‹ค. (์ƒ๊ฐ๋ณด๋‹ค ๋‹ค์‹œ ๊ตฌ์„ฑํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์ด ๊ธธ๊ฒŒ ๊ฑธ๋ฆฌ์ง€๋Š” ์•Š๋Š” ๋“ฏ)
++mrk;
ce = 0;
for(register int i = 4; i + 1 < ansPos; i++) {
visited[hash[i]] = mrk;
spos[hash[i]] = ++ce;
}
for(register int i = ansPos + 4; i < oldEnd; i++) {
append(H[i]);
}
return x;
}
๐Ÿท๏ธ ์ฃผ์ œ ๋ชฉ๋ก: