bit가 눈 앞에서 왔다갔다

Py) 프로그래머스 64064 불량 사용자 본문

Algorithm/Prob

Py) 프로그래머스 64064 불량 사용자

헬린인형 2022. 4. 1. 23:21

https://programmers.co.kr/learn/courses/30/lessons/64064?language=python3 

 

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

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

programmers.co.kr

 

1차: 1시간 25분

2차: 30분

3차: 8분

 

0. 입출력

 

1.

1-1. 내 로직

1) 길이로 판단, 길이가 동일하면 banned_id에 있는 원소가 user_id 각각을 가리킬 수 있는지 확인

2) 조합으로 계산해 줄 수 있게 list에 넣어준다.

 

1-2. 내 코드

def solution(user_id, banned_id):
    answer = 0
    case = dict()
    cases = []
    
    tmp = []
    banned_id.sort()
    user_id.sort()
    
  
    for i in range(len(banned_id)):
        tmp = []
    
        for k in user_id:
            if len(banned_id[i]) == len(k):   # 길이가 동일하다면 비교시작
                flag = 0
                for j in range(0, len(banned_id[i])):
                    if banned_id[i][j] != k[j]:
                        if banned_id[i][j]=='*':
                          continue
                        else:
                            flag = 1
                            break
                if flag == 0:
                    tmp.append(k)    # 후보군에 넣기
        cases.append(tmp)
       
 
    return answer

리스트는 만들 수 있는데, 경우의 수 계산을 어떻게 해줘야할지 모르겠음'

 

2. Solution

2-1. 로직

1) banned_id와 user_id를 순열로 후보를 구한다.

2) 생성된 리스트 중 banned_id가 user_id를 가리킬 수 있는지 확인한다.

3) 가리킬 수 있다면 해당 리스트의 개수를 세고, 일치하다면 답에 추가한다.

2-2. 코드

from itertools import permutations
def solution(user_id, banned_id):
    answer = []
    candidates=set()
    count=0
    
    if len(user_id)==len(banned_id):
        return 1
        
    for i in permutations(user_id,len(banned_id)):
        count=0
        for idx in range(len(banned_id)):
            if len(i[idx])!=len(banned_id[idx]):
                break
            else:
                if check(i[idx],banned_id[idx]) ==  False:
                    break
                else :
                    count+=1
            
            if count == len(banned_id):
                candidate=set(i)
                if candidate not in answer:
                    answer.append(candidate)
                    
    return len(answer)

def check(checkid,bannedid):
    for i in range(len(checkid)):
        if bannedid[i]=="*":
            continue
        else :
            if checkid[i] == bannedid[i]:
                continue
            else:
                return False
    return True

 

3. 새롭게 알게 된 것:

from itertools import permutations

조합 - 순서 상관없음

순열 - 순서 상관있음 (순서 다르면 다른 걸로 취급)

반응형
Comments