Algorithm/Programmers

    [프로그래머스] k번째수 / 자바스크립트 / JavaScript

    🎫code ) function solution(array, commands) { var answer = []; for (let i=0; i {return(a-b)}); answer.push(list[commands[i][2]-1]); } return answer; } 📌 description ) 문제출처 : programmers.co.kr/learn/courses/30/lessons/42748?language=javascript 코딩테스트 연습 - K번째수 [1, 5, 2, 6, 3, 7, 4] [[2, 5, 3], [4, 4, 1], [..

    [프로그래머스] 베스트앨범 / 파이썬 / Python / 해시

    💫solutions ) 💬 defaultdict, heapq 모듈 사용 👩‍💻 code ) from collections import defaultdict import heapq def solution(genres, plays): gen = defaultdict(list) cnt = defaultdict(int) for i in range(len(genres)): heapq.heappush(gen[genres[i]], (-plays[i], i)) cnt[genres[i]] += plays[i] cnt_lst = [] for k, v in cnt.items(): cnt_lst.append((v, k)) cnt_lst.sort(key=lambda x: -x[0]) answer = [] count = 0 fo..

    [프로그래머스] 예상 대진표 / 파이썬 / Python / round()

    💡solutions ) 💬 파이썬의 반올림 round( ) 함수를 사용해서 그 다음 라운드 진출 시 부여받는 숫자 번호를 구해내는 로직. 💬 이때 주의해야 할 점은 반올림한 자리의 앞자리 숫자가 짝수이냐 홀수이냐에 따라 반올림한 값이 달라진다는 점이다. 따라서 앞자리 숫자가 짝수인 경우는 반올림한 값에 +1씩 더해준다. 💬 아래 파이썬의 반올림 규칙을 참고하자. 🔶 파이썬의 round()함수는 사사오입 원칙을 따른다. 반올림 자리의 수가 5일 때 앞자리가 짝수 -> 내림 -> e.g.) round(4.5) = 4 앞자리가 홀수 -> 올림 -> e.g.) round(3.5) = 4 🎫code ) def solution(n, a, b): answer = 0 while a != b: answer += 1 r_..

    [프로그래머스] 짝지어 제거하기 / 파이썬 / Python

    💡solutions ) 💬 처음 작성했던 코드에서 슬라이싱으로 문자열을 업데이트 했는데 시간초과 나서 통과하지 못했다. 💬 다음으로 구현한 코드는 stack을 만들어서 문자를 하나씩 append()로 넣어주고 짝을 만난 경우에는 pop()으로 제거해주었다. 💬 마지막 문자열의 길이를 재고 0이면 1리턴, 0이 아니면 0을 리턴한다. 🎫code ) 🔶 효율성 테스트에서 시간 초과로 통과하지 못한 코드 # 시간 초과 코드 def solution(s): if len(s) % 2 == 1: return 0 idx = 0 while True: if len(s) == 0: return 1 if idx > len(s) - 2: return 0 if s[idx] == s[idx + 1]: if idx == 0: s =..

    [프로그래머스] 땅따먹기 / 파이썬 / Python / 동적 프로그래밍(DP)

    💡solutions ) 💬 동적프로그래밍 문제이다. 💬 1행(i+1이니)부터 시작해서 각 행열 요소마다, 그 이전 행에서 자신과 열이 같지 않은 열들 중 최댓값을 더해준다. 💬 마지막 행의 최댓값이 결과값이 된다. 🎫code ) def solution(land): for i in range(len(land)-1): land[i+1][0] = max(land[i][1:4]) + land[i+1][0] land[i+1][1] = max(land[i][0], max(land[i][2:4])) + land[i+1][1] land[i+1][2] = max(max(land[i][0:2]), land[i][3]) + land[i+1][2] land[i+1][3] = max(land[i][0:3]) + land[i+1..

    [프로그래머스] 가장 큰 정사각형 찾기 / 파이썬 / Python / 동적 프로그래밍(DP)

    💡solutions ) 💬 동적 프로그래밍(DP)를 활용해서 문제를 풀것. 브루트 포스 알고리즘으로 풀면 효율성 테스트를 통과하지 못함 💬 동적 계획법(Dynamic Programming)이란? 동적 프로그래밍은 “전체 문제를 작은 문제로 단순화한 다음 점화식으로 만들어 재귀적인 구조를 활용해서 전체 문제를 해결하는 방식” 이다. 불필요한 계산을 줄이고, 효율적으로 최적해를 찾을 수 있다. 💬 분할 정복과 동일한 점은 전체 문제를 작은 단위로 문제로 푼다는 것지만, 차이점은 중복의 유무이다. 분할 정복은 작은 문제끼리 중복이 없고, 동적 프로그래밍은 중복이 있다. 🎫code ) def solution(board): r = len(board) c = len(board[0]) for i in range(1,..

    [프로그래머스] 행렬의 곱셈 / 파이썬 / Python

    💡solutions ) 💬 예를 들어, AXB 행렬과 BXC 행렬의 곱셈 -> 두 행렬에서 B의 자리가 같은 숫자일 때만 곱셈이 가능하며 -> 곱셈의 결과는 AXC행렬이 된다. 💬 아래 코드에서 answer은 곱셈의 결과가 되는 AXC행렬이고, 💬 i가 A / j가 C / k가 B로 삼중 반복문으로 행렬의 곱셈을 구현했다. 🎫code ) def solution(arr1, arr2): r = len(arr1) c = len(arr2[0]) answer = [[0]*c for _ in range(r)] for i in range(r): for j in range(c): for k in range(len(arr1[0])): answer[i][j] += arr1[i][k]*arr2[k][j] return ans..

    [프로그래머스] N개의 최소공배수 / 파이썬 / Python

    💡solutions ) 💬 주어진 숫자 리스트를 오름차순으로 정리한 후 가장 큰 값인 max를 구한다. 💬 나머지 숫자들이 max의 약수인지 먼저 확인하고, 약수가 아닌 경우 max의 그 다음 배수를 확인하는 과정을 반복한다. -> 나머지 숫자들이 모두 약수가 되는 경우가 모든 숫자에 대한 최소공배수가 된다. (max의 배수는 max가 이미 약수가 된다.) 🎫code ) def solution(arr): answer = 0 arr.sort() max = arr[-1] answer = max while True: for i in range(len(arr)-1): if answer % arr[i] != 0: break else: return answer answer += max 📌 description ) ..

    [프로그래머스] 삼각 달팽이 / 파이썬 / Python / 월간 코드 챌린지 시즌1

    💡solutions ) 💬 피라미드 배열 만들고, 삼각형을 기준으로 if문 처리 (각 선분에 해당하는 3가지 조건으로 처리) 💬 해당 문제를 풀면서 list index out of range가 많이 나서 고생을 좀 했다..!!!!😂 💬 인덱스 에러가 나지 않게 while문 안에서 break 조건을 적절히 넣어줘야 한다 ->j, k 범위를 체크하거나 arr[j][k] 값이 있는지 확인하는 조건을 넣었음 💬 최근 본 코테에서 2차원 배열 리스트를 활용하는 문제가 나왔는데 상당히 어렵게 느껴졌다. 해당 유형의 문제를 더 연습해야겠다! 🎫code ) def solution(n): arr = [[0] * _ for _ in range(1, n + 1)] num = 1 j = 0 k = 0 for i in rang..

    [프로그래머스] n진수 게임 / 파이썬 / Python / 2018 KAKAO BLIND RECRUITMENT

    💡solutions ) 💬 진수 변환을 잘 몰랐는데 이번 문제 풀면서 정확히 알게 됐다. 해당 진수로 숫자를 나누며 나머지를 누적하는 방식. 💬 진수 변환 함수는 재귀로도 풀 수 있는데 이번에는 while 반복문을 이용해서 구했고, 이때 0인 경우를 빼먹지 않기 위해 if조건문을 넣어야 한다. 💬 solution 함수에서 두 가지 for문 ① 첫 번째는 t*m까지의 숫자를 진수 변환 해주는 것. ② 두 번째는 튜브가 말해야 하는 숫자만 찾는 것. 🎫code ) def change(num, n): numbers = '0123456789ABCDEF' r = '' if num == 0: return '0' while num > 0: r = numbers[num % n] + r num = num // n ret..

    [프로그래머스] 영어 끝말잇기/ 파이썬 / Python/ Summer/Winter Coding(~2018)/ 카카오 코테

    💡solutions ) 💬 로직은 크게 끝말잇기가 유효한지 for문을 돌며 확인 -> 불가능한 경우는 총 2가지(이미 말한 단어를 다시 말한 경우와 앞단어의 마지막과 뒷단어의 첫 번째가 같지 않은 경우) * 번호와 차례를 구할 때는 아랫처럼 구하고자 하는 정확한 값이 나오도록 덧셈 처리 💬 번호를 나타내는 idx는 i를 n으로 나눈 나머지에 +1를 해주기 💬 차례를 나타내는 cnt는 n의 배수 번째인지 아닌 지에 따라 분기 처리해야 함 🎫code ) def solution(n, words): tmp = [words[0]] # 첫 번째 단어는 먼저 넣고 시작 for i in range(1, len(words)): # 두 번째 단어부터 시작해서 끝말잇기 유효한지 확인 if words[i - 1][-1] !=..

    [프로그래머스] 캐시/ 파이썬/ Python/ deque/ LRU / 2018 KAKAO BLIND RECRUITMENT /카카오 코테

    💡solutions ) LRU(Least Recently Used) 알고리즘 : 가장 최근에 사용되지 않은 것이라는 의미로, 오랫동안 사용하지 않았던 데이터는 앞으로도 사용할 확률이 적다는 것이다. 이는 한정된 캐시 사이즈가 꽉 차고 새로운 캐시를 넣으려고 할 때, 기존 캐시 중 최근까지 가장 사용되지 않은 데이터를 제거하는 알고리즘이다. 💬 첫 번째 if문 -> cacheSize가 0인 경우 참조하는 값이 없으므로 cities 모든 요소가 cache miss로 실행시간이 5이다. 💬 대소문자 구분하지 않으니 모두 소문자로 처리 -> lower() 메소드 💬 for문 -> 각 city가 buffer에 있는 지 확인하는데 ① 없는 경우 buffer가 cacheSize만큼 꽉 차 있는 지 확인한다. - ca..