practivceAlgorithm/programmers 23

[Programmers][Python][2021 카카오 인턴십] 표 편집

우선순위 큐 두개를 이용해 가운데값을 k로 운용했습니다. 마지막에 left를 right로 굳이 안옮겨도됐을텐데 조금 아쉽습니다. 또 set을 썼으면 좀 더 출력부분이 깔끔한 반복문으로 처리됐을 것 같습니다. 다른 분들은 연결리스트를 구현하신분들이 많았습니다. from heapq import heappop, heappush def solution(n, k, cmd): left, right, delete = [-i for i in range(k-1, -1, -1)], [i for i in range(k, n)], [] for command in cmd: c, *num = command.split() if c == 'U': cnt = int(num.pop()) for _ in range(cnt): heappu..

[Programmers][Python][2021 카카오 인턴십] 거리두기 확인하기

각 지점에서 거리 2까지만 확인해주면 됩니다. 거리두기 안지켰으면 바로 return False 해줍니다. delta = ((0, 1), (1, 0), (0, -1), (-1, 0)) def is_check(place): q = [] for i in range(5): for j in range(5): if place[i][j] == 'P': q.append((i, j, 0, set())) while q: x, y, dist, visited = q.pop() visited.add((x, y)) for dx, dy in delta: nx, ny = x + dx, y + dy if 0

[Programmers][Python] KAKAO 2018 N진수 게임

진법수로 변환할때 맨 앞부터 채울 생각을 했는데 다른 사람들 풀이보니 전부 뒷자리부터 채웠다.. 생각해보니 그렇게 해도 전혀 상관없는데 나는 무슨짓을 한건지.. def solution(n, t, m, p): answer = '' parse_table = {i: hex(i)[2:].upper() for i in range(16)} p -= 1 tmp = '0' num = 1 while len(tmp) = k: k *= n k //= n now = num while k: a = now // k tmp += parse_table[a] now -= a * k k //= n num += 1 for i in range(p, p + t * m, m): answer..

[Programmers][Python] KAKAO 2018 파일명 정렬

파일이름 뒤에 f를 붙혀 tail없는 예외를 없앤 후 head, number를 heap에 넣은 후 뽑아내며 정렬 from heapq import heappop, heappush def solution(files): answer = [] sort_arr = [] for pos, each_file in enumerate(files): tmp = each_file + 'f' flag = 0 for idx, char in enumerate(tmp): if not flag and char.isdigit(): start = idx flag = 1 elif flag and not char.isdigit(): end = idx break head, number = each_file[:start], each_file[s..

[Programmers][Python] KAKAO 2018 방금그곡

문제조건에는 E#없는데 이거 처리 안하면 27번테케 틀림..조심할것. parse_set = {'C#': 'a', 'D#': 'b', 'F#': 'c', 'G#': 'd', 'A#': 'e', 'E#': 'k'} def parse_scale(music): parsed = [] for idx in range(len(music)): if music[idx] == '#': parsed.append(parse_set[parsed.pop()+music[idx]]) else: parsed.append(music[idx]) return ''.join(parsed) def make_time(time): a, b = time.split(':') return int(a) * 60 + int(b) def solution(m,..

[Programmers][Python] KAKAO 2018 압축

idx하나씩 늘려주며 문자열 사전에 추가하고 -1한 글자의 사전값은 answer에 추가 def solution(msg): msg += '.' answer = [] dic = {chr(i + ord('A')): i + 1 for i in range(26)} idx, last_idx = 0, len(msg) - 1 new_hash = 27 while idx < last_idx: start = msg[idx] while idx < last_idx and start in dic: idx += 1 start += msg[idx] answer.append(dic[start[:-1]]) dic[start] = new_hash new_hash += 1 return answer

[Programmers][Python] KAKAO 2018 프렌즈 4블록

자주나오는 유형. 규칙에따라 블록 부수고 중력작용. def bomb_block(b, m, n): block = set() for i in range(m - 1): for j in range(n - 1): if b[i][j] and b[i][j] == b[i][j + 1] == b[i + 1][j] == b[i + 1][j + 1]: for dx, dy in [(0, 0), (1, 0), (0, 1), (1, 1)]: nx, ny = i + dx, j + dy block.add((nx, ny)) if not block: return 0, 0 for x, y in block: b[x][y] = 0 new_board = [[0] * n for _ in range(m)] for j in range(n): idx..

[Programmers][Python] KAKAO 2018 뉴스클러스터링

처음푼줄 알았는데 예전에 풀었었다.. 교집합, 합집합으로 간단히 풀린다. def make_set(s): a = set() for i in range(len(s) - 1): now = s[i:i+2] if now.isalpha(): while now in a: now += '1' a.add(now) return a def solution(str1, str2): str1, str2 = str1.lower(), str2.lower() a = make_set(str1) b = make_set(str2) if not a | b: return 65536 return len(a & b) * 65536 // len(a | b)

[Programmers][Python] KAKAO 2019 실패율

정렬 후 upperbound, lowerbound로 분모는 전체 - lowerbound 분자는 upperbound - lowerbound 로 실패율 연산 후 최대힙으로 정렬 from bisect import bisect_left, bisect_right from heapq import heappush, heappop def solution(N, stages): answer = [] stages = sorted(stages) cnts = [] for i in range(1, N + 1): left = bisect_left(stages, i) right = bisect_right(stages, i) total = len(stages) - left failure_rate = (right - left) / to..

[Programmers][Python] KAKAO 2019 오픈채팅방

dictionary로 저장해서 최후에 저장된 값으로 출력조정했습니다. def solution(record): answer = [] users = {} for log in record: command, *user = log.split() if command == 'Enter' or command == 'Change': user_id, nickname = user users[user_id] = nickname for log in record: command, *user = log.split() if command == 'Enter': user_id, nickname = user answer.append(f'{users[user_id]}님이 들어왔습니다.') elif command == 'Leave': ans..