2021. 12. 2. 17:34ใETC/Algorithm
๋ฌธ์ ์ค๋ช
๊ฐ์์ ๋ง์ ์นด์นด์คํ๋ ์ฆ๋ ๋จ์ฒด๋ก ์ํ์ ๋ ๋ฌ๋ค. ์ฆ๊ฑฐ์ด ์๊ฐ์ ๋ณด๋ด๊ณ ๋ง์ง๋ง์ ๋จ์ฒด์ฌ์ง์ ์ฐ๊ธฐ ์ํด ์นด๋ฉ๋ผ ์์ ์ผ๋ ฌ๋ก ๋๋ํ ์ฐ๋ค. ๊ทธ๋ฐ๋ฐ ๊ฐ์๊ฐ ์ํ๋ ๋ฐฐ์น๊ฐ ๋ชจ๋ ๋ฌ๋ผ ์ด๋ค ์์๋ก ์ค์ง ์ ํ๋๋ฐ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ ธ๋ค. ๋ค์ค๋ ํ๋ก๋์ ๋๋ํ ์๊ธฐ๋ฅผ ์ํ๊ณ , ํ๋ธ๊ฐ ๋ฟ์ ๋ถ์ ๋ง์ ์ ์ด ์๋ ๋ผ์ด์ธ์ ํ๋ธ์๊ฒ์ ์ ์ด๋ ์ธ ์นธ ์ด์ ๋จ์ด์ ธ์ ์๊ธฐ๋ฅผ ์ํ๋ค. ์ฌ์ง์ ์ฐ๊ณ ๋์ ๋์์ค๋ ๊ธธ์, ๋ฌด์ง๋ ๋ชจ๋๊ฐ ์ํ๋ ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด์๋ ๋ค๋ฅด๊ฒ ์๋ ๋ฐฉ๋ฒ์ด ์์ง ์์์๊น ์๊ฐํด๋ณด๊ฒ ๋์๋ค. ๊ฐ ํ๋ ์ฆ๊ฐ ์ํ๋ ์กฐ๊ฑด์ ์ ๋ ฅ์ผ๋ก ๋ฐ์์ ๋ ๋ชจ๋ ์กฐ๊ฑด์ ๋ง์กฑํ ์ ์๋๋ก ์๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ณ์ฐํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํด๋ณด์.
์ ๋ ฅ ํ์
์ ๋ ฅ์ ์กฐ๊ฑด์ ๊ฐ์๋ฅผ ๋ํ๋ด๋ ์ ์ n๊ณผ n๊ฐ์ ์์๋ก ๊ตฌ์ฑ๋ ๋ฌธ์์ด ๋ฐฐ์ด data๋ก ์ฃผ์ด์ง๋ค. data์ ์์๋ ๊ฐ ํ๋ ์ฆ๊ฐ ์ํ๋ ์กฐ๊ฑด์ด N~F=0๊ณผ ๊ฐ์ ํํ์ ๋ฌธ์์ด๋ก ๊ตฌ์ฑ๋์ด ์๋ค. ์ ํ์กฐ๊ฑด์ ์๋์ ๊ฐ๋ค.
- 1 <= n <= 100
- data์ ์์๋ ๋ค์ฏ ๊ธ์๋ก ๊ตฌ์ฑ๋ ๋ฌธ์์ด์ด๋ค. ๊ฐ ์์์ ์กฐ๊ฑด์ ๋ค์๊ณผ ๊ฐ๋ค.
- ์ฒซ ๋ฒ์งธ ๊ธ์์ ์ธ ๋ฒ์งธ ๊ธ์๋ ๋ค์ 8๊ฐ ์ค ํ๋์ด๋ค. {A, C, F, J, M, N, R, T} ๊ฐ๊ฐ ์ดํผ์น, ์ฝ, ํ๋ก๋, ์ ์ด์ง, ๋ฌด์ง, ๋ค์ค, ๋ผ์ด์ธ, ํ๋ธ๋ฅผ ์๋ฏธํ๋ค. ์ฒซ ๋ฒ์งธ ๊ธ์๋ ์กฐ๊ฑด์ ์ ์ํ ํ๋ ์ฆ, ์ธ ๋ฒ์งธ ๊ธ์๋ ์๋๋ฐฉ์ด๋ค. ์ฒซ ๋ฒ์งธ ๊ธ์์ ์ธ ๋ฒ์งธ ๊ธ์๋ ํญ์ ๋ค๋ฅด๋ค.
- ๋ ๋ฒ์งธ ๊ธ์๋ ํญ์ ~์ด๋ค.
- ๋ค ๋ฒ์งธ ๊ธ์๋ ๋ค์ 3๊ฐ ์ค ํ๋์ด๋ค. {=, <, >} ๊ฐ๊ฐ ๊ฐ์, ๋ฏธ๋ง, ์ด๊ณผ๋ฅผ ์๋ฏธํ๋ค.
- ๋ค์ฏ ๋ฒ์งธ ๊ธ์๋ 0 ์ด์ 6 ์ดํ์ ์ ์์ ๋ฌธ์ํ์ด๋ฉฐ, ์กฐ๊ฑด์ ์ ์๋๋ ๊ฐ๊ฒฉ์ ์๋ฏธํ๋ค. ์ด๋ ๊ฐ๊ฒฉ์ ๋ ํ๋ ์ฆ ์ฌ์ด์ ์๋ ๋ค๋ฅธ ํ๋ ์ฆ์ ์์ด๋ค.
์ถ๋ ฅ ํ์
๋ชจ๋ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ฆฌํดํ๋ค.
์์ ์ ์ถ๋ ฅ
n | data | answer |
2 | ["N~F=0", "R~T>2"] | 3648 |
2 | ["M~C<2", "C~M>1"] | 0 |
์์ ์ ๋ํ ์ค๋ช
์ฒซ ๋ฒ์งธ ์์ ๋ ๋ฌธ์ ์ ์ค๋ช ๋ ๋ฐ์ ๊ฐ์ด, ๋ค์ค๋ ํ๋ก๋์์ ๊ฐ๊ฒฉ์ด 0์ด๊ธฐ๋ฅผ ์ํ๊ณ ๋ผ์ด์ธ์ ํ๋ธ์์ ๊ฐ๊ฒฉ์ด 2๋ณด๋ค ํฌ๊ธฐ๋ฅผ ์ํ๋ ์ํฉ์ด๋ค.
๋ ๋ฒ์งธ ์์ ๋ ๋ฌด์ง๊ฐ ์ฝ๊ณผ์ ๊ฐ๊ฒฉ์ด 2๋ณด๋ค ์๊ธฐ๋ฅผ ์ํ๊ณ , ๋ฐ๋๋ก ์ฝ์ ๋ฌด์ง์์ ๊ฐ๊ฒฉ์ด 1๋ณด๋ค ํฌ๊ธฐ๋ฅผ ์ํ๋ ์ํฉ์ด๋ค. ์ด๋ ๋์์ ๋ง์กฑํ ์ ์๋ ์กฐ๊ฑด์ด๋ฏ๋ก ๊ฒฝ์ฐ์ ์๋ 0์ด๋ค.
๋ฌธ์ ํด๊ฒฐ
[C++ ] next_permutation
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
bool check(char ine, int dis, int cond) {
if (ine == '=') {
return dis == cond;
} else if (ine == '>') {
return dis > cond;
} else {
return dis < cond;
}
}
int solution(int n, vector<string> data) {
int answer = 0;
string friends = "ACFJMNRT";
do {
for (string d: data) {
char f1 = d[0], f2 = d[2];
n = d[4] - '0';
int dist = friends.find(f1) - friends.find(f2);
if (!check(d[3], abs(dist)-1, n)) goto next;
}
answer++;
next: {}
} while (next_permutation(friends.begin(), friends.end()));
return answer;
}
int main() {
int result = solution(2, {"N~F=0", "R~T>2"});
cout << "result : " << result << endl;
return 0;
}
next_permutation ์ ์ฌ์ฉํด๋ณผ ์ ์์๋ค.
ํต๊ณผ (406.76ms, 4.26MB)
[C++ ] DFS - Permutation
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
#define FRIEND 8
using namespace std;
bool visited[FRIEND];
vector<char> selected;
string friends;
int answer;
bool check(char ine, int dis, int cond) {
if (ine == '=') {
return dis == cond;
} else if (ine == '>') {
return dis > cond;
} else {
return dis < cond;
}
}
bool isValid(vector<string> data, string friends) {
for (string d: data) {
char f1 = d[0], f2 = d[2];
int n = d[4]-'0';
int dist = friends.find(f1) - friends.find(f2);
if (!check(d[3], abs(dist)-1, n)) return false;
}
return true;
}
void dfs(vector<string> data, int cnt) {
if (cnt == FRIEND) {
string sel = "";
for (char s: selected) sel += s;
if (isValid(data, sel)) answer++;
return;
}
for (int i=0; i < FRIEND; i++) {
if (visited[i]) continue;
visited[i]=true;
selected.push_back(friends[i]);
dfs(data, cnt+1);
selected.pop_back();
visited[i]=false;
}
}
int solution(int n, vector<string> data) {
answer = 0;
friends = "ACFJMNRT";
dfs(data, 0);
return answer;
}
DFS๋ก ์์ด์ ์กฐํํ๋ฉฐ ์ฒดํฌํ ์๋ ์๋ค.
๊ทผ๋ฐ ์ฑ๋ฅ์ next_permutation์ด ๋์ฌ๋ค
ํต๊ณผ (9266.66ms, 4.32MB)
'ETC > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
programmers, ๋จ์์นด๋ฉ๋ผ (0) | 2021.12.03 |
---|---|
Programmers, ์ฌ ์ฐ๊ฒฐํ๊ธฐ (2) | 2021.12.02 |
Programmers, ์งํ ํธ์ง (0) | 2021.11.30 |
Programmers, ๊ธฐ์ง๊ตญ ์ค์น (0) | 2021.11.29 |
Programmers, ๋ฐฐ๋ฌ (0) | 2021.11.29 |
Backend Software Engineer
๐๐ฎ๐ง ยท ๐๐ฎ๐๐ค๐ฃ๐๐จ๐ช๐ฃ ๐๐๐ง๐