2019 카카오 개발자 겨울 인턴십 문제 (3. 불량 사용자) | 프로그래머스
이런 응모자들을 따로 모아 불량 사용자라는 이름으로 목록을 만들어서 당첨 처리 시 제외하도록 이벤트 당첨자 담당자인 "프로도" 에게 전달하려고 합니다.
이 때 개인정보 보호을 위해 사용자 아이디 중 일부 문자를 '*' 문자로 가려서 전달했습니다.
가리고자 하는 문자 하나에 '*' 문자 하나를 사용하였고 아이디 당 최소 하나 이상의 '*' 문자를 사용하였습니다.
"무지"와 "프로도"는 불량 사용자 목록에 매핑된 응모자 아이디를 제재 아이디 라고 부르기로 하였습니다.
이벤트 응모자 아이디 목록이 담긴 배열 user_id와 불량 사용자 아이디 목록이 담긴 배열 banned_id가 매개변수로 주어질 때, 당첨에서 제외되어야 할 제재 아이디 목록은 몇가지 경우의 수가 가능한 지 return 하도록 solution 함수를 완성해주세요.
1. 제재 아이디가 '*'가 포함되어있으니까 다른 아이디랑 헷갈리는 경우의 수가 생긴다. => 그런 경우의 수를 반환하는 함수를 만들어야한다. 2. 아이디가 중복되는 경우는 없음그러면 일단 문자열 길이 알아야하고, *를 제외한 문자들을 체크해야할 듯
두 번째 출력 예시의 경우까지는 다 뽑아냈는데 경우의 수를 어떻게 세느냐가 관건인듯
▲ 처참한 흔적
근데 처음부터 코드를 다시 짜야할 것같다.
*를 다 없애다보니까 비교하기가 꽤 어려워졌다 (하...ㅠ)
입출력 1,2,3에서의 경우의 수에 들어갈 id는 모두 찾을 수 있게 되었다.
이제 중요한 건 경우의 수를 어떻게 세느냐이다.
어거지로 맞췄더니 다음과 같은 결과가 나왔다
하 ㅠㅠ 경우의 수 그거 어떻게 맞추는건데.. 딕셔너리로 하고싶었는데 거기서 또 오류가 생겼다. 일단 삽질한 흔적의 코드는 다음과 같다.
def solution(user_id, banned_id): answer = 0 not_in_list=False answer = 0 case=[] case_clear = True breakpoint=False for i in range(len(banned_id)): for k in range(len(user_id)): if len(banned_id[i]) == len(user_id[k]): if not banned_id[i] in case: case.append([banned_id[i]]) for j in range(len(user_id[k])): if banned_id[i][j]=='*': continue elif banned_id[i][j]== user_id[k][j]: continue else: case_clear=False break if case_clear: for x in range(len(case)): if banned_id[i] in case[x]: case[x].append(user_id[k]) break else: case_clear = True total_case=[] for n in range(len(case)): if len(case[n]) == 1: continue else: total_case.append(list(set(case[n]))) for k in range(len(total_case)-1): for i in range(len(total_case[k])): if total_case[k][i] in total_case[k+1]: total_case[k+1][total_case[k+1].index(total_case[k][i])]='' for x in range(len(total_case)): for y in range(len(total_case[x])): if not total_case[x][y] in banned_id: if total_case[x][y]=='': breakpoint=True break if breakpoint: if len(total_case[x])>2: answer+=1 breakpoint=False else: if len(total_case[x])>2: answer+=2 if len(set(banned_id)) != len(banned_id): answer-=(len(banned_id)-len(set(banned_id)))*2 return answer
나중에 set을 이용해서 비교를 하지않으면 순서에 따라 또 다른 경우로 인식하기 때문에 set을 사용해서 비교하는 듯 하다. 근데 이럴거면 sort도 되지않나? tuple때문인가? => 해본 결과 상관은 없는듯. 그저 중복을 처리한다는게 중요한 듯하다.
점수가 나올 때 캡쳐를 하지못해서 빈공간으로 캡쳐되었다.
가형 29번 4점짜리 몰라서 몇 시간 고민하다가 답지보고 얼레벌레 맞춘 느낌이라 찝찝하다.. ㅎ
from itertools import permutations 를 통해 사용한다.