programmers.co.kr/learn/courses/30/lessons/64064#
코딩테스트 연습 - 불량 사용자
개발팀 내에서 이벤트 개발을 담당하고 있는 "무지"는 최근 진행된 카카오이모티콘 이벤트에 비정상적인 방법으로 당첨을 시도한 응모자들을 발견하였습니다. 이런 응모자들을 따로 모아 불량
programmers.co.kr
처음 문제를 잘 이해하지 못하여 접근방법을 잘못 알았고 아래에 첨부한 풀이도 비효율적이지만 오랜 시간을 들여 풀었기 때문에 그대로 첨부하였다.
#include <string>
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;
int answer;
bool visit[9];
set<string> rst;
void dfs(int n, vector<string> &user_id, vector<string> &banned_id, string s) {
if(n == banned_id.size()) {
sort(s.begin(), s.end());
rst.insert(s);
return;
}
string now = banned_id[n];
for(int i = 0; i < user_id.size(); i++) {
if(visit[i] || now.size() != user_id[i].size()) continue;
int chk = 0;
for(int j = 0; j < now.size(); j++) {
if(now[j] == '*') continue;
if(user_id[i][j] != now[j]) {
chk = 1;
break;
}
}
if(!chk) {
visit[i] = 1;
dfs(n+1, user_id, banned_id, s + to_string(i));
visit[i] = 0;
}
}
return;
}
int solution(vector<string> user_id, vector<string> banned_id) {
dfs(0, user_id, banned_id, "");
answer = rst.size();
return answer;
}
처음에는 그래프를 그려 2-sat으로 이분매칭을 이용하여 풀려고 했으나 뜻대로 되지 않아 백트래킹을 이용하여 풀었다.
ban사용자를 하나씩 선택하여 방문하지 않은 user중 일치하는 것이 있는지 확인한 후 재귀적으로 반복한다. dfs함수의 맨 마지막 인자인 string은 지금까지 일치된 사용자의 인덱스 번호이다. 사용자를 모두 찾은 경우 string s를 정렬하여 set에 집어 넣는다. 이 과정은 중복이 일어나지 않게 하기 위해서이다. 모든 과정을 끝낸 후 set의 사이즈를 리턴하면 된다.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[C++] 프로그래머스 다단계 칫솔 판매 풀이 (0) | 2021.07.30 |
---|---|
[C++] 프로그래머스 다리를 지나는 트럭 풀이 (0) | 2021.07.28 |
[C++] 프로그래머스 베스트 앨범 풀이(해시) (1) | 2021.06.30 |
프로그래머스 2019 카카오 개발자 겨울 튜플 풀이 (0) | 2021.05.05 |
프로그래머스 2019 카카오 개발자 겨울 인턴십크레인 인형뽑기 게임 풀이 (0) | 2021.05.05 |