Algorithm/파이썬 알고리즘 문제풀이 강의
-
# 10진수 -> 2진수 변환 : 10진수를 몫이 0이 될때까지 계속 2를 나누고, 나머지를 역순으로 읽으면 된다. #재귀함수를 이용해서 풀어보자 # 재귀함수 만들 때 이름을 DFS로 하겠다 # 재귀를 할 때는 앞으로 -> if / else로 하겠다. def DFS (x): # 재귀함수 종료 조건: N이 0이면 종료 if x == 0: return #함수를 종료시키겠다는 뜻 else: print(x%2 , end=' ') #한칸 띄워서 출력 DFS(x//2) # ex) x = 11 # D(11) -> D(5) -> D(2) -> D(1) -> D(0) 만약, x=11이라고 했을 때, D(11) -> D(5) -> D(2) -> D(1) -> D(0) 순서로 1 1 0 1이 출력된다. 11이라는 10진수를..
재귀함수를 이용한 이진수 출력# 10진수 -> 2진수 변환 : 10진수를 몫이 0이 될때까지 계속 2를 나누고, 나머지를 역순으로 읽으면 된다. #재귀함수를 이용해서 풀어보자 # 재귀함수 만들 때 이름을 DFS로 하겠다 # 재귀를 할 때는 앞으로 -> if / else로 하겠다. def DFS (x): # 재귀함수 종료 조건: N이 0이면 종료 if x == 0: return #함수를 종료시키겠다는 뜻 else: print(x%2 , end=' ') #한칸 띄워서 출력 DFS(x//2) # ex) x = 11 # D(11) -> D(5) -> D(2) -> D(1) -> D(0) 만약, x=11이라고 했을 때, D(11) -> D(5) -> D(2) -> D(1) -> D(0) 순서로 1 1 0 1이 출력된다. 11이라는 10진수를..
2023.08.25 -
이분 탐색 알고리즘 이분 탐색 알고리즘이란, 정렬된 리스트에서 탐색 범위를 절반씩 줄여 나가면서 특정 값을 탐색하는 방법이다. 반드시 배열 내부의 값들이 '정렬'되어 있어야 함(단점) 속도가 빠르다(장점) 탐색을 반복할 수록, 탐색 범위가 절반으로 줄어들기 때문 변수 3개를 이용하여 탐색 start , mid , end 동작 방식 1. 배열의 중간 값(mid)를 가져온다. 2. 중간 값(mid)과, 탐색 값(key) 비교 - mid = key : 종료 - mid key :mid 기준으로, 배열의 왼쪽 구간을 다시 탐색 (mid-1 index가 end원소로 변경) 3. 종료 - mi..
이분 탐색/이진 탐색 알고리즘 (binary search)이분 탐색 알고리즘 이분 탐색 알고리즘이란, 정렬된 리스트에서 탐색 범위를 절반씩 줄여 나가면서 특정 값을 탐색하는 방법이다. 반드시 배열 내부의 값들이 '정렬'되어 있어야 함(단점) 속도가 빠르다(장점) 탐색을 반복할 수록, 탐색 범위가 절반으로 줄어들기 때문 변수 3개를 이용하여 탐색 start , mid , end 동작 방식 1. 배열의 중간 값(mid)를 가져온다. 2. 중간 값(mid)과, 탐색 값(key) 비교 - mid = key : 종료 - mid key :mid 기준으로, 배열의 왼쪽 구간을 다시 탐색 (mid-1 index가 end원소로 변경) 3. 종료 - mi..
2023.07.16 -
가장 큰 수가 되기 위해, 자기 앞(앞자리)에 자기보다 작은 숫자가 오면 제거한 후, 자기가 앞으로 전진(지울 수 있는 숫자만) => 이것을 쉽게 해주는 자료구조가 스택이다! 스택? LIFO : (Last In First Out ) -> 나중에 들어온 것이 먼저 나온다. list를 통해 스택 구현 쉽게 가능 -> list.append / list.pop 하나씩 원소 넣을 때, 자기 바로 앞(즉, 스택의 가장 뒤(위)에 있는 것과 비교) -> 자기보다 작으면, stack에서 끄집어내고, 자기가 들어가는 식 더이상 꺼낼게 없는데, 아직 꺼내야되는 count가 남은 경우(->index번호가 뒤쪽부터 -1, -2, -3 이렇게 된다고 보면, stack[:-m]으로 하면 됨. m은 count하나씩 줄여서, 남은 ..
[자료구조 활용(스택,큐,해쉬,힙)] 1. 가장 큰 수 (스택)가장 큰 수가 되기 위해, 자기 앞(앞자리)에 자기보다 작은 숫자가 오면 제거한 후, 자기가 앞으로 전진(지울 수 있는 숫자만) => 이것을 쉽게 해주는 자료구조가 스택이다! 스택? LIFO : (Last In First Out ) -> 나중에 들어온 것이 먼저 나온다. list를 통해 스택 구현 쉽게 가능 -> list.append / list.pop 하나씩 원소 넣을 때, 자기 바로 앞(즉, 스택의 가장 뒤(위)에 있는 것과 비교) -> 자기보다 작으면, stack에서 끄집어내고, 자기가 들어가는 식 더이상 꺼낼게 없는데, 아직 꺼내야되는 count가 남은 경우(->index번호가 뒤쪽부터 -1, -2, -3 이렇게 된다고 보면, stack[:-m]으로 하면 됨. m은 count하나씩 줄여서, 남은 ..
2023.07.03 -
Stack 자료구조 후입선출 (프링글스 통) 파이썬에서 stack자료구조를 이용하기 위해서는, 리스트 자료구조를 이용하면 된다. 리스트: - 가장 오른쪽에 원소를 삽입하는 append매서드 - 가장 오른쪽에서 원소를 꺼내는 pop매서드를 지원하기 때문 stack = [ ] print(stack[::-1]) :최상단 원소부터 출력 (모든 원소의 순서를 거꾸로 뒤집어서 출력.) (최상단 원소: 가장 먼저 들어온 원소인듯) print(stack) 스택의 최하단 원소부터 출력 큐 선입 선출 파이썬에서 queue자료구조를 이용하기 위해서는, deque 라이브러리를 이용하면 된다. from collections import deque - queue = deque() -원소를 삽입할 때 : append 매서드 (리스..
[스택/큐]Stack 자료구조 후입선출 (프링글스 통) 파이썬에서 stack자료구조를 이용하기 위해서는, 리스트 자료구조를 이용하면 된다. 리스트: - 가장 오른쪽에 원소를 삽입하는 append매서드 - 가장 오른쪽에서 원소를 꺼내는 pop매서드를 지원하기 때문 stack = [ ] print(stack[::-1]) :최상단 원소부터 출력 (모든 원소의 순서를 거꾸로 뒤집어서 출력.) (최상단 원소: 가장 먼저 들어온 원소인듯) print(stack) 스택의 최하단 원소부터 출력 큐 선입 선출 파이썬에서 queue자료구조를 이용하기 위해서는, deque 라이브러리를 이용하면 된다. from collections import deque - queue = deque() -원소를 삽입할 때 : append 매서드 (리스..
2023.07.03 -
1. 문제 2. 내 알고리즘 및 풀이 알고리즘 1. card_list에 1부터 20까지 값을 넣는다 (이 때, 조건을 만족하기 위해 index가 0이 아니라 1부터 시작하도록 한다) 2. range_list 빈 배열을 선언한다. range_list 자리에는 내가 입력하는 10개의 범위 case가 튜플로 들어간다. 3. current_interval을 선언한다. currnet_interval은, range_list에서 각각의 room에 위치한 현재 튜플을 나타낸다. 4. 임시 변수 tmp를 선언한다. 5. 10번 for문을 돈다. map함수를 이용하여, 띄어쓰기로 입력 받은 값을 int형으로 변환한다. 두 값을 띄어쓰기로 입력받고, 각각을 start와 end에 매핑시켜서 저장한다. 6.start와 end에..
[탐색 & 시뮬레이션] 3. 카드 역배치1. 문제 2. 내 알고리즘 및 풀이 알고리즘 1. card_list에 1부터 20까지 값을 넣는다 (이 때, 조건을 만족하기 위해 index가 0이 아니라 1부터 시작하도록 한다) 2. range_list 빈 배열을 선언한다. range_list 자리에는 내가 입력하는 10개의 범위 case가 튜플로 들어간다. 3. current_interval을 선언한다. currnet_interval은, range_list에서 각각의 room에 위치한 현재 튜플을 나타낸다. 4. 임시 변수 tmp를 선언한다. 5. 10번 for문을 돈다. map함수를 이용하여, 띄어쓰기로 입력 받은 값을 int형으로 변환한다. 두 값을 띄어쓰기로 입력받고, 각각을 start와 end에 매핑시켜서 저장한다. 6.start와 end에..
2023.07.03 -
1. 문제 2. 내가 생각한 알고리즘 3. 내 코드 input_list = list(input()) #문자와 숫자가 섞인 문자열 입력 받음 new_list = [] #숫자만 추려서 넣는 리스트 final_list = [] start_index = 0 number = 0 def num_yaksoo(num): cnt = 0 for i in range(1,num+1): if (num % i == 0): cnt+=1 print(cnt) for i in range (len(input_list)): #if(0 x는 숫자인척 하는 문자이므로, int로 형변환! # 뒤집은 소수 알고리즘 참고 8. 새로 알게된 내용 isdigit() : 2^2, 등, 문자가 아닌 모든 숫자를 찾아줌 isdecimal() : 0부터 9까..
[탐색&시뮬레이션] 2. 숫자만 추출1. 문제 2. 내가 생각한 알고리즘 3. 내 코드 input_list = list(input()) #문자와 숫자가 섞인 문자열 입력 받음 new_list = [] #숫자만 추려서 넣는 리스트 final_list = [] start_index = 0 number = 0 def num_yaksoo(num): cnt = 0 for i in range(1,num+1): if (num % i == 0): cnt+=1 print(cnt) for i in range (len(input_list)): #if(0 x는 숫자인척 하는 문자이므로, int로 형변환! # 뒤집은 소수 알고리즘 참고 8. 새로 알게된 내용 isdigit() : 2^2, 등, 문자가 아닌 모든 숫자를 찾아줌 isdecimal() : 0부터 9까..
2023.06.22 -
N = int(input()) #글자수 for i in range(N): s = input() s = s.upeer() # 문자열의 대문자화 size = len(s) #문자열의 길이 for j in range (size//2): if s[j] != s[-j-1]: print("#%d NO" %(i+1)) #i는 몇 번째 케이스인지. break else: #위에서, break 안 당하고 정상적으로 종료됐다는 뜻 print("#%d YES %(i+1)") 1. 문제 2. 내가 생각한 알고리즘 - 홀수와 짝수를 나누어서 생각해본다. (홀수는 기준점을 고려 안해도 되지만, 짝수는 기준점도 고려된다) - 기준점 (글자수 / 2 )을 기준으로 왼쪽 리스트 vs 오른쪽 리스트로 나눠서 글자를 저장한다. => 이 때,..
[탐색&시뮬레이션]1. 회문 문자열 검사N = int(input()) #글자수 for i in range(N): s = input() s = s.upeer() # 문자열의 대문자화 size = len(s) #문자열의 길이 for j in range (size//2): if s[j] != s[-j-1]: print("#%d NO" %(i+1)) #i는 몇 번째 케이스인지. break else: #위에서, break 안 당하고 정상적으로 종료됐다는 뜻 print("#%d YES %(i+1)") 1. 문제 2. 내가 생각한 알고리즘 - 홀수와 짝수를 나누어서 생각해본다. (홀수는 기준점을 고려 안해도 되지만, 짝수는 기준점도 고려된다) - 기준점 (글자수 / 2 )을 기준으로 왼쪽 리스트 vs 오른쪽 리스트로 나눠서 글자를 저장한다. => 이 때,..
2023.06.20 -
L = int(input()) room = [] for i in range(L): room= list(map(int,input().split())) #100이하의 값으로, 상자가 쌓인다. M = int(input()) #높이 조정 횟수 #room.sort(reverse=True) #리스트 원소를, 내림차순으로 분류 for i in range(M): #M회의 높이 조정 시작 #room.sort(reverse=True) #리스트 원소를, 내림차순으로 분류 # 리스트에서 최대/최소값을 가지는 인덱스를 반환하려면 -> list.index(min(list)) min_index = room.index(min(room)) max_index = room.index(max(room)) room[max_index] -=1..
[그리디]창고 정리(인프런)L = int(input()) room = [] for i in range(L): room= list(map(int,input().split())) #100이하의 값으로, 상자가 쌓인다. M = int(input()) #높이 조정 횟수 #room.sort(reverse=True) #리스트 원소를, 내림차순으로 분류 for i in range(M): #M회의 높이 조정 시작 #room.sort(reverse=True) #리스트 원소를, 내림차순으로 분류 # 리스트에서 최대/최소값을 가지는 인덱스를 반환하려면 -> list.index(min(list)) min_index = room.index(min(room)) max_index = room.index(max(room)) room[max_index] -=1..
2023.03.23