Algorithm

    [프로그래머스] 키패드 누르기 /파이썬 /Python /2020 카카오 인턴십

    💡solutions ) ✅ 세 가지 경우로 나눈다 - #left 왼손가락을 움직이는 경우(1,4,7) - #right 오른손가락을 움직이는 경우(3,6,9) - #middle 가운데 번호인 경우에는 -> 각 두 손가락의 위치와 움직여야 하는 숫자 간의 거리를 구해서 값 비교하기(distance) ✅ 거리는 좌표를 활용해 맨하탄 거리로 구한다 -> distance 함수 구현 ✅ d_r(오른 손가락과의 거리)가 d_l(왼 손가락과의 거리)보다 크면 L 붙이기 (왼 손가락 이동), 그 반대도 성립 ✅ 만약 거리 차이가 같으면 왼손잡이인지 오른손잡이인지 판별 후 answer에 이동한 손가락 더하기 ✅ 테스트 케이스 8번 15번에서 자꾸 오류가 나서 덕봇기와 함께 살펴보니 처음 초기값 tmp_r과 tmp_l를 0..

    [프로그래머스] 튜플/ 파이썬/ Python/ 2019 카카오 개발자 겨울 인턴십

    💡solutions ) ✅ ',{'를 기준으로 집합별로 끊어준다(split) ✅ 문자 길이를 기준으로 정렬한다(sort) ✅ 집합에 들어 있는 원소들을 꺼내어 숫자인 경우에는 answer에 있는 지 확인 후 없으면 담아준다. ✅ 다른 사람 풀이를 찾아보다 보니, 정규 표현식을 활용한 경우가 있었다. 파이썬의 re(regular expression) 모듈을 사용, findall() 메서드를 통해 문자열을 검색할 수 있다. 이 문제에서는 i를 바로 re.findall("\d+", i)로 표현해 숫자값들만 찾아서 리스트에 담아줄 수 있다. 🎫code ) def solution(s): answer = [] a = s.split(',{') a.sort(key = len) tmp = '' for i in a: fo..

    [프로그래머스] 문자열 압축/ 파이썬/ Python/ 2020 KAKAO BLIND RECRUITMENT/ 카카오 블라인드 채용

    💡solutions ) ✅ slicing으로 문자열을 몇개씩 끊을 것인지 정해서 반복문으로 처리, 이때 범위는 len(s)//2+2인데, 전체 문자열의 범위 절반까지가 최대 압축 길이기 때문에 문자열 절반까지로 끊는다. 이때 문자열이 1인 경우를 고려하지 않아서 처음에는 len(s)//2 +1로 했다가 테스트 케이스 하나가 오류 났었다. 문자열 1인 경우를 포함하기 위해 len(s)//2+2로 수정했다. ✅ tmp는 기준 단위로 끊은 문자열을 비교를 위해 담아둔다. ✅ 그 다음 문자열부터 다시 반복문을 돌며 같은 단위의 문자열이 있는지 확인한 후 같으면 cnt+1, 다르면 tmp가 몇번 반복해서 나왔는지 cnt를 앞에 붙여서 res에 담아준다.(이때 cnt가 1이면 res에 tmp만 담기) ✅ 결국 답이..

    [프로그래머스] 프린터 /파이썬 / Python / deque

    💡solutions ) ✅ 스택에서 pop(0) 하는 것보다(시간복잡도 O(N)) deque 자료형으로 popleft()하는 게 훨씬 효율적이다(시간복잡도O(1)) ✅ 밸류 값과 인덱스 값을 함께 사용하므로 enumerate 함수 사용 ✅ item 보다 max 이 크다면 다시 배열에 담아주고, 그렇지 않은 경우 answer+1 ✅ item의 인덱스가 location이랑 동일하다면 반복문 종료 -> answer 반환 ✅ 다른 사람의 풀이를 확인해 보니 파이썬 내장함수 중 any를 사용해서 while문 안의 조건문을 짠 코드도 있었다. if any( item[0] item[0]: array.append(item) else: answer += 1 if item[1] == location: break retur..

    [프로그래머스] 더 맵게 /파이썬 /Python / heapq

    💡solutions ) ✅ 처음에 heapq 자료구조 사용하지 않고 sort를 했다가 런타임 에러가 떴었다. 다른 분들은 처음부터 heapq를 사용하시길 바란다. ✅ 참고로 heapq는 heappush, heappop을 할 때 자동으로 정렬을 해주어 효율성이 높아진다고 한다. 🎫code ) import heapq def solution(scoville, K): items = [] for i in scoville: heapq.heappush(items, i) cnt = 0 while items[0] < K: try: heapq.heappush(items, heapq.heappop(items)+(heapq.heappop(items)*2)) except: return -1 cnt += 1 return cnt ..

    [프로그래머스] 124 나라의 숫자 /파이썬 /Python

    💡solutions ) ✅ 삼진법 -> 3으로 나눈 후 나머지를 num 리스트의 인덱스로 사용한다. ✅ 나머지가 0이면 num[0] = 1, 나머지 1이면 num[1] = 2, 나머지 2이면 num[2] = 4 🎫code ) def solution(n): num = ['1','2','4'] answer = "" while n > 0: n -= 1 answer = num[n % 3] + answer n //= 3 return answer 📌 description ) 문제출처 : programmers.co.kr/learn/courses/30/lessons/12899?language=python3 코딩테스트 연습 - 124 나라의 숫자 124 나라가 있습니다. 124 나라에서는 10진법이 아닌 다음과 같은 자..

    [프로그래머스] 시저 암호 /파이썬 /Python

    💡solutions ) ✅ 대소문자 구분해준 후 ord 메소드로 아스키 코드 변환 -> 이때 마지막 Z를 벗어나는 경우는 26을 빼주어 다시 A로 돌아가 계산 -> chr 메소드로 다시 문자열 변환 ✅ 아래 아스키 코드표 참고 🎫code ) def solution(s, n): answer = '' s = list(s) for a in s: if a != ' ': num = ord(a) + n if 65 122: # 마지막 z 넘가는 경우 num = num - 26 res = chr(num) answer += res else: # 공백 문자 처리 answer += a return answer 📌 description ) 문제출처 : programmers.co.kr/learn/courses/30/lesson..

    [프로그래머스] 체육복 /파이썬 /Python

    💡solutions ) ✅ 체육복 현황을 보여주는 students 리스트를 만들어 놓음, 체육복 있는 경우 1 없는 경우 0으로 표시 ✅ 체육복 여분을 가지고 있는 학생이 체육복을 잃어 버린 경우 -> lost, reserve 배열에서 모두 제거 (즉, 여분의 체육복 본인이 가짐) ✅ reserve 리스트를 반복문 돌리며 여분의 체육복을 나눠줌 ✅ 인덱스 범위를 넘어가는 지 확인하는데 중복 방지를 위해 continue 달아주기 - 인덱스 1인 경우에는 2번째 학생만 체크 - 인덱스 n인 경우(끝값) n-1번째 학생만 체크 ✅ 범위 벗어나지 않은 경우에는 i 기준으로 앞의 학생 먼저 체크한 후 -> 뒤의 학생 순으로 확인하기. 중복 방지를 위해 순서대로 체크하고 continue 조건 넣어주기 🎫code )..

    [프로그래머스] 가장 큰 수/ 파이썬/ Python/ 정렬/ sort

    💡solutions ) ✅ 사용한 주요 함수는 lambda, map, sort , join이다. ✅ map 함수는 리스트의 요소를 지정된 함수로 처리해준다. 이 문제에서는 입력 받은 숫자 리스트를 각 요소별로 str 변환해주었다. sort에서 각 자릿수 별로 값을 비교하기 위해 문자열로 변환했다. ✅ sort 함수로 특정 key를 기준으로 정렬. 입력으로 주어지는 숫자가 1000 이하이기 때문에 key값으로 람다함수를 써줬다. x: x*3는 문자열에 3을 곱해주면 문자열을 3개씩 반복해서 나열한 것으로 나타냄. 값을 비교한 후 정렬한다. e.g.) 값이 5였으면 555로 값을 비교해서 정렬 ✅ join 함수는 리스트에 특정 구분자를 추가하여 문자열로 변환함. 여기서는 공백 없이 문자열로 합쳤다. ✅ 처음..

    [프로그래머스] 2016년 /파이썬 /Python

    💡solutions ) ✅ 달마다 며칠인지 리스트에 넣어주기 ✅ 전체 일수를 합산하고 7로 나눈뒤 -1 (금요일이 1이니까) 🎫code ) def solution(a, b): month = [31,29,31,30,31,30,31,31,30,31,30,31] weekday = ["FRI","SAT","SUN","MON","TUE","WED","THU"] day = sum(month[:a-1]) + b if a > 1 else b answer = weekday[day % 7-1] return answer 📌 description ) 문제출처 : https://programmers.co.kr/learn/courses/30/lessons/12901?language=python3 코딩테스트 연습 - 2016년 2..

    [프로그래머스] 소수 찾기 /파이썬 /Python /완전탐색

    💡solutions ) ✅ itertools 모듈에서 combination을 사용하기 보다는 dfs로 직접 조합 함수를 구현했다(경우의 수들은 중복 불가) ✅ 소수는 숫자 본인과 1로만 나눌 수 있는 수 (1과 본인만 약수) ✅ 소수인지 아닌지 판변하는 방법은 2부터 시작해서 판별하기 위한 해당 숫자까지로 범위 안에 있는 숫자로 전부 나누어 보고, 나누어 떨어지는 경우가 있으면 소수가 아닌 것으로 판별할 수 있다. 즉, 나누어 떨어지는 수가 없다는 것은 해당 숫자가 소수라는 것. ✅ 함수 구현시 전역변수, 지역변수 사용하는 게 아직 헷갈린다. 🎫code ) def solution(numbers): # 아래는 주어진 숫자로 나타낼 수 있는 모든 숫자의 경우를 구하는 로직(중복불가) def dfs(word)..

    [프로그래머스] 구명보트 /파이썬 /python /탐욕법

    💡solutions ) ✅ 사람들의 무게를 담은 people 리스트를 무게를 기준으로 내림차순 정렬한다. ✅ 처음과 끝의 인덱스를 start, end로 잡아두고 while 반복문을 실행한다. ✅ 탈출을 위한 구명보트의 총 개수를 나타내는 cnt의 초기값은 전체 사람들의 수로 최대치로 잡아둔다. ✅ 처음과 끝에 있는 사람들의 무게, 다시 말하면 최소한의 무게로 2명이서 함께 탈 수 있는 경우인데, 이때 limit을 넘지 않으면 전체 보트의 개수에서 -1씩 빼준다. limit을 넘으면 혼자 타는 경우로 start의 위치만 업데이트. 🎫code ) def solution(people, limit): people.sort(reverse=True) start, end = 0, len(people)-1 cnt = ..