본문 바로가기

분류 전체보기

프로그래머스 타겟 넘버 DFS를 활용했다. answer는 target과 일치하면 1씩 누적하는 변수다. 두 함수에서 사용할 수 있도록 전역변수로 만들었다. numbers와 길이, target, 0을 인자로 갖는 make_target을 호출한다. i는 level을 측정하면서 numbers의 index로도 쓰인다. numbers의 끝까지 탐색을 했다면 numbers의 합이 target과 일치하는지 판단하고 일치한다면 answer에 1을 누적한다. 그리고 make_target 함수를 종료한다. 트리 레벨(i)에 따라 레벨에 있는 하나의 원소의 기호를 변경해준다. numbers[i] *= 1 make_target(numbers, target, length, i+1) numbers[i] *= -1 make_target(numbers, ..
프로그래머스 입국심사 최악의 경우 심사를 가장 느리게 하는 곳에서 모든 사람이 심사 받는 경우다. max(times) x n 최대 시간(max(times) x n), 최소 시간(0)을 가지고 이분탐색을 하면서 중앙값을 찾는다. 입국 심사대를 돌면서 심사대당 주어진 시간 내에 몇명을 처리할 수 있는지 구한다. 처리할 수 있는 누적 인원이 n과 같을 때 일단 list에 삽입해놓는다. 주어진 시간 내에 n명을 초과해서 처리할 수 있고, 초과된 인원이 현재 심사대에서 주어진 시간 내에 처리할 수 있는 인원보다 작거나 같으면 list에 중앙값을 추가한다. (count와 n이 일치하지 않더라도 시간 내에 처리할 수 있는 시간인 경우를 포함시킴) list에는 n명을 처리할 수 있는 시간들이 있는데 가장 작은 값이 답이다. def solu..
프로그래머스 예산 어려웠던 점 1. 언제까지 반복해야 하나 ->log_2(max - min)+1 번 2. 예산 상한액을 어떻게 측정하나 -> 가능한 상한액을 list에 넣고 최대값 출력 3. 테스트 케이스 9번, 런타임 에러 -> n개의 도시에 예산을 배분할 때 (M // len(budgets)가 min(budgets)를 넘지 못하면 (M // len(budgets)가 최대 예산이다. 마지막 테스트 케이스는 유효한지 모르겠다. 세 도시에 1씩 나눠줄 수 없어서 1,1,0 이렇게 나눠야 하는데 균등하게 분배한다고 하면 0이 맞는 것 같다. 도시 예산의 총 합이 M 이하면 도시 예산 중 최대값 반환 전체 예산을 각 도시에 균등하게 분배할 수 있는 금액이 최소 도시 예산도 넘지 못하면 균등하게 분배할 수 있는 금액 반환 이분탐..
프로그래머스 카펫 일단 red, brown으로 만들어지는 모양은 십자가같은 건 아니고 직사각형이다. 가로, 세로 길이가 다양하게 나올 수 있는데 주어진 red, brown의 타일 수로 red 직사각형을 만들고 brown으로 그 테두리를 감쌀 수 있으면 되는 것이다. red의 개수로 직사각형을 그리다보면 red를 만들 수 있는 공약수로 짝을 지어서 그릴 수 밖에 없다. red가 9면 1 x 9, 3 x 3 27이면 1 x 27, 3 x 9 24면 1 x 24, 2 x 12, 3 x 8, 4 x 6 이런 식이다. 가로의 길이는 세로보다 같거나 크다. red로 만들 수 있는 다양한 직사각형의 테두리에 brown의 개수를 다 써서 채우는 걸 찾으면 된다. red의 공약수 짝으로부터 테두리에 쓰인 타일 수를 구하는 식은 red의 ..
프로그래머스 숫자 야구 111, 011, 101, 133, 999와 같이 중복되는 숫자나 0은 나올 수 없다. 123, 456, 987 이런 숫자만 올 수 있다. make_nums 함수는 3자리 수이면서 각 자리수가 서로 중복되지 않는 수들을 만든다. 가능성이 있는 수들의 list인 nums를 돌면서 주어진 질문과 비교한다. 각 자리수에 있는 값이 일치하면 strike를 증가시키고 그 자리를 False로 만든다. 혹은 False 처리를 안하고 나중에 ball 비교를 할 때 index가 다르면 ball을 증가해주면 된다. 만약 질문에 있는 strike, ball의 값이 하나라도 다르면 flag는 False가 되고 나머지 질문들을 검사할 필요가 없이 주어진 n은 탈락이므로 break로 for문을 벗어나고 다음 n을 검사한다. 만약..
프로그래머스 소수 찾기 시간 초과가 났는데, 잘 모르겠어서 다른 분의 코드를 참고했다. 에라토스테네스의 체를 효율적으로 작성해서 index 접근만으로 소수인지 아닌지 판단을 해야한다. itertools 패키지의 permutations 모듈을 활용해 입력된 문자열화 된 숫자의 순열을 구한다. '123'이라면 '1', '2', '3', '12', '23', '13', '123' 이런 식이다. '011'이라면 '0', '1', '1', '01', '11', '011'인데 '1'과 '01'을 정수화하면 똑같은 1이고, '11', '011' 역시 정수화 하면 똑같이 11이다. 그래서 set()을 사용해서 중복을 제거해야 한다. from itertools import permutations def get_prime(n): primes =..
프로그래머스 모의고사 def solution(answers): supo = [ [1, 2, 3, 4, 5], [2, 1, 2, 3, 2, 4, 2, 5], [3, 3, 1, 1, 2, 2, 4, 4, 5, 5] ] an_len = len(answers) for nums in supo: mul = an_len // len(nums) if mul > 0: nums *= (mul + 1) supo_dict = {0: 0, 1: 0, 2: 0} for i in range(an_len): if answers[i] == supo[0][i]: supo_dict[0] += 1 if answers[i] == supo[1][i]: supo_dict[1] += 1 if answers[i] == supo[2][i]: supo_dict[2] += ..
프로그래머스 베스트 앨범 실패 여러 테스트 케이스에서 런타임 에러가 남 from operator import itemgetter def solution(genres, plays): album_list = [] for i in range(len(genres)): album_list.append({ 'genres': genres[i], 'play_value': plays[i], 'play_index': i }) album_list = sorted(album_list, key=itemgetter('play_value'), reverse=True) genre_dict = {} for album in album_list: if album['genres'] not in genre_dict: genre_dict[album['genres']]..