문제는 이 링크를 타고 가시면 있습니다.
힌트
- 이 문제는 완전탐색 문제 입니다.
- 이 문제는 std::next_permutation 함수를 사용하여 벡터를 ascending order 에서 descending order로 한번 한번 보낼 수 있습니다. // while(vector.next_permutation()) 사용
- int형 숫자와 char형 글자를 비교하지 않도록 주의하세요. 예.) if (0 == '0')
소스 코드
#include <cstdlib>
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int solution(int n, vector<string> data) {
int answer = 0;
vector<char> line{'A', 'C', 'F', 'J', 'M', 'N', 'R', 'T'};
vector<char>::iterator lineIter, lineIterTwo;
bool tracker;
do {
tracker = false;
for (int i = 0; i < n; i++) {
const char* rule = data[i].c_str();
const char from = rule[0];
const char to = rule[2];
const char exp = rule[3];
const char dis = atoi(&rule[4]);
for (lineIter = line.begin(); lineIter != line.end(); lineIter++) {
if (*lineIter == from) {
for (lineIterTwo = line.begin(); lineIterTwo != line.end(); lineIterTwo++) {
if (*lineIterTwo == to) break;
}
int calcDis = std::abs(lineIter - lineIterTwo) - 1;
if (exp == '=') { // 거리가 같음
if (calcDis != dis) {
tracker = true;
}
} else if (exp == '>') { // 거리가 더 크기 원함
if (calcDis <= dis) {
tracker = true;
}
} else { // 거리가 더 작기 원함
if (calcDis >= dis) {
tracker = true;
}
}
break;
}
}
if (tracker) break;
}
if (!tracker) answer++;
} while (std::next_permutation(line.begin(), line.end()));
return answer;
}
'개발 관련 기타 > 알고리즘' 카테고리의 다른 글
[프로그래머스] (C++) 큰 수 만들기 (0) | 2019.12.04 |
---|---|
[프로그래머스] (C++) 카펫 (0) | 2019.12.04 |
[프로그래머스] (C++) 숫자의 표현 (0) | 2019.11.22 |
[프로그래머스] (C++) 프린터 (0) | 2019.11.20 |
[프로그래머스] (C++) 체육복 (0) | 2019.11.18 |