programmers.co.kr/learn/courses/30/lessons/64064
코딩테스트 연습 - 불량 사용자
개발팀 내에서 이벤트 개발을 담당하고 있는 무지는 최근 진행된 카카오이모티콘 이벤트에 비정상적인 방법으로 당첨을 시도한 응모자들을 발견하였습니다. 이런 응모자들을 따로 모아 불량
programmers.co.kr
처음에 매우 어렵게 접근했다.
하지만 문제에서 구하고자 하는 바가 불량 아이디 케이스 별 집합 이라는 것을 알면 접근이 쉬워진다.
유저 아이디에서 불량 아이디를 체크하여 그 경우의 수를 집합에 담는다.
{1,3,4} 나 {3,4,1}이나 같은 케이스로 취급하기 때문
유저아이디도 최대 8개이기 때문에 dfs를 돌려서 모두 확인하는 방법이 최선이다.
dfs(parameter: 현재 체크할 불량 아이디 인덱스)
종료 조건: 체크한 불량 아이디 수 == 불량 아이디 전체 수
for:
현재 체크할 불량 아이디에 대해 모든 유저 아이디를 체크
if 이미 체크된 아이디 then continue;
else
아이디 불량 여부 체크
if 불량 then
불량 체크
다음 dfs로
불량 체크 해제
요런 식이다. 현재 체크한 불량 아이디는 visitied배열로 확인한다.
#include <string>
#include <vector>
#include <set>
using namespace std;
set<int> s;
int visited[8];
int blen;
void DFS(int bidx, vector<string> &user_id, vector<string> &banned_id){
if(bidx == blen){
int tmp = 0;
for(int i=0; i<user_id.size(); i++){
if(visited[i]){
tmp = tmp| 1<<i;
}
}
s.insert(tmp);
return;
}
string banned = banned_id[bidx];
for(int i=0; i<user_id.size(); i++){
if(visited[i]) continue;
string user = user_id[i];
if(user.length() != banned.length()){
continue;
}
// 일치 여부 비교
bool flag = true;
for(int j=0; j<banned.size(); j++){
if(banned[j] == '*') continue;
if(banned[j] != user[j]){
flag = false;
break;
}
}
if(flag){
visited[i] = 1;
DFS(bidx+1, user_id, banned_id);
visited[i] = 0;
}
}
}
int solution(vector<string> user_id, vector<string> banned_id) {
int answer = 0;
blen = banned_id.size();
DFS(0, user_id, banned_id);
answer = s.size();
return answer;
}
'알고리즘 문제풀이 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 2020 카카오 인턴십] 키패드 누르기 (0) | 2021.01.21 |
---|---|
[프로그래머스 2019 카카오 개발자 겨울 인턴십] 호텔 방 배정 (0) | 2021.01.20 |
[프로그래머스 2019 카카오 개발자 겨울 인턴쉽] 튜플 (0) | 2021.01.19 |
[프로그래머스 2019 카카오 개발자 겨울 인턴십] 크레인 인형뽑기 게임 (0) | 2021.01.19 |
[프로그래머스] 레벨3 베스트앨범 (0) | 2021.01.19 |
댓글