def solution(arr, divisor): a = [i for i in arr if i%divisor == 0] # a가 빈 리스트가 아니면 sorted(a)반환/ else [-1] return sorted(a) if a else [-1] 1. arr배열 요소 중 divisor로 나누어 떨어지는 값만 a배열에 저장함 2. a배열이 빈 리스트가 아니라면 sorted(a) (=오름차순으로 정렬된 a배열) 을 반환 빈 리스트라면 [-1]을 반환한다. +) or을 이용한 풀이 def solution(arr, divisor): # or: 앞에 것이 거짓이라면 뒤에 것 반환 return sorted([n for n in arr if n%divisor == 0]) or [-1] 프로그래머스에서 좋아요를 가장 ..
알고리즘/programmers[1]
# 1. a[-1:] def solution(arr): a = [] for i in arr: if a[-1:] != [i]: a.append(i) return a a[-1:]은 a[-1]과 같은 효과이면서, 오류는 나지 않는 방법!! (a가 []라도 오류가 나지 않는다) 대신 리스트에 들어간 상태로 반환되기 때문에([1], [2] 이런 꼴) i를 [i]로 써야한다. #2. a[i-1:i] def no_continuous(s): return [ v for i,v in enumerate(s) if s[i-1:i]!=s[i] ] a[i-1:i]는 a[i-1]과 같은 효과이면서, 오류는 나지 않는 방법이다! a[i-1:i]는 리스트에 들어간 상태로 반환되지 않는다.(왜인지는 모름..) 그래서 s[i]로 그냥 써..
def solution(arr): answer = [] arr.insert(0, -1) for i in range(1, len(arr)): if arr[i-1] != arr[i]: answer.append(arr[i]) return answer 1. arr 맨 첫 번째에 -1을 넣어줌(arr의 원소들은 항상 자연수이므로 겹칠 일이 없음) 2. 1~(len-1)인덱스까지 반복, 이전 인덱스의 숫자와 현재 인덱스의 숫자 비교 => 다르다면 answer에 추가해줌 ex) [1,2,3,3] => [-1,1,2,3,3] // -1추가 : -1, 1은 다름 => answer = [1] : 1, 2는 다름 => answer = [1,2] : 2, 3은 다름 => answer = [1,2,3] : 3, 3은 같음 =>..
def solution(s): return s[ (len(s)-1)//2 : len(s)//2+1 ] 문자 길이가 짝수일 때와 홀수일 때의 len과 몫을 이용하여 가운데만 뽑아내는 공식을 찾아냈다. 홀수일 때는 (len(s)-1)//2 와 len(s)//2의 값이 같고, 짝수일 때는 달라서 끼워맞추면 공식이 쉽게 도출된다.
def solution(num): count = 0 while count < 500: if num == 1: return count num = num/2 if (num%2 == 0) else num*3+1 count +=1 return -1 1. num == 1이라면 count를 반환한다.(num이 1일 때 0을 반환) 2. num이 짝수라면 num/2, 홀수라면 num*3+1을 num에 대입한다. 3. count를 1 증가시킨다. 4. count가 500을 넘어도 num이 1이되지 않는다면 -1을 반환한다.
def solution(n, arr1, arr2): total = [] # arr1과 arr2를 bit wise OR한 값 -> 2진수로 만듦 -> '0b'값 삭제 -> 나머지 0으로 채우기 for i in range(n): b = bin(arr1[i]|arr2[i]).replace('0b', '').zfill(n) total.append(b) #'1'=>'#', '0'=>' ' 대체한 값 반환 return [line.replace('1', '#').replace('0', ' ') for line in total] 1. arr1과 arr2를 합치기 위해 비트연산자OR을 사용한다. => (arr1 | arr2) 2. bin함수로 2진수로 변환된 문자열을 얻는다. => ex) "0b00101" 3. 필요없는..
def solution(price, money, count): s = sum([i*price for i in range(1, count+1)]) return s-money if s-money>0 else 0 1. 1~count까지 price를 곱하여 리스트에 넣고, 그 합(sum)을 구한다. 2. 합-money가 0보다 크면 해당 값을 반환, 0보다 작으면 0을 반환한다. 다른 풀이중에는 산술평균을 이용한 풀이도 있던데 생각도 못했다..ㅠㅠ 다음에는 수학을 이용한 더 좋은 풀이를 떠올려봐야겠다.
def solution(n): # n-1의 가장 작은 약수 구하기 # x>1 n = n-1 for d in range(2, int(n**(0.5))+1): # 약수찾기 if n % d == 0: return d return n 문제를 n-1의 1이 아닌 가장 작은 약수 구하는 문제로 재해석함 // n = Q*x + 1 (x>1) // n-1 = Q*x (x>1) 1. n = n-1 2. 2부터 sqrt(n)까지의 숫자로 n을 나눠본다.(sqrt(n)까지만 찾아도 충분히 찾을 수 있다.) 만약 나머지가 0이 되는 수가 있다면 그 수를 반환한다. 3. 이 숫자 중 약수가 없다면 소수이므로, 1과 자기자신밖에 약수가 없게 된다. => 자기 자신 반환 +) 약수를 루트n까지만 찾아도 되는 이유 ex) 18의 경..
def solution(sizes): _sizes = [sorted(s) for s in sizes] return max([x[0] for x in _sizes]) * max([x[1] for x in _sizes]) sizes = [(3,6), (5,4), ...] // 가로, 세로 길이가 무작위로 들어있음. 1. sorted함수를 이용하여 (작은거, 큰거)로 sizes 원소를 정렬한다. 즉 x[0]은 작은 거, x[1]은 큰 거 2. (작은 것들 중 max)*(큰 것들 중 max)의 값을 반환한다. 부가설명: 큰 것들 중 가장 큰 것은 가로, 세로 중 하나가 될 수밖에 없고(필수) 그 외의 나머지 하나는 최대한 작은 것으로 골라야함. => 작은 것들 중 가장 큰 것으로 import heapq def ..
def solution(sizes): w, h = 0, 0 for s in sizes: w1, h1 = max(w, s[0]), max(h, s[1]) w2, h2 = max(w, s[1]), max(h, s[0]) if (w1+h1