티스토리 뷰
반응형
📎 간략한 문제 정리
- 입력된 사용자 목록에서 불량 사용자 목록에 등록된 아이디를 제거합니다. 불량 사용자 목록에 있는 아이디는 정확한 아이디가 아니라 *를 사용한 아이디로 *에는 어떠한 문자가 들어가든 다른 문자가 매칭되면 제거합니다. 이렇게 제거 가능한 아이디 조합의 종류를 찾는 문제입니다.
📈 문제 분석
- 문제가 어렵지 않아 보이지만 보기보다 난이도가 있는 문제입니다. 계속 가능성을 제외하는 좋은 로직을 생각하는 함정에 빠지면 구현에서 문제가 생깁니다. 한번에 모든 문제를 해결하려는 로직을 구현할 수 있다면 이상적이지만 언제나 완전 탐색의 가능성을 배제하면 안됩니다.
🙋♂️ 내가 처음 생각한 해결 방법
- 수학적으로 계산하려고 했습니다. 가능성이 있는 모든 경우를 찾아 교집합 부분을 제거하려고 했는데 이 방법은 불량 사용자 아이디가 2개 일때는 쉽게 가능하지만 그 개수가 늘어나면 문제가 발생합니다. 수학적으로 교집합의 가능성이 매우 늘어나 모든 것을 계산하기 힘들기 때문입니다.
💻 풀이한 코드
def is_check(criterion, target):
import re
if len(criterion) != len(target):
return False
p = re.compile(criterion.replace("*", "."))
if p.match(target):
return True
else:
return False
def check_ids(user_id_list, banned_id_list):
for i in range(len(banned_id_list)):
if not is_check(banned_id_list[i], user_id_list[i]):
return False
return True
def solution(user_id, banned_id):
from itertools import permutations
cache = set()
test_cases = permutations(user_id, len(banned_id))
for test_case in test_cases:
if check_ids(test_case, banned_id):
cache.add(tuple(sorted(test_case)))
return len(cache)
📝 해결 과정에서 만난 문제, 고민들
예시를 한가지만 보고 문제 해결법을 생각하다보면 문제가 생기기 쉽습니다. 로직을 구현할 때 너무 단편적인 로직만 생각하는 것이 아니라 다른 예시에도 적용되는지 볼 필요가 있습니다.
정규표현식을 구현할 때 문제가 있었습니다.
"a*c" <-> "abc" # 매칭 "a*c" <-> "bcc" # 매칭 안됨 "a*c" <-> "abcd" # 매칭됨
정규표현식을 사용하면 기준 문자열의 길이까지 매칭되면 문자열이 더 길어도 참을 반환하는 문제가 있었습니다. 이것을 해결하려고 정규표현식의 문법을 더 학습했지만 생각해보면 조건에서 길이가 다르면 절대 성립이 안되기때문에 앞선 조건으로 처리 가능했습니다.
문제의 조건 범위를 무시하면 안됩니다. 문제를 보면 달려들어 효율적인 방법을 생각하는 습관이 있는데 이렇게 되면 오히려 해결법에 문제가 발생합니다. 범위는 다음과 같은 힌트가 될 수 있습니다.
100억 같이 매우 높은 숫자 -> 이분 탐색 가능성 생각
10만 -> 쉽게 생각하면 O(N^2)이지만 효율적인 연산으로 O(NlogN)으로 처리해야됨
10,000 이하의 매우 작은 수 -> 완전 탐색을 고려
50 이하의 매우 작은 수 -> 순열, 조합 등을 사용한 완전 탐색을 고려
반응형
'알고리즘 학습 > 프로그래머스' 카테고리의 다른 글
[Programmers] - 완주하지 못한 선수 (해시) with Python (0) | 2022.03.23 |
---|---|
[Programmers] - 모음사전 (위클리 챌린지) with Python (0) | 2022.02.17 |
[Programmers] - 보석 찾기 (2020 카카오 인턴십) with Python (0) | 2021.05.05 |
[Programmers] - 수식 최대화 (2020 카카오 인턴십) with Python (0) | 2021.05.04 |
[Programmers] - 키패드 누르기 (2020 카카오 인턴십) with Python (0) | 2021.05.01 |
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 종이자르기#분할정복#BOJ#Python
- 토마토#백준알고리즘#Python
- Brackets#Stacks and Queues#Codility#Python
- 나무자르기#BOJ#이분탐색#Python
- 텀 프로젝트#백준알고리즘#Python
- 리모컨#완전탐색#BOJ#Python
- 날짜 계산#BOJ#완전탐색#Python
- 터틀비치#리콘#xbox#controller
- Swift#Tuples#Range
- PassingCars#Codility#Python
- filter#isalnum#lower
- 섬의개수#백준알고리즘#Python
- 파이썬알고리즘인터뷰#4장
- 랜선자르기#이분탐색#BOJ#Python
- django
- Triangle#Sorting#Codility#Python
- API#lazy#
- 미로 탐색#백준알고리즘#Python
- 공유기 설치#BOJ#이분탐색#Python
- 반복수열#백준알고리즘#Python
- 병든 나이트#BOJ#탐욕법#Python
- django#slicing
- 순열사이클#BOJ#Python
- NumberofDiscIntersections#Codility#Sort#Python
- 쿼드트리#BOJ#분할정복#Python
- 배열합치기#분할정복#BOJ#Python
- 암호코드#dp#BOJ#Python
- 백준 알고리즘#BackTracking
- Distinct#Codility#Python
- N으로 표현#DP#Programmers#Python
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함