본문 바로가기

개발 관련 기타/알고리즘

[프로그래머스] (C++) 단체사진 찍기

문제는 이 링크를 타고 가시면 있습니다.

 

힌트

  • 이 문제는 완전탐색 문제 입니다.
  • 이 문제는 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;
}