Algorithm/Programmers
[프로그래머스] n진수 게임 / 파이썬 / Python / 2018 KAKAO BLIND RECRUITMENT
💡solutions ) 💬 convert 함수를 구현하여 진수 변화하였음 -> 이때 재귀함수로 구현하는 경우가 많은데 여기선 while 반복문을 통해 구현하였음 이때 k가 0일 때를 고려하기 위해 res 문자열에 0을 초기값으로 넣어주고 시작하였음 👨💻code ) def convert(k, n): base = '' remain = '0123456789ABCDEF' while k > 0: k, mod = divmod(k, n) base += remain[mod] base = base[::-1] return base def solution(n, t, m, p): res = '0' for i in range(t*m): res += convert(i, n) cnt = 0 answer = '' for i in ..
[프로그래머스] 괄호 회전하기 / 파이썬 / Python / 월간코드챌린지 시즌2
💡solutions ) 💬 stack에 괄호를 하나씩 저장하며 올바른 괄호가 되는지 확인하는 로직 구현. 💬 오른쪽 괄호(닫는 괄호)가 나오면 stack에 이미 저장했던 마지막 -1번째 괄호와 짝이 맞는지 확인하며 올바른 괄호인지 판단. 💬 첫 번째 if 조건문에서는 stack이 비어있을 때 오른쪽 괄호(닫는 괄호)가 나오면 올바른 괄호 모양이 아니므로 바로 break하여 다음 케이스로 넘어감. 💬 처음에 테스트케이스 13번만 틀려서 질문하기를 참고하여음. {{{{{의 경우에 통과할 수 있도록 마지막 if 조건문에서 and not stack 조건을 넣어 stack이 최종적으로 비어 있는 경우에만 올바른 괄호로 카운트할 수 있도록 함. 👨💻code ) def solution(s): bracket_dict..
[프로그래머스] 오픈채팅방 / 파이썬 / Python / 2019 KAKAO BLIND RECRUITMENT
💡solutions ) 💬 userid와 name을 담는 딕셔너리를 사용하여 -> userid로 유저들을 구분하여 name을 업데이트해줌 💬 results 리스트에는 이름을 변경하는 Change를 제외하고 채팅방을 들어오거나 나가는 경우에만 id와 Enter, Leave 명령어를 튜플 형태로 함께 넣는다. 💬 results에 넣어뒀던 순서대로 출력하는데 이때 userid를 사용하여 id_name_dict에서 해당 유저의 이름을 꺼내서 출력한다. 👨💻code ) def solution(records): id_name_dict = {} results = [] answer = [] for record in records: record_lst = record.split(' ') if record_lst[0] ..
[프로그래머스] 전화번호 목록 / 파이썬 / Python / 문자열 정렬
💡solutions ) 💬 sorted()메소드를 사용하여 phone_book을 먼저 정렬한다 -> 문자열 정렬이기 때문에 12, 120, 13 이런식으로 정렬된다. 숫자의 절대적인 크기가 아닌 사전 정렬 방식으로 정렬된다. 💬 정렬이 됐다면 첫 번째 전화번호부터 탐색을 시작하는데, 그 뒤 바로 인접한 전화번호의 접두어가 되는지 비교한다. 💬 이때 인접한 전화번호만 비교하면 되는 이유는 사전방식으로 문자열을 이미 정렬했기 때문이다. 예를 들어 12, 139, 160 식으로 정렬이 되기 때문에 12와 139를 비교했을 때 12가 139의 접두어가 되지 못한다면 12는 그 다음 전화번호인 160의 접두어도 마찬가지로 되지 못하기 때문에 비교할 필요가 없다. 👨💻code ) def solution(phone..
[프로그래머스] 거리두기 확인하기 / 파이썬 / Python / 2021카카오 인턴십 코딩테스트
💡solutions ) 💬 대기실의 각 칸을 하나의 정점으로 보고, 응시자들이 있는 정점을 기준으로 bfs 그래프 탐색을 진행함. 💬 각 정점에서 인접하여 연결된 간선들을 탐색하는데 파티션이 있는 경우는 지나가지 못하고, 거리 2이내의 정점들만 살펴보며 다른 응시자의 유무를 확인함. 💬 이때 지나간 정점은 다시 지나가지 않기 위해 visit 배열을 통해 중복을 체크함. 👨💻code ) from collections import deque dx, dy = [-1, 1, 0, 0], [0, 0, -1, 1] # 상하좌우 def bfs(place, i, j): visit = [[0]*5 for _ in range(5)] q = deque() q.append((i, j, 0)) visit[i][j] = 1 w..
[프로그래머스] 숫자 문자열과 영단어 / 파이썬 / Python / 2021 카카오 채용연계형 인턴십
💡solutions ) 💬 숫자 10개를 딕셔너리 형태로 담아서 구분해주었음 💬 주어진 s에서 숫자가 나오면 result에 바로 넣어주고 문자가 나오면 num에 차례대로 임시 저장했다가 num_dic 딕셔너리에 있는 숫자가 되면 result에 넣어주고 num은 초기화 👨💻code ) def solution(s): num_dic = { 'zero':'0', 'one':'1', 'two':'2', 'three':'3', 'four':'4', 'five':'5', 'six':'6', 'seven':'7', 'eight':'8', 'nine':'9'} result = '' num = '' for i in range(len(s)): tmp = s[i] if tmp.isdigit(): result += tmp e..
[프로그래머스] 행렬 테두리 회전하기 / 파이썬 / Python
💡solutions ) 💬 단순히 구현하는 시뮬레이션 문제 💬 테두리 영역의 숫자들을 회전시키기 위해 for문에서 인덱스 범위를 잘 구분하는 것이 중요함 💬 Python에선 두 변수를 한번에 swap이 가능하다 -> e.g) a,b = b,a로 a와 b값 교환 가능 👨💻code ) def solution(rows, columns, queries): arr = [[0]*columns for _ in range(rows)] cnt = 1 result = [] for i in range(rows): for j in range(columns): arr[i][j] = cnt cnt += 1 for r1, c1, r2, c2 in queries: min_v = 10001 before = arr[r1][c1-1] ..
[프로그래머스] 배달 / 파이썬 / Python / Dijkstra
💡solutions ) 💬 다익스트라 알고리즘을 사용하여 최단 거리를 구하는 로직 💬 처음 시작하는 노드 1에서의 최단 거리는 0으로 초기화 💬 인접행렬 만들고 -> heappush를 통해 최단 거리 순으로 정렬 -> 최단 거리가 될 때마다 거리를 저장해 놓는 리스트인 dis 업데이트 👨💻code ) import heapq def dijkstra(dis, adj): heap = [] heapq.heappush(heap, [0, 1]) while heap: cost, node = heapq.heappop(heap) for c, n in adj[node]: if cost + c < dis[n]: dis[n] = cost + c heapq.heappush(heap, [cost + c, n]) def solu..
[프로그래머스] 합승 택시 요금 / 파이썬 / Python / Dijkstra / 2021 KAKAO BLIND RECRUITMENT/ 카카오 코테
💡solutions ) 💬 다익스트라(Dijkstra) 알고리즘을 사용하여 문제를 풀었다. 💬 다음 두 가지 경우를 모두 포함하여 최소 비용을 구해야 하는 문제다. (1) 무지와 어피치가 따로 택시를 타고 가능 경우 (2) 특정 지점까지 함께 이동 후 각자 목적지까지 가는 경우 -> 이때 둘 중 한사람이 나머지 한사람을 데려다 주고 본인 집으로 이동하는 경우도 포함된다. 💬 카카오 테크 블로그에 따르면, 다익스트라와 플로이드와샬 두 가지 방법으로 해결 가능하다. 추후 플로이드와샬로도 풀어봐야겠다. 👨💻code ) import heapq def dijkstra(adj, num, s, e): heap = [] heapq.heappush(heap, [0, s]) INF = float('inf') dist =..
[프로그래머스] 순위 검색 / 파이썬 / Python / 2021 KAKAO BLIND RECRUITMENT / 카카오 코테 기출
💡solutions ) 💬 해당 문제는 정확성과 효율성 모두 만족해야 하는 문제다. 💬 처음 작성했던 코드는 정확성만 통과했고, 효율성을 만족하지 못했다. for문을 통해 주어진 query정보와 info를 모두 비교하여 만족하는 지원자가 몇 명인지 구하면 정확성은 쉽게 풀 수 있다. 💬 문제는 효율성. 혼자서 해결하지 못해서 '카카오 테크 블로그'와 다른 분의 풀이를 참고하며 해결 방법을 생각해봤다. 💬 먼저, 해시맵을 활용해 지원자들의 정보를 미리 저장해두는 로직이 필요했다. -> 주어진 info 정보를 key값으로 점수를 value로 하여 딕셔너리에 저장 -> 하나의 info에 총 16가지의 경우의 수가 만들어진다. -> info에서 '-'를 고려하는 경우는 따로 '-'문자를 넣지 않고 주어진 inf..
[프로그래머스] 신규 아이디 / 파이썬 / Python / 2021 KAKAO BLIND RECRUITMENT / 카카오 코테 기출
💡 solutions ) 💬 시뮬레이션 문제로, 주어진 7단계를 차례대로 코드로 구현하면 해결할 수 있는 문제 👨💻 code ) def solution(new_id): chk_letter = ['-', '_'] new_id = new_id.lower() # 소문자 변환 res = '' for item in new_id: if item.isdigit(): res += item elif item.isalpha(): res += item elif item in chk_letter: res += item elif item == '.': # '.'이 2번 이상인지 확인 if len(res) != 0: if res[-1] != '.': res += '.' else: res += '.' # 처음과 끝 마침표 확인 ..
[프로그래머스] 문자열 다루기 기본 / 자바스크립트 / JavaScript
💡solutions ) 💬 parseInt 사용 -> 문자열을 정수로 바꿔주는 메소드 💬 isInteger 사용 -> 전달된 값이 정수인지 확인하는 메소드 🎫code ) function solution(s) { var answer = false; if(s.length === 4 || s.length === 6){ for(var i=0; i