목록밥벌이 (281)
연습장
N : 전체 스테이지 갯수 stages : 유저의 현재 진행중인 stage 단계 result : 실패율이 높은 순서부터, 같을 경우 더 낮은 stage 부터 case 1 의 경우 stages[0] = 2 는 1번째 유저가 2stage에 도전하고 있다는 뜻이다. stages[3] = 6 는 4번째 유저가 모든 stage 를 클리어 했다는 뜻이다. 실패율 해당 stage 에 도전중인 유저 수 / 이전 stage 를 클리어한 유저 수 stage 1 = 1/8 stage 2 = 3/7 stage 3 = 2/4 stage 4 = 1/2 stage 5 = 0/1 이며 3,4 가 0.5로 가장 높은 실패율을 가지므로 result = [ 3, 4 .. ] 에 그 다음 실패율을 가지는 2stage result = [3,..
n 은 전체 벽의 갯수 m 은 룰러의 길이 section 은 빈곳 (칠해야 되는곳) result 는 룰러 횟수 1번 예시를 보면 2 3 6 을 칠하기 위해서 길이 4 짜리 룰러로 총 2번 해야된다 라는 뜻입니다. 만약 다음과 같은 예시 n = 8, m = 3 , section = [1,3,5,7] 의 경우 1-3 , 5-7의 영역을 총 2번 칠하게 된다. 즉, 붓이 시작하는 지점이 어디이며 몇번 칠하는지 구하면 된다. 1회 : 시작 1 -> 끝 3 2회 : 시작 5 -> 끝 7 def solution(n, m, section): # 처음 1회 시작 start = section[0] end = start - 1 + m answer = 1 # section 의 원소값에 따라 for area in sectio..
2 부터 n 까지 각 숫자가 소수인지 판단해야된다. 간단하게 생각해보면 1. 소수인지 아닌지 판단하는 함수를 만든다. 2. n 보다 작은 수에 대해서 1의 함수를 각각 적용하여 갯수를 샌다 로 다음과 같다. # 소수인지 확인하는 함수 def prime_num(n): for i in range(2,n): if n%i == 0: return 0 return n def solution(n): answer = 0 for i in range(n+1): if prime_num(i) > 1: answer +=1 return answer 그러면 예상하는 바와 같이 시간초과에 걸리게 된다. 현재 for 문을 2번 사용해서 시간 복잡도가 O(n^2) 정도 된다. 이와 관련된 해결방법으로 '3. 기사단원의 무기' 라는 글에..
goal 에 있는 원소인덱스로 번호를 매긴다면 예제1. cards1 = [0,3,4] cards2 = [1,2] 예제2. cards1 = [0,4,3] cards2 = [1,2] 예제 2의 cards 의 순서가 0 -> 4 -> 3 으로 진행되므로 No 가 된다. 1. goal 의 원소를 빼서 각 cards 를 숫자(goal 의 인덱스)로 바꾼 후 2. cards 의 숫자가 오름차순으로 진행되는지 확인한다 1의 경우 list.index('해당문자') 로 확인 할 수 있다. def solution(cards1, cards2, goal): answer = '' for word1 in cards1: print(goal.index(word1)) return answer 다음과 같이 card1 의 원소가 goal..
participant 에는 있고 completion 에 없는 사람을 1명 찾으면 된다. 간단하게 participant 에서 completion 을 빼면 되지않나 라고 생각했다. 빼기가 없어서 for 문으로 반복하여 진행해봤다. 중복 이름도 있으므로 participant 에서 원소를 하나씩 빼서 completion 에 존재하면 지우고 존재하지 않으면 return 하도록 하였는데 def solution(participant, completion): participant.sort() completion.sort() for part in participant: if part in completion: completion.remove(part) else: return part 시간 초과 부분에서 문제가 발생했다...
프로그래머스를 풀다보면 종종 글을 이해를 잘 못하는 기분이 들곤한다. 첫 문자와 나머지 문자의 횟수를 샌다. 두 횟수가 같아지면 하나의 단어로 끊는다. 3번의 예시를 보면 a a a b b a c c a 1 2 3 3 3 4 4 4 나머지 0 0 0 1 2 2 3 4 4,4 로 같아져서 aaabbacc 의 한 단어로 마무리 된다. c c a b c 1 2 2 2 나머지 0 0 1 2 2,2 로 같아져서 ccab 로 한 단어가 되고 b a b 1 1 나머지 0 1 1,1 로 같아져서 ba 로 한 단어가 된다. 총 3단어로 result = 3 이된다. 1. 첫 글자가 어떤건지 저장 2. 다음 글자가 처음과 같은지에 따라서 각각 카운트 3. 같아지면 단어로 처리 def solution(s): answer = ..
n - 전체 학생수 lost - 체육복이 없다. reserve - 체육복이 여벌이 있다. return - 체육 수업을 듣는 학생 수 특이한 점으론 lost 와 reserve 가 같게 되면 빌리거나 빌려줄 수 없다는 점이다. 즉 lost 와 reserve 의 원소가 겹치면 양쪽 배열에서 지워버리는게 좋은 해결 방법이 될 걸로 예상 1. lost 와 reserve 에 중복되는 원소 확인 및 처리 2. lost 에서 1을 빼거나 1을 더했을때 reserve 에 해당 숫자가 있어야 빌릴 수 있음 3. 빌리고 나서는 더 빌리면안됨. [3] 이 [2,4] 에게 각각 빌리면 2번 빌리는 경우가 나올 수 있음. def solution(n, lost, reserve): answer = 0 num = 0 # 체육복을 빌린..
문제 해석 X, Y 두 수가 있는데 겹치는 숫자를 뽑아서 그걸로 가장 큰수를 만드는 문제라고 볼 수 있다. 12321 -> 1, 2, 3, 2, 1 42531 -> 4, 2, 5, 3, 1 각각 1,2,3 이 겹치며 321 로 배치하면 가장 큰 수가된다. 풀이 방법 1. 숫자를 분해 2. 겹치는 숫자를 추출 3. 크게 만들기 (역으로 정렬 , 내림차순으로 정렬) 라고 생각했는데 제한 사항을 보니 굉장히 긴 수가 나올 것으로 예상된다. 만약 위의 로직대로 for 문을 이용하면 시간 초과가 날것으로 예상된다. -> 배열로 풀어야되나 -> 딕셔너리로 만들어서 {'1' : a개, '2': b개 ... } 로 풀어야될까 1. 각각을 딕셔너리로 만든다. 2. 각 key 에 따라 value 값이 겹치는 정도를 본다...
문제 해석 기존의 로또와 다르지만 아무튼 문제를 풀어보자면 lottos : 구입한 로또 번호 win_nums : 당첨된 로또 번호 0 -> 알수 없는 숫자 0 이 아닌 숫자에 대해서는 고정된 값이며 0 에는 어떤 숫자든지 들어갈수 있고 이를 이용하여 최고 순위, 최저 순위를 예상해보자는 문제이다. 풀이 방법 1. 0 의 갯수를 확인한다. 2. 0을 뺀 나머지 숫자중에서 몇개가 일치하는지 확인한다. 3. 최고와 최저에 대해서 계산해본다. 순위를 매기는 방법을 보니까 6개가 일치하면 1등 5개가 일치하면 2등 만약 7에서 일치할때마다 1씩 뺸다면 다음과 같이 순위를 매길 수 있으며 확정된 숫자에 대해서 먼저 순위를 매기고 나머지 0의 갯수만큼 예상 순위 처리를 해주면 된다. + 전부다 틀릴경우 7위가 되게 ..
문제 해석 babbling 의 원소를 "aya", "ye", "woo", "ma" 를 활용하여서 만들 수 있는지? 단 연속해서 사용하면 안된다. ayaye = aya + ye -> o uuu = x yeye = ye + ye -> 연속 -> x yemawoo = ye + ma + woo -> o ayaayaa = aya + aya + a -> x 풀이방법 1. babbling 의 원소를 하나씩 가져온다 2. 원소가 "aya", "ye", "woo", "ma" 를 이용하여 만들 수 있는지 확인한다. def solution(babbling): answer = 0 # 1. 하나씩 꺼내온다 for word in babbling: # 2. replace 를 통해 변환하여 확인한다. word = word.repla..