이 영역을 누르면 첫 페이지로 이동
자라자 블로그의 첫 페이지로 이동

자라자

페이지 맨 위로 올라가기

자라자

개발자를 준비하는 자라자의 블로그입니다.

[프로그래머스] 불량사용자 파이썬 풀이

  • 2021.12.10 11:23
  • PS/Programmers

프로그래머스로고

[문제 링크]

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

[입출력 예]

user_id banned_id result
["frodo", "fradi", "crodo", "abc123", "frodoc"] ["frd", "abc1**"] 2
["frodo", "fradi", "crodo", "abc123", "frodoc"] ["rodo", "rodo", "**"] 2
["frodo", "fradi", "crodo", "abc123", "frodoc"] ["frd", "rodo", "*****", "**"] 3

[최초 접근 방식]

# 경우의 수 구하듯이 접근했음.
# 이런 식으로 풀면 banned_id가 중복될 때
# 또는 교환이 가능할 때(예제3) 바르게 셀 수 없다.
# 요소를 쪼개서 곱하는 게 아니라
# 아예 답을 내고 set으로 중복을 걸러야 한다.

def check(banned_id,user_id):
    if len(banned_id)!=len(user_id):
        return 0
    for idx, letter in enumerate(banned_id):
        if letter == '*':
            continue
        else:
            if(letter!=user_id[idx]):
                return 0
    return 1


def solution(user_id, banned_id):
    answer=1
    for i in banned_id:
        count = 0
        for j in user_id:
            count+=check(i,j)
            print(i,j,check(i,j))
        print('최종count',count)
        answer*=count
    return answer

[소스코드]

# user_id 배열이 작다. -> 노가다로 풀어도 된다.
# 브루트 포스 어떻게? itertools로 banned_id만큼
# 다 뽑아 놓고, 안되는 걸 거르자.
# permutations를 쓰는 이유 : 결국 길이를 맞추고 일대일 대응의 수를 세는 건데
# combinations로 users를 만들면 맞추는 순서에 따라 되기도 하고 아니기도 한다.
# 이를 방지하기 위해 중복 경우 처리는 마지막에 answer에 담을 때 하기.
# 길이가 같은 배열을 zip으로 묶으면 아이터레이터 두 개로 순회할 수 있다!!!

from itertools import permutations

def check(users, banned_id):
    if len(users)!=len(banned_id):
        return False
    else:
        for i, j in zip(users,banned_id):
            if j == '*':
                continue
            if i!=j:
                return False
        return True


def solution(user_id, banned_id):
    answer=[]
    users_list =permutations(user_id,len(banned_id))
    for users in users_list:
        count = 0
        # zip으로 매칭되는 숫자를 세고, 그게 전체 길이랑 맞으면
        # 하나의 일대일 대응을 만들어 내는 것으로 간주
        for a, b in zip(users, banned_id):
            if check(a,b):
                count+=1
        if count == len(banned_id):
            if set(users) not in answer:
                answer.append(set(users))
    return len(answer)

[출처]

https://bladejun.tistory.com/49

'PS > Programmers' 카테고리의 다른 글

[프로그래머스] 보석 쇼핑 파이썬 풀이  (0) 2021.12.09
[프로그래머스] 셔틀버스  (0) 2021.12.08
[프로그래머스] 자물쇠와 열쇠 파이썬  (0) 2021.11.28
[프로그래머스] 순위  (0) 2021.11.27
[프로그래머스] 네트워크 파이썬  (0) 2021.11.27

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [프로그래머스] 보석 쇼핑 파이썬 풀이

    [프로그래머스] 보석 쇼핑 파이썬 풀이

    2021.12.09
  • [프로그래머스] 셔틀버스

    [프로그래머스] 셔틀버스

    2021.12.08
  • [프로그래머스] 자물쇠와 열쇠 파이썬

    [프로그래머스] 자물쇠와 열쇠 파이썬

    2021.11.28
  • [프로그래머스] 순위

    [프로그래머스] 순위

    2021.11.27
다른 글 더 둘러보기

정보

자라자 블로그의 첫 페이지로 이동

자라자

  • 자라자의 첫 페이지로 이동

검색

메뉴

  • 🏠 HOME
  • 💡 ABOUT
  • 💻 GITHUB

카테고리

  • 분류 전체보기 (91)
    • Tech Note (3)
    • Dev Log (11)
    • Study Log (11)
    • Settings (3)
    • PS (53)
      • Programmers (21)
      • BOJ (32)
    • Diary (10)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • 공식문서읽기
  • 리액트
  • ㅣ

나의 외부 링크

정보

자라자의 자라자

자라자

자라자

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © 자라자. Designed by Fraccino.

티스토리툴바