no image
[파이썬] 프로그래머스 올바른 괄호
프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 [ic]([/ic] 괄호가 나올 때만 스택에 저장해뒀다가, [ic])[/ic] 괄호가 나오면 pop()을 진행해 제거했다. pop() 과정에서 런타임 오류가 발생하지 않도록, 짝이 불가능한 경우 False를 바로 반환했다. def solution(s): # 짝 확인 stack = [] for char in s: if char == "(": stack.append(char) else: # 짝 불가능 if len(stack) == 0: return False else: stack.pop() return..
2022.11.01
no image
[파이썬] 프로그래머스 여행경로
프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 가능한 여러 경로를 얻고, 이 중에서 가장 앞서는 경로를 찾는 것이 핵심이다. 이중에서 가장 앞서는 경로를 처리하는데 어려움을 느껴 다른 사람의 풀이를 참고했다. 백트래킹 활용 현재 위치 정보를 전달해서 중복된 방문을 제한했다. [ic]path[/ic] 들을 저장해둔 [ic]answer[/ic]를 정렬하면서 가장 앞서는 경로를 얻을 수 있었다. from collections import defaultdict def solution(tickets): # 방문 여부 visited = defaultdic..
2022.10.31
no image
[파이썬] 백준 N과 M (4)
15652번: N과 M (4) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해 www.acmicpc.net 나의 풀이 오름차순이라는 조건을 만족시키기 위해서 [ic]get_num[/ic] 함수를 통해 최소 값을 전달해줬다. def get_num(k, min): if k == m: print(*num_list) return # 최소 값을 전달 for i in range(min, n + 1): num_list[k] = i get_num(k + 1, i) def solution(): global n global m n, m = map(int, input().split())..
2022.10.25
no image
[파이썬] 백준 N과 M (2)
15650번: N과 M (2) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해 www.acmicpc.net 나의 풀이 수열이 오름차순인지 확인하기 위해서, 정렬 전후가 같은지 체크하는 방식으로 풀었다. 답은 맞았지만, 가능성이 없는 수열도 불필요하게 계산된다는 단점이 있다. def get_num(k): # 수열이 완성된 경우 if k == m: if sorted(num_list) == num_list: print(*num_list) return # 수열에 원소 저장 for i in range(1, n + 1): if not isused[i]: num_list[k] =..
2022.10.21
no image
[파이썬] 백준 N과 M (1)
15649번: N과 M (1) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해 www.acmicpc.net 나의 풀이 백트래킹 유형 기본 문제라고 하는데, 어려워서 풀이를 참고하면서 풀었다. 원소 사용 여부를 저장하는 것이 핵심이었다. def get_num(k): # 수열이 완성된 경우 if k == m: print(*num_list) return # 수열에 원소 저장 for i in range(1, n + 1): if not isused[i]: num_list[k] = i isused[i] = 1 get_num(k + 1) # 사용 후 제거 isused[i] = 0..
2022.10.21
no image
[파이썬] 프로그래머스 단어 변환
프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 단어를 변환하려면 1 글자만 달라야 하기 때문에, 이를 이용해서 그래프를 구성한 다음에 BFS로 탐색했다. from collections import deque def bfs(start, end, graph, visited): # 시작점 입력 + 방문 처리 queue = deque() queue.append([start, 1]) visited[start] = 1 while queue: node, cnt = queue.popleft() if node == end: return cnt else: for..
2022.10.11
no image
[파이썬] 프로그래머스 게임 맵 최단거리 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 최단 거리를 구하기 위해서 BFS를 활용했다. # 최단 거리 반환 from collections import deque def bfs(maps, x, y): # 다음에 방문할 지점 저장 next_visit = deque() next_visit.append([x, y]) # 방향 설정 dx = [-1, 1, 0, 0] dy = [0, 0, -1, 1] # 방문 시작 while next_visit: x, y = next_visit.popleft() # 이동 for i in range(4): ..
2022.10.07
no image
[파이썬] 프로그래머스 타겟 넘버
프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 기존에 DFS, BFS를 시뮬레이션에서만 활용했어서 간단한 문제임에도 못 풀었다. DFS를 활용할 때, 어떤 값을 넘겨줄 지가 정확히 설계하는 것이 중요함을 깨달았다. DFS를 재귀, stack 방식 모두를 활용해 구현해봤다. from collections import deque def dfs(num_sum: int, idx: int, max_idx: int, numbers: list, target: int): global answer # DFS 진행 동안 answer 값 증가 if idx == m..
2022.10.03
no image
[파이썬] 프로그래머스 H-Index
프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 각 h마다 추가되는 인용문 개수를 이분 탐색으로 찾아서 더했다. from bisect import bisect_left, bisect_right def solution(citations): citations.sort() # h ~ 0까지 가능 cum_sum = dict(zip(range(len(citations)), [0] * len(citations))) # h보다 더 많이 인용된 논문 개수 temp_sum = sum([1 for i in citations if i > len(citations)]..
2022.10.02
no image
[파이썬] 프로그래머스 성격 유형 검사하기
프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 우선 순위가 동일할 경우를 대비해 미리 알파벳 순으로 answer에 입력했다. def solution(survey, choices): # 미리 알파벳 순으로 정렬 answer = ["R", "C", "J", "A"] score = {"R":0, "T":0, "C":0, "F":0, "J":0, "M":0, "A":0, "N": 0} for s, c in zip(survey, choices): if c 4: score[s[1]] += ..
2022.10.01
no image
[파이썬] 프로그래머스 신고 결과 받기
프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 유저가 신고한 사용자 정보를 저장하는 대신, 유저를 신고한 사용자 정보를 저장했다. def solution(id_list, report, k): # 사용자를 신고한 유저 user_report = {} report = list(set(report)) # 신고 처리 for i in report: a, b = i.split(" ") # 신고 처리 if b not in user_report: user_report[b] = set() user_report[b].add(a) # 메일 개수 mail_cnt = ..
2022.10.01
no image
[파이썬] 프로그래머스 신규 아이디 추천
프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 조건이 까다로워서 정규 표현식으로 풀었다. [ic]+[/ic], [ic]^[/ic], [ic]$[/ic] 등 패턴을 익히느라 풀이까지는 시간이 조금 걸렸다. import re def solution(new_id): # 대문자 -> 소문자 new_id = new_id.lower() # 허용되는 문자만 받아오기 new_id = re.sub(r"[^0-9a-z-_.]", "", new_id) # .는 그대로 쓰면 문자 전체가 됨 new_id = re.sub(r"[.]+", ".", new_id) new_..
2022.09.27