코딩테스트/프로그래머스
프로그래머스] C++ 2017 카카오 - 단체사진 찍기(Level 2)
Hwan2
2021. 7. 20. 00:41
반응형
해당 문제는 프로그래머스 코딩테스트 연습에 있는 문제입니다.
아래 링크를 통해 풀 수 있습니다.
https://programmers.co.kr/learn/courses/30/lessons/1835
1. 조건
- 첫 번째 글자와 세 번째 글자는 다음 8개 중 하나이다. {A, C, F, J, M, N, R, T} 각각 어피치, 콘, 프로도, 제이지, 무지, 네오, 라이언, 튜브를 의미한다.
- data는 1 ~ 100개까지 들어 있다.
- data의 각 요소들은 다음과 같은 형태를 갖는다.
- 첫번째와 세번째는 알파벳(A, C, F, J, M, N, R, T 중 1개)
- 네번째 글자는 ( <, >, = ) 중 하나이다.
- 다섯번째 글짜는 숫자로 각 인원이 원하는 거리를 뜻한다. - data의 조건을 만족하면서 줄을 설 수 있는 모든 경우의 수를 구하여라.
2. 풀이
해당 문제는 각 문제를 쪼개서 푼다면 쉽게 풀 수 있는 문제입니다.
우선 {A, C, F, J, M, N, R, T}가 나올 수 있는 경우의수는 40320가지 이다.
이는 8! 로 풀 수 있으며, 순열을 이용해 간단히 섞을 수 있습니다.
저희는 40320의 경우의 수 중에 data에 있는 모든 조건을 만족하는 경우만 추려주면 됩니다.
각 data의 각 원소의 문자열은 길이가 고정이므로 특정 위치에서 원하는 문자를 뽑아서 처리해줄 수 있습니다.
string s = data[0]; 로 하나의 원소를 뺏다고 가정 했을 때,
s[0] 과 s[2]는 알파벳이 뽑히고,
s[3] 은 같은 선상에 있을지, 숫자 이상으로 떨어져 있을지, 붙어있을지 결정하는 기호가 있습니다.( <, >, = )
s[4]는 간격의 숫자가 있고요.
s[0] 과 s[2]의 간격은 섞인 배열을 기준으로 절대값으로 빼주면 간격이 나오게 됩니다.
이를 if문을 통해 처리해준다면 간단하게 풀 수 있습니다.
3. 코드
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int find_char(vector<char>& v, char c){
for(int i = 0; i < v.size(); i++)
if(c == v[i]) return i;
return -1;
}
bool func1(int a, int b, int num){
return abs(a - b) == num ? true : false;
}
bool func2(int a, int b, int num){
return abs(a - b) < num ? true : false;
}
bool func3(int a, int b, int num){
return abs(a - b) > num ? true : false;
}
int solution(int n, vector<string> data) {
vector<char> v = {'A', 'C', 'F', 'J', 'M', 'N', 'R', 'T'};
int answer = 0;
do {
bool flag = true;
for(auto& s : data) {
int a = find_char(v, s[0]);
int b = find_char(v, s[2]);
int num = (s[4] - '0') + 1;
if(s[3] == '=') flag = func1(a, b, num);
else if(s[3] == '<') flag = func2(a, b, num);
else flag = func3(a, b, num);
if(!flag) break;
}
if(flag) answer++;
} while (next_permutation(v.begin(), v.end()));
return answer;
}
반응형