알고리즘 54

프로그래머스 다리를 지나는 트럭 파이썬

https://programmers.co.kr/learn/courses/30/lessons/42583 코딩테스트 연습 - 다리를 지나는 트럭 트럭 여러 대가 강을 가로지르는 일차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 다리에는 트럭이 최대 bridge_length대 올라갈 programmers.co.kr 스택/큐를 잘 활용해야하는 문제이다. 문제를 보면 배열의 앞쪽에서 값을 많이 빼야할것 같았기에 deque 를 사용하여 효율을 높였다. 풀이: 1. 다리를 지나는 트럭을 위한 deque (d) 를 다리의 길이로 생성한다. > 0은 차가 없는 다리 부분이다. 2. 현재 다리위에 있는 전체 무게를 초기화한다. 3. 1 에서 생성한 다리 de..

프로그래머스 프린터 파이썬

https://programmers.co.kr/learn/courses/30/lessons/42587 코딩테스트 연습 - 프린터 일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린 programmers.co.kr 문제만 봐도 우선순위에 따라 인쇄할 종이를 앞에서 맨뒤로 보내야할 일이 많을것 같았으므로 일단 deque 를 사용했다. 나의 경우, 순서를 기록하고 있는 배열을 추가로 만들어서 우선순위 배열의 값이 조정될때 (맨뒤로 보내거나 프린트될때) 순서배열 역시 동일하게 기록을 해줬고, 프린트해야하는 시점의 값이(순서가) location 과 동일하다면 기록해뒀던 answer ..

프로그래머스 기능개발 파이썬

https://programmers.co.kr/learn/courses/30/lessons/42586 코딩테스트 연습 - 기능개발 프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 programmers.co.kr 처음엔 아래와 같이 풀었다 def solution(progresses, speeds): answer = [] temp = 0 while progresses: if progresses[0] >= 100: del progresses[0] del speeds[0] temp += 1 else: if temp > 0: answer.append(temp) temp ..

프로그래머스 단속카메라 파이썬**

https://programmers.co.kr/learn/courses/30/lessons/42884 코딩테스트 연습 - 단속카메라 [[-20,-15], [-14,-5], [-18,-13], [-5,-3]] 2 programmers.co.kr 이 문제의 가장 탐욕스러운 방법은 진출지점 기준으로 오름차순으로 정렬한 후, 진출지점에 카메라를 설치하는 것이다. 왜냐하면 진출지점이 오름차순 정렬돼있기 때문에 첫번째 진출지점에 카메라를 설치하면 다음 자동차는 무조건 첫번째 진출지점 이후에 진출하기 때문에 카메라를 만나기에 가장 최선이다. 풀이: 1. 진출지점 기준으로 오름차순 정렬한다. 2. 자동차를 순회한다. 3. 만약 카메라가 현재 자동차의 시작지점 이전에 있다면 그 차는 카메라를 만나지 못한 것이므로 카메라..

프로그래머스 섬 연결하기 파이썬

https://programmers.co.kr/learn/courses/30/lessons/42861 코딩테스트 연습 - 섬 연결하기 4 [[0,1,1],[0,2,2],[1,2,5],[1,3,1],[2,3,8]] 4 programmers.co.kr 크루스칼 알고리즘을 이용하면 쉽고 빠르게 풀 수 있는 문제이다. 이 문제를 처음 접했을 때는 크루스칼 알고리즘을 모르고 있었다. 크루스칼 알고리즘을 모르는채로 대강 계획을 잡고 풀어보려했는데 생각보다 구현이 잘 안돼서 질문/답변 을 확인하다가 크루스칼 알고리즘을 알게 되었다. import heapq def get_parent(c, node): if c[node] == node: return node return get_parent(c, c[node]) def ..

프로그래머스 구명보트 파이썬

https://programmers.co.kr/learn/courses/30/lessons/42885 코딩테스트 연습 - 구명보트 무인도에 갇힌 사람들을 구명보트를 이용하여 구출하려고 합니다. 구명보트는 작아서 한 번에 최대 2명씩 밖에 탈 수 없고, 무게 제한도 있습니다. 예를 들어, 사람들의 몸무게가 [70kg, 50kg, 80kg, 5 programmers.co.kr 이전에 풀었던 큰수만들기 를 약간은 무식하게 풀고나서 다른사람의 풀이를 보고 뭔가 느낀바가 있다. 뭐라고 말로 표현하기 어려운데 굳이 표현하자면 컴퓨터공학도 처럼 생각하자 는 것이다. 이번 문제를 풀 때 그런 생각으로 임했고 아래와 같이 깔끔하게 풀었다. 만족스러운 깔끔한 코드다. 물론 문제자체도 무척 쉬웠다. 이 문제를 풀기 위해서 ..

프로그래머스 큰 수 만들기 파이썬

https://programmers.co.kr/learn/courses/30/lessons/42883 코딩테스트 연습 - 큰 수 만들기 programmers.co.kr def solution(number, k): answer = [] number = list(map(int, number)) start = 0 ans_len = len(number) - k remain = ans_len - len(answer) end = len(number) - remain + 1 while len(answer) < len(number) - k: max_val = -1 temp_s = start temp_e = end remain = ans_len - len(answer) # print((start, end)) # prin..

프로그래머스 체육복 파이썬

https://programmers.co.kr/learn/courses/30/lessons/42862 코딩테스트 연습 - 체육복 점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번 programmers.co.kr 쉽게 풀었으나 너저분한 코드가 많다. 훨씬 많이 줄일 수 있을듯. 풀이: 1. 전체 학생수 에서 체육복을 잃어버린 학생을 뺀 값을 임시로 수업할 수 있는 학생수로 정함 2. 1부터 전체 학생 수 만큼 학생 배열 생성 3. 체육복을 잃어버림과 동시에 여분을 갖고 있는 학생은 그냥 아무일도 일어나지 않은 학생이므로 체육복을 잃어버린 학생, 여분을 갖고있는 학생에서 빼..

프로그래머스 카펫 파이썬

https://programmers.co.kr/learn/courses/30/lessons/42842 코딩테스트 연습 - 카펫 Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다. Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 programmers.co.kr 쉽게 풀었지만 코드가 많이 너저분하다. 효율성은 나쁘진 않다. O(N) 1. 갈색과 노란색 카펫수가 제공됐을때 전체 카펫은 갈색+노란색 이고 조합할 수 있는 모든 가로x세로 를 구하기 위해 약수를 구한다. 2. 약수 리스트가 하나 밖에 없다면 정답은 (약수1 x 약수1) 이다. 3. 약수 리스트가 두개면 크기에 따라 (약수1 x 약수2) 또는 (약수2 x 약..

프로그래머스 소수 찾기 파이썬

https://programmers.co.kr/learn/courses/30/lessons/42839 코딩테스트 연습 - 소수 찾기 한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다. 각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 programmers.co.kr 크게 어려운 문제는 아니였던듯 한데,, 내가 푼 방법이 효율적이라고는 말하지 못하겠다. 내 풀이는 아래와 같다. 1. 숫자의 길이만큼 루프를 돌린다. 2. 예를들어 1234 면 1자리로 나올수 있는 조합부터 4자리로 나올수 있는 모든 조합을 itertools 의 permutations 를 통해서 구한다. 3. 가능한 모든 조합을 순회하면서 소수여부..