알고리즘

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
def solution(a, b): days = [0,31,29,31,30,31,30,31,31,30,31,30,31] #0월,1월,2월~~ names = ['THU','FRI','SAT','SUN','MON','TUE','WED'] dayCount = b for i in range(1, a): #5월: 1월~4월 일 수 더해줌 dayCount += days[i] return names[dayCount % 7] - days: 인덱스에 해당하는 월이 포함하는 일 수 배열(0은 임시로 만든거, 1월은 days[1], 2월은 days[2] ...) - names: 1일이 금요일이 될 수 있도록 배치한 요일 문자열들 1. daycount에 b(일)를 더해줌 2. a이전 월에 해당하는 일 수를 모두 daycoun..
def solution(numbers): answer = set() for i in range(0, len(numbers)-1): for j in range(i+1, len(numbers)): answer.add(numbers[i]+numbers[j]) return sorted(list(answer)) => sorted(answer)도 가능 1. i는 [0~N-2], j는 [i+1~N-1]를 반복함. (중복되지 않도록 j는 i+1부터 반복) # 버블정렬 느낌? 2. 서로 다른 인덱스를 더한 값을 집합에 넣음. 중복방지 3. 집합을 리스트로 만들고 정렬해서 반환 from itertools import combinations def solution(numbers): answer = set() com = co..
fladi
'알고리즘' 카테고리의 글 목록 (12 Page)