문제 푼 날짜 : 2021-08-11
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/1835
주어진 배열 {A, C, F, J, M, N, R, T} (각각 어피치, 콘, 프로도, 제이지, 무지, 네오, 라이언, 튜브)을 이용하여 순열을 만들어 주고, 그 순열이 조건을 모두 만족하는지 체크해주면 쉽게 풀 수 있는 문제였다.
조건은 두 친구간의 거리에 관한 것이기 때문에, 각 순열에서 조건에 해당하는 친구들의 거리를 구하여 그 사이에 있을 수 있는 인원을 체크해주었다.
순열을 구현하는 방법은 여러가지가 있지만, C++의 next_permutation을 이용하여 구현해주었다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
// 전역 변수를 정의할 경우 함수 내에 초기화 코드를 꼭 작성해주세요.
int solution(int n, vector<string> data) {
vector<char> Friend{ 'A', 'C', 'F', 'J', 'M', 'N', 'R', 'T' };
int answer = 0;
do {
bool flag = true;
for (string str : data) {
char from = str[0], to = str[2];
char op = str[3];
int num = str[4] - '0';
auto pos1 = find(Friend.begin(), Friend.end(), from);
auto pos2 = find(Friend.begin(), Friend.end(), to);
int diff;
if (pos1 < pos2) {
diff = pos2 - pos1 - 1;
} else {
diff = pos1 - pos2 - 1;
}
if (op == '=') {
if (diff == num) {
continue;
} else {
flag = false;
break;
}
} else if (op == '<') {
if (diff < num) {
continue;
} else {
flag = false;
break;
}
} else if (op == '>') {
if (diff > num) {
continue;
} else {
flag = false;
break;
}
}
}
if (flag == true) {
answer++;
}
} while (next_permutation(Friend.begin(), Friend.end()));
return answer;
}
Level2 문제는 확실히 난이도는 쉽지만, 구현 능력을 기를 수 있는 좋은 문제들인 것 같다.
물론 내 코드가 깔끔하진 않지만,,, 생각을 최대한 코드화하는데 연습하기 좋은 것 같다.
좀 더 코드를 간소화하고, 알고리즘을 다듬어 코딩하는 연습을 해야될 것 같다.