본문 바로가기

알고리즘 문제

프로그래머스 저울 [시간초과..] 답을 맞추지만 시간 초과..-> 해결 http://oneshottenkill.tistory.com/377def solution(weight): weight.sort() length=len(weight) weight.reverse() #print(weight) w=1 while True: s=w #print('시도 무게:',s) for i in range(length): #print('뺴기 전:',s) s-=weight[i] #print('뺀 후:',s) if s=1: #끝까지 시도했음에도 무게가 남아있다면 측정 불가 return w w+=1 print(solution([3, 1, 6, 2, 7, 30, 1])) 출처 https://programmers.co.kr/learn/courses/30/lesson..
프로그래머스 단속카메라 def solution(routes): routes.sort() #진입점 기준 오름차순 정렬 length=len(routes) count=0 #실제 카메라 설치 개수 cam=[0]*length #각 구간에 카메라가 커버되는지, 1이면 카메라 커버됨 camera=0 #진입점 기준으로 설치된 카메라 위치 for i in range(length-1,-1,-1): #진입점이 가장 큰 구간부터 진입점이 작은 구간까지 1개씩 이동 if cam[i]==0: #카메라가 커버 못하는 구간이라면 camera=routes[i][0]#현 진입점을 카메라 설치 위치로 count+=1 #카메라 1개 설치 for j in range(i,-1,-1): #진입점(camera) 하나를 기준으로 삼고 매 구간의 진출점(routes[j][..
프로그래머스 구명보트 def solution(people, limit): people.sort() #정렬 length=len(people) #사람 수 i=0 #가벼운 사람의 인덱스 heavy=length-1 #무거운 사람의 인덱스 count=0 #짝 지은 수 while(i
프로그래머스 조이스틱 문제 이해하는 것도 좀 어려웠지만... 탐욕법(그리디 접근 방식)으로 저걸 어떻게 풀라는 지 생각도 안났다. 고민하다가 왼쪽으로만 이동하는 것과 오른쪽으로만 이동하는 것 그리고 왼쪽과 오른쪽 섞어서 이동하는 것 중에 최단 거리를 택하면 되겠다고 생각했다. 생각만 했고 구현하는 건 힘들었다.. 왼쪽과 오른쪽 섞어서 이동할 때 어떤 지점에서 다시 인덱스 0까지 돌아가야할 지 몰랐다. 인덱스 0부터 가운데까지 양방향으로 이동하면서 A가 아닌 알파벳이 나오면 leftDist, rightDist에 각각 거리를 넣었다. 이후 작은 값을 기준으로 돌게 되면 이동 거리가 최소화 된다. 둘 중 작은 거리 * 2 + 긴 거리를 하면 양 방향으로 이동했을 때 최단 거리가 나오게 된다. 물론 이 값과 왼쪽만으로 이동한 거리와..
프로그래머스 큰 수 만들기 def solution(number, k): s=0 length=len(number) for i in range(k): isEnd=True for j in range(s,length-1): if number[j]0:#인덱스가 1이상인 경우 인덱스 하나 줄이면 제자리에서 새로 온 값과 다시 비교 가능해짐(위 for문에서 s가 1 증가하므로) s=j-1 else:#인덱스가 0인 경우 처음부터 다시 비교 s=0 break#작은 수 제외시켰으므로 다음 것 찾기 if isEnd==True:#문자열 맨 마지막을 제외 시킴 print('hi') number=number[:-1] s=j-1#인덱스 하나 줄이기 return number print(solution("1924",2)) print(solution("12312..
프로그래머스 예상 대진표 처음엔 n을 반으로 나누고 그 n을 기준으로 양쪽에 a,b가 있으면 그때부터 num을 반으로 나누면서 count를 세고 1이 되면 count를 반환했다.시간이 오래 걸리거나 틀렸다. 실패 - 런타임 에러...#주어진 길이 n을 2로 나누면서 n이 a,b사이에 있을 때 계산하기. def solution(n,a,b): count=0 while True: if an: num=n while True: count+=1 if num==1: return count else: num//=2 else: n //= 2 print(solution(8,4,7)) print(solution(8,3,7)) print(solution(16,1,14)) 단순히 a,b를 노가다로 나누다가 a,b가 같아지면 결국 만난 거니까 그때까지의..
프로그래머스 소수 만들기 주어진 배열에서 3개의 숫자를 합한 뒤 이게 소수인지 판별하고 몇 개의 소수가 만들어질 수 있는지 출력해야 한다.배열에서 3개의 수를 어떻게 빼야하는 지 감도 안왔다...for문 3개를 써서 조합을 만들어준다.findPrime에 숫자 3개의 합을 매개변수로 건내주고 s라는 숫자를 2부터 s-1까지의 숫자로 일일이 나눈다. 나누어 떨어지는 게 있으면 소수가 아니므로 False 반환, 나누어 떨어지지 않으면 True를 반환. 에라토스테네스의 체를 쓰려면 아마 2부터 3000까지의 소수를 구하고 배열에 집어 넣은 뒤 일일이 비교하면 될 것 같다. def findPrime(s): for i in range(2,s): if s%i==0: return False return True def solution(nums..
프로그래머스 항상 정답 class ALWAYS_CORRECT(object): def __eq__(self,other): return True def solution(a): answer = ALWAYS_CORRECT() return answer;