BOJ 14891. ํฑ๋๋ฐํด
๐โโ๏ธ[Gold V] ํฑ๋๋ฐํด - 14891
์ฑ๋ฅ ์์ฝ
๋ฉ๋ชจ๋ฆฌ: 2024 KB, ์๊ฐ: 0 ms
๋ถ๋ฅ
๊ตฌํ, ์๋ฎฌ๋ ์ด์
์ ์ถ ์ผ์
2024๋ 2์ 8์ผ 12:12:31
๋ฌธ์ ์ค๋ช
์ด 8๊ฐ์ ํฑ๋๋ฅผ ๊ฐ์ง๊ณ ์๋ ํฑ๋๋ฐํด 4๊ฐ๊ฐ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์ผ๋ ฌ๋ก ๋์ฌ์ ธ ์๋ค. ๋, ํฑ๋๋ N๊ทน ๋๋ S๊ทน ์ค ํ๋๋ฅผ ๋ํ๋ด๊ณ ์๋ค. ํฑ๋๋ฐํด์๋ ๋ฒํธ๊ฐ ๋งค๊ฒจ์ ธ ์๋๋ฐ, ๊ฐ์ฅ ์ผ์ชฝ ํฑ๋๋ฐํด๊ฐ 1๋ฒ, ๊ทธ ์ค๋ฅธ์ชฝ์ 2๋ฒ, ๊ทธ ์ค๋ฅธ์ชฝ์ 3๋ฒ, ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ํฑ๋๋ฐํด๋ 4๋ฒ์ด๋ค.
์ด๋, ํฑ๋๋ฐํด๋ฅผ ์ด K๋ฒ ํ์ ์ํค๋ ค๊ณ ํ๋ค. ํฑ๋๋ฐํด์ ํ์ ์ ํ ์นธ์ ๊ธฐ์ค์ผ๋ก ํ๋ค. ํ์ ์ ์๊ณ ๋ฐฉํฅ๊ณผ ๋ฐ์๊ณ ๋ฐฉํฅ์ด ์๊ณ , ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ํ์ ํ๋ค.
ํฑ๋๋ฐํด๋ฅผ ํ์ ์ํค๋ ค๋ฉด, ํ์ ์ํฌ ํฑ๋๋ฐํด์ ํ์ ์ํฌ ๋ฐฉํฅ์ ๊ฒฐ์ ํด์ผ ํ๋ค. ํฑ๋๋ฐํด๊ฐ ํ์ ํ ๋, ์๋ก ๋ง๋ฟ์ ๊ทน์ ๋ฐ๋ผ์ ์์ ์๋ ํฑ๋๋ฐํด๋ฅผ ํ์ ์ํฌ ์๋ ์๊ณ , ํ์ ์ํค์ง ์์ ์๋ ์๋ค. ํฑ๋๋ฐํด A๋ฅผ ํ์ ํ ๋, ๊ทธ ์์ ์๋ ํฑ๋๋ฐํด B์ ์๋ก ๋ง๋ฟ์ ํฑ๋์ ๊ทน์ด ๋ค๋ฅด๋ค๋ฉด, B๋ A๊ฐ ํ์ ํ ๋ฐฉํฅ๊ณผ ๋ฐ๋๋ฐฉํฅ์ผ๋ก ํ์ ํ๊ฒ ๋๋ค. ์๋ฅผ ๋ค์ด, ์๋์ ๊ฐ์ ๊ฒฝ์ฐ๋ฅผ ์ดํด๋ณด์.
๋ ํฑ๋๋ฐํด์ ๋ง๋ฟ์ ๋ถ๋ถ์ ์ด๋ก์ ์ ์ ์ผ๋ก ๋ฌถ์ฌ์๋ ๋ถ๋ถ์ด๋ค. ์ฌ๊ธฐ์, 3๋ฒ ํฑ๋๋ฐํด๋ฅผ ๋ฐ์๊ณ ๋ฐฉํฅ์ผ๋ก ํ์ ํ๋ค๋ฉด, 4๋ฒ ํฑ๋๋ฐํด๋ ์๊ณ ๋ฐฉํฅ์ผ๋ก ํ์ ํ๊ฒ ๋๋ค. 2๋ฒ ํฑ๋๋ฐํด๋ ๋ง๋ฟ์ ๋ถ๋ถ์ด S๊ทน์ผ๋ก ์๋ก ๊ฐ๊ธฐ ๋๋ฌธ์, ํ์ ํ์ง ์๊ฒ ๋๊ณ , 1๋ฒ ํฑ๋๋ฐํด๋ 2๋ฒ์ด ํ์ ํ์ง ์์๊ธฐ ๋๋ฌธ์, ํ์ ํ์ง ์๊ฒ ๋๋ค. ๋ฐ๋ผ์, ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ ๋ชจ์์ ๋ง๋ค๊ฒ ๋๋ค.
์์ ๊ฐ์ ์ํ์์ 1๋ฒ ํฑ๋๋ฐํด๋ฅผ ์๊ณ ๋ฐฉํฅ์ผ๋ก ํ์ ์ํค๋ฉด, 2๋ฒ ํฑ๋๋ฐํด๊ฐ ๋ฐ์๊ณ ๋ฐฉํฅ์ผ๋ก ํ์ ํ๊ฒ ๋๊ณ , 2๋ฒ์ด ํ์ ํ๊ธฐ ๋๋ฌธ์, 3๋ฒ๋ ๋์์ ์๊ณ ๋ฐฉํฅ์ผ๋ก ํ์ ํ๊ฒ ๋๋ค. 4๋ฒ์ 3๋ฒ์ด ํ์ ํ์ง๋ง, ๋ง๋ฟ์ ๊ทน์ด ๊ฐ๊ธฐ ๋๋ฌธ์ ํ์ ํ์ง ์๋๋ค. ๋ฐ๋ผ์, ์๋์ ๊ฐ์ ์ํ๊ฐ ๋๋ค.
ํฑ๋๋ฐํด์ ์ด๊ธฐ ์ํ์ ํฑ๋๋ฐํด๋ฅผ ํ์ ์ํจ ๋ฐฉ๋ฒ์ด ์ฃผ์ด์ก์ ๋, ์ต์ข ํฑ๋๋ฐํด์ ์ํ๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ 1๋ฒ ํฑ๋๋ฐํด์ ์ํ, ๋์งธ ์ค์ 2๋ฒ ํฑ๋๋ฐํด์ ์ํ, ์ ์งธ ์ค์ 3๋ฒ ํฑ๋๋ฐํด์ ์ํ, ๋ท์งธ ์ค์ 4๋ฒ ํฑ๋๋ฐํด์ ์ํ๊ฐ ์ฃผ์ด์ง๋ค. ์ํ๋ 8๊ฐ์ ์ ์๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ , 12์๋ฐฉํฅ๋ถํฐ ์๊ณ๋ฐฉํฅ ์์๋๋ก ์ฃผ์ด์ง๋ค. N๊ทน์ 0, S๊ทน์ 1๋ก ๋ํ๋์๋ค.
๋ค์ฏ์งธ ์ค์๋ ํ์ ํ์ K(1 โค K โค 100)๊ฐ ์ฃผ์ด์ง๋ค. ๋ค์ K๊ฐ ์ค์๋ ํ์ ์ํจ ๋ฐฉ๋ฒ์ด ์์๋๋ก ์ฃผ์ด์ง๋ค. ๊ฐ ๋ฐฉ๋ฒ์ ๋ ๊ฐ์ ์ ์๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ , ์ฒซ ๋ฒ์งธ ์ ์๋ ํ์ ์ํจ ํฑ๋๋ฐํด์ ๋ฒํธ, ๋ ๋ฒ์งธ ์ ์๋ ๋ฐฉํฅ์ด๋ค. ๋ฐฉํฅ์ด 1์ธ ๊ฒฝ์ฐ๋ ์๊ณ ๋ฐฉํฅ์ด๊ณ , -1์ธ ๊ฒฝ์ฐ๋ ๋ฐ์๊ณ ๋ฐฉํฅ์ด๋ค.
์ถ๋ ฅ
์ด K๋ฒ ํ์ ์ํจ ์ดํ์ ๋ค ํฑ๋๋ฐํด์ ์ ์์ ํฉ์ ์ถ๋ ฅํ๋ค. ์ ์๋ ๋ค์๊ณผ ๊ฐ์ด ๊ณ์ฐํ๋ค.
- 1๋ฒ ํฑ๋๋ฐํด์ 12์๋ฐฉํฅ์ด N๊ทน์ด๋ฉด 0์ , S๊ทน์ด๋ฉด 1์
- 2๋ฒ ํฑ๋๋ฐํด์ 12์๋ฐฉํฅ์ด N๊ทน์ด๋ฉด 0์ , S๊ทน์ด๋ฉด 2์
- 3๋ฒ ํฑ๋๋ฐํด์ 12์๋ฐฉํฅ์ด N๊ทน์ด๋ฉด 0์ , S๊ทน์ด๋ฉด 4์
- 4๋ฒ ํฑ๋๋ฐํด์ 12์๋ฐฉํฅ์ด N๊ทน์ด๋ฉด 0์ , S๊ทน์ด๋ฉด 8์
๐ํ์ด
๋ฐฑ์ค ๋๋ฌด ์ฌ๋ฐ์ด.
๋ ์๋ก์ ๋ ์ง๋ฆฟํด..
์ผ๋จ ํฑ๋๋ฐํด๋ฅผ ๊ตฌ์กฐ์ฒด๋ก ๋ง๋ค์ด์ ๊ด๋ฆฌํ๋ค.
struct Gear
{
int cogs[8];
};
cog๊ฐ ํฑ๋๋ผ๋ ๋ป์ด๋ผ๋๋ผ
ํฑ๋๋ฐํด๊ฐ ํ์ ํ ๋ ๊ทธ ์ผ์ชฝ ๋ฐํด์ ์ค๋ฅธ์ชฝ ๋ฐํด์์ ์ํธ์์ฉ์ด ์ค์ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ํธ์์ฉ์ ํ ๋ ์ด๋ฏธ ๋๋ ค์ง ํฑ๋๋ฐํด๋ ๋์๊ฐ๋ฉด ์๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก ์ด๋ฏธ ๋๋ ค์ก๋์ง ํ์ธํ๋ ๋ฐฐ์ด์ด ํ์ํ๋ค.
Gear gears[4];
// ์ด๋ฏธ ๋๋ ค์ก๋์ง ์๋์ง ํ์ธ์ฉ์ด ํ์ํ ๋ฏ
int ch[4];
๊ทธ๋์ ์ฒดํฌ๋ฐฐ์ด์ ๋ง๋ค์๋ค.
์ค๋ฅธ์ชฝ์ผ๋ก ํ์ ํ๋ ํจ์๋ ์๋์ ๊ฐ๋ค.
void turnRight(int num)
{
// ์ด๋ฏธ ๋๋ ค์ง์ํ๋ฉด ๋ฆฌํด
if (ch[num] == 1)
return;
// ์ฒดํฌํด์ฃผ๊ธฐ
ch[num] = 1;
// ๋๋ฆฌ๊ธฐ ์ 9์ ๋ฐฉํฅ ํฑ๋์ ๊ฐ
int curLeft = gears[num].cogs[6];
// ๋๋ฆฌ๊ธฐ ์ 3์ ๋ฐฉํฅ ํฑ๋์ ๊ฐ
int curRight = gears[num].cogs[2];
// ์ค๋ฅธ์ชฝ์ผ๋ก ๋๋ฆฌ๊ธฐ
int temp = gears[num].cogs[7];
for (int i = 7; i > 0; --i)
{
gears[num].cogs[i] = gears[num].cogs[i - 1];
}
gears[num].cogs[0] = temp;
// ์ผ์ชฝ ๋ฐํด ์ํธ์์ฉ
if (num - 1 >= 0 && gears[num - 1].cogs[2] != curLeft)
{
// ์ผ์ชฝ ๋ฐํด ๋ฐ์๊ณ ๋ฐฉํฅ์ผ๋ก ๋๋ฆฌ๊ธฐ
turnLeft(num - 1);
}
// ์ค๋ฅธ์ชฝ ๋ฐํด ์ํธ์์ฉ
if (num + 1 < 4 && gears[num + 1].cogs[6] != curRight)
{
// ์ค๋ฅธ์ชฝ ๋ฐํด ๋ฐ์๊ณ ๋ฐฉํฅ์ผ๋ก ๋๋ฆฌ๊ธฐ
turnLeft(num + 1);
}
}
์ผ์ชฝ์ผ๋ก ํ์ ํ๋ ํจ์๋ ์์ ๋น์ทํ๋ค.
void turnLeft(int num)
{
// ์ด๋ฏธ ๋๋ ค์ง์ํ๋ฉด ๋ฆฌํด
if (ch[num] == 1)
return;
// ์ฒดํฌํด์ฃผ๊ธฐ
ch[num] = 1;
// ๋๋ฆฌ๊ธฐ ์ 9์ ๋ฐฉํฅ ํฑ๋์ ๊ฐ
int curLeft = gears[num].cogs[6];
// ๋๋ฆฌ๊ธฐ ์ 3์ ๋ฐฉํฅ ํฑ๋์ ๊ฐ
int curRight = gears[num].cogs[2];
// ์ผ์ชฝ์ผ๋ก ๋๋ฆฌ๊ธฐ
int temp = gears[num].cogs[0];
for (int i = 0; i < 7; ++i)
{
gears[num].cogs[i] = gears[num].cogs[i + 1];
}
gears[num].cogs[7] = temp;
// ์ผ์ชฝ ๋ฐํด ์ํธ์์ฉ
if (num - 1 >= 0 && gears[num - 1].cogs[2] != curLeft)
{
// ์ผ์ชฝ ๋ฐํด ์๊ณ ๋ฐฉํฅ์ผ๋ก ๋๋ฆฌ๊ธฐ
turnRight(num - 1);
}
// ์ค๋ฅธ์ชฝ ๋ฐํด ์ํธ์์ฉ
if (num + 1 < 4 && gears[num + 1].cogs[6] != curRight)
{
// ์ค๋ฅธ์ชฝ ๋ฐํด ์๊ณ ๋ฐฉํฅ์ผ๋ก ๋๋ฆฌ๊ธฐ
turnRight(num + 1);
}
}
solve๋ ์๋์ ๊ฐ๋ค.
void solve()
{
// ๊ธฐ์ด ์ํ ์
๋ ฅ
for (int i = 0; i < 4; ++i)
{
string str;
cin >> str;
for (int j = 0; j < str.size(); ++j)
{
gears[i].cogs[j] = str[j] - '0';
}
}
// ํ์ฌ ๊ธฐ์ด ์ํ๋ฅผ ๋ณด๊ธฐ์ํด์ ๋ง๋ ํ
์คํธ ํจ์
//PrintGears();
int k; // ํ์ ์ํฌ ํ์
cin >> k;
int num, dir; // ํ์ ํ ๋ฐํด ๋๋ฒ์ ํ์ ๋ฐฉํฅ
// dir = 1 -> ์๊ณ ๋ฐฉํฅ
// dir = -1 -> ๋ฐ์๊ณ ๋ฐฉํฅ
for (int i = 0; i < k; ++i)
{
cin >> num >> dir;
VsitedClear();
if (dir == 1)
{
turnRight(num - 1);
}
else if (dir == -1)
{
turnLeft(num - 1);
}
// ํ์ฌ ๊ธฐ์ด ์ํ๋ฅผ ๋ณด๊ธฐ์ํด์ ๋ง๋ ํ
์คํธ ํจ์
//cout << "[" << i + 1 << "]" << endl;
//PrintGears();
}
cout << CheckScore();
}
๐์ ์ฒด ์ฝ๋
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <math.h>
using namespace std;
void turnLeft(int num);
void turnRight(int num);
struct Gear
{
int cogs[8];
};
Gear gears[4];
// ์ด๋ฏธ ๋๋ ค์ก๋์ง ์๋์ง ํ์ธ์ฉ์ด ํ์ํ ๋ฏ
int ch[4];
void turnRight(int num)
{
if (ch[num] == 1)
return;
ch[num] = 1;
int curLeft = gears[num].cogs[6];
int curRight = gears[num].cogs[2];
// ์ค๋ฅธ์ชฝ์ผ๋ก ๋๋ฆฌ๊ธฐ
int temp = gears[num].cogs[7];
for (int i = 7; i > 0; --i)
{
gears[num].cogs[i] = gears[num].cogs[i - 1];
}
gears[num].cogs[0] = temp;
// ์ผ์ชฝ ๋ฐํด ์ํธ์์ฉ
if (num - 1 >= 0 && gears[num - 1].cogs[2] != curLeft)
{
// ์ผ์ชฝ ๋ฐํด ๋ฐ์๊ณ ๋ฐฉํฅ์ผ๋ก ๋๋ฆฌ๊ธฐ
turnLeft(num - 1);
}
// ์ค๋ฅธ์ชฝ ๋ฐํด ์ํธ์์ฉ
if (num + 1 < 4 && gears[num + 1].cogs[6] != curRight)
{
// ์ค๋ฅธ์ชฝ ๋ฐํด ๋ฐ์๊ณ ๋ฐฉํฅ์ผ๋ก ๋๋ฆฌ๊ธฐ
turnLeft(num + 1);
}
}
void turnLeft(int num)
{
if (ch[num] == 1)
return;
ch[num] = 1;
int curLeft = gears[num].cogs[6];
int curRight = gears[num].cogs[2];
// ์ผ์ชฝ์ผ๋ก ๋๋ฆฌ๊ธฐ
int temp = gears[num].cogs[0];
for (int i = 0; i < 7; ++i)
{
gears[num].cogs[i] = gears[num].cogs[i + 1];
}
gears[num].cogs[7] = temp;
// ์ผ์ชฝ ๋ฐํด ์ํธ์์ฉ
if (num - 1 >= 0 && gears[num - 1].cogs[2] != curLeft)
{
// ์ผ์ชฝ ๋ฐํด ์๊ณ ๋ฐฉํฅ์ผ๋ก ๋๋ฆฌ๊ธฐ
turnRight(num - 1);
}
// ์ค๋ฅธ์ชฝ ๋ฐํด ์ํธ์์ฉ
if (num + 1 < 4 && gears[num + 1].cogs[6] != curRight)
{
// ์ค๋ฅธ์ชฝ ๋ฐํด ์๊ณ ๋ฐฉํฅ์ผ๋ก ๋๋ฆฌ๊ธฐ
turnRight(num + 1);
}
}
int CheckScore()
{
int res = 0;
if (gears[0].cogs[0] == 1)
res += 1;
if (gears[1].cogs[0] == 1)
res += 2;
if (gears[2].cogs[0] == 1)
res += 4;
if (gears[3].cogs[0] == 1)
res += 8;
return res;
}
void VsitedClear()
{
for (int i = 0; i < 4; ++i)
{
ch[i] = 0;
}
}
void PrintGears()
{
for (int i = 0; i < 4; ++i)
{
for (int j = 0; j < 8; ++j)
{
cout << gears[i].cogs[j] << " ";
}
cout << endl;
}
cout << endl;
}
void solve()
{
for (int i = 0; i < 4; ++i)
{
string str;
cin >> str;
for (int j = 0; j < str.size(); ++j)
{
gears[i].cogs[j] = str[j] - '0';
}
}
//PrintGears();
int k; // ํ์ ์ํฌ ํ์
cin >> k;
int num, dir; // ํ์ ํ ๋ฐํด ๋๋ฒ์ ํ์ ๋ฐฉํฅ
// dir = 1 -> ์๊ณ ๋ฐฉํฅ
// dir = -1 -> ๋ฐ์๊ณ ๋ฐฉํฅ
for (int i = 0; i < k; ++i)
{
cin >> num >> dir;
VsitedClear();
if (dir == 1)
{
turnRight(num - 1);
}
else if (dir == -1)
{
turnLeft(num - 1);
}
//cout << "[" << i + 1 << "]" << endl;
//PrintGears();
}
cout << CheckScore();
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
//freopen("input.txt", "rt", stdin);
solve();
return 0;
}