[2019 카카오 개발자 겨울 인턴십] 불량 사용자

2021. 5. 5. 18:53·알고리즘 문제풀이

programmers.co.kr/learn/courses/30/lessons/64064

 

코딩테스트 연습 - 불량 사용자

개발팀 내에서 이벤트 개발을 담당하고 있는 "무지"는 최근 진행된 카카오이모티콘 이벤트에 비정상적인 방법으로 당첨을 시도한 응모자들을 발견하였습니다. 이런 응모자들을 따로 모아 불량

programmers.co.kr

def change_v_to_bit(v):
    bit = ""
    for i in range(len(v)):
        bit += str(v[i])
    return bit

def is_in(bit):
    global result
    if bit in result:
        return True
    return False

def match(ban,user):
    if len(ban) != len(user):
        return False
    for i in range(len(ban)):
        if ban[i] == "*":
            continue
        else:
            if ban[i] != user[i]:
                return False
    return True

def dfs(user_id, banned_id,n,v):
    global result
    answer = 0
    if n == len(banned_id):
        bit = change_v_to_bit(v)
        if not is_in(bit):
            result.add(bit)
            return 1
        return 0
    
    target = banned_id[n]
    for i in range(len(user_id)):
        if v[i]:
            continue
        if match(target,user_id[i]):
            v[i] = 1
            answer += dfs(user_id,banned_id,n+1,v)
            v[i] = 0 
    
    return answer


result = set()

def solution(user_id, banned_id):
    global result

    visited = [0]*len(user_id)

    cnt = dfs(user_id, banned_id,0,visited)

    return cnt
    

풀이

가능한 모든 '조합'을 구하는게 문제의 정답이다.

조합을 구하기 위해 백트래킹을 사용해서 완전 탐색했다.

 

user_id 크기의 visited 배열을 만들고 사용한 user_id 에 해당하는 인덱스를 방문처리했다.

banned_id 만큼 user_id를 찾았으면 하나의 조합이 완성된 것이므로 카운트 해준다.

 

순서만 바뀐 같은 조합을 카운트하지 않기 위해 set 자료구조에 결과를 저장했다.

저장할 때 visited 요소를 string으로 변환해 저장해 주었다. 

이걸 이진수로 계산해 저장하면 비트마스킹 기법인데(00011 -> 3으로 저장하는 느낌) 최적화를 할때 사용하면 좋다. (이 문제에선 사용하지 않았다.)

 

시간복잡도

user_id 배열의 길이 가 N

user_id 이름길이가 M

banned_id 의 배열의 길이가 L(B<=N) 이라고 했을 때

 

dfs 함수를 보면 for문으로 N번 호출하고

호출할때마다 match를 통해 user_id길이를 O(M) 시간을 들여 검사한다.

 

그리고 그 dfs의 스택 깊이가 최대 L 이다.

즉 O(NML) 이다. 

 

'알고리즘 문제풀이' 카테고리의 다른 글

[백준 5347] LCM (최소공배수)  (0) 2021.05.07
[백준 10610] 30  (0) 2021.05.05
[백준1238] 파티  (0) 2021.05.05
[백준14465] 소가 길을 건너간 이유 5  (0) 2021.05.05
[백준1747] 소수&팰린드롬  (0) 2021.05.05
'알고리즘 문제풀이' 카테고리의 다른 글
  • [백준 5347] LCM (최소공배수)
  • [백준 10610] 30
  • [백준1238] 파티
  • [백준14465] 소가 길을 건너간 이유 5
WildDevmon
WildDevmon
『앗! 야생의 개발몬(이)가 나타났다!』
  • WildDevmon
    야생의 개발몬
    WildDevmon
  • 전체
    오늘
    어제
    • 분류 전체보기 (35)
      • Server (5)
      • 알고리즘 문제풀이 (27)
      • 회고 (3)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    2020 카카오 인턴
    direct buffer
    코틀린 코루틴
    백준 1004
    자바 최대공약수
    백준 1027
    네카라쿠배 취업
    소수&팰린드롬
    백준1747
    백준 파티
    백준 30
    백준 인형들
    자바 최소공배수
    백준 1034
    백준14465
    자바 물리 메모리
    백준 1114
    카카오 필요스펙
    자바 프로세스 종료
    백준6980
    백준15954
    다이렉트 버퍼
    terminationGracePeriodSeconds
    백준 경쟁적 전염
    네이티브 메모리
    우아한 종료
    자바 스레드 상태
    백준 램프
    백준 고층 건물
    graceful shutdown
    백준 어린 왕자
    소가 길을 건너간 이유 5
    백준1188
    백준 5347
    preStop
    선발 명단
    컴공 취준
    합승 택시 요금
    백준 1114 파이썬
    백준1238
    백준2262
    경력 서류
    파이썬
    커널 스레드 상태
    백준 17281
    백준 18405
    1114백준
    ai개발자
    백준 10610
    통나무 자르기
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
WildDevmon
[2019 카카오 개발자 겨울 인턴십] 불량 사용자
상단으로

티스토리툴바