We will find a way, we always have.

-interstellar

전체 글 276

[백준] 1924번: 2007년

월과 일이 주어졌을때 무슨요일인지 알아내는 프로그램이다. 처음부터 2007년이라는 연도가 주어졌기 때문에 조금은 쉽게 갔다. 만약 연도까지 입력값에 따랐다면 훨씬 더 복잡한 알고리즘으로 작성됐을 것이다. 📚 풀이 1. 입력받은 월(month)을 일로 변경하여 입력받은 일(date)과 더한다. 2. 더해진 일을 7로 나누어 나머지로 요일을 확인한다. 💻 코드 # PYTHON month, date = map(int, input().split()) # 매월의 마지막 일수 month_list = [31,28,31,30,31,30,31,31,30,31,30,31] day_list = ["MON","TUE","WED","THU","FRI","SAT","SUN"] days = 0 # 주어진 달의 이전달까지 모든 일을..

[파이썬] list, dict 주요 함수 시간복잡도

List Operation Example Big-O Notes Index a[i] O(1) Store a[i] = 0 O(1) Length len(i) O(1) Append a.append(5) O(1) Pop a.pop() O(1) a.pop(-1)과 동일 Clear a.clear() O(1) a = [] 과 유사 Slice a[a:b] O(b-a) a[:] : O(len(a)-0) = O(N) Extend a.extend(...) O(len(...)) 확장 길이에 따라 Construction list(...) O(len(...)) 요소 길이에 따라 check ==, != |1 == |2 O(N) 비교 Delete del a[i] O(N) Remove a.remove(...) O(N) Containme..

[파이썬] 순차탐색과 이진탐색

a = [1,2,3,4,5,6,7,8,9,10] a 리스트에서 내가 8이라는 값의 위치를 찾는 방법은 여러가지이다. 그중에서 순차탐색과 이진탐색을 설명하겠다. 순차탐색 (Sequential Search) 순차탐색은 그냥 말그대로 처음부터 이게 8인지 아닌지 확인해가면서 찾는 것이다. 즉 리스트 안에 있는 특정한 데이터를 찾기 위해 앞에서부터 데이터를 하나씩 차례대로 확인하는 방법이다. 만약 찾고자하는 데이터가 제일 끝에 있다면, 데이터 개수가 N일 때 최대 N번의 비교 연산을 수행함으로 최악의 경우 시간 복잡도는 O(N) 이다. 이진탐색 (Binary Search) 이진탐색은 절반씩 쪼개가면서 찾는 것이다. 이때 a list가 정렬되어 있어야만 사용가능하다. 1~10 의 데이터 중 8의 위치를 찾으려면 ..

[파이썬] 리스트에서 원하는 값 제거하기 중복 제거가능

a = [1,2,3,4,4,4,5] 위에 a 리스트에서 4를 지우고 싶다. 물론 a.remove(4)를 하면 되지만 그럴 경우 4 하나만 지워지고 두개의 4가 아직 남아있다. 이럴때 해결방법!! a = [1,2,3,4,4,4,5,5,6] remove_set = {4,6} result = [i for i in a if not in remove_set] print(a) >> [1,2,3,5,5] remove_set 이라는 set을 만들어준다음 a가 remove_set에 포함되어 있다면 result에 담지 않는 것이다!

[백준] 1359번: 복권

처음에 제목보고 재밌을거 같아서 시도해본 문제이다. 그러나 해결 알고리즘을 찾지 못해서 잠시 묵혀두었다가 스터디 시작하면서 다시 손을 대본 문제! 조합을 사용하여 시도했고 도중에 튜플을 리스트로 바꾸지 못해서 헤매었다.ㅎㅎ 해결 알고리즘: 나와 상대방이 뽑은 자연수를 같은 list에 담고 그 list를 set로 변경해줄때 변하는 길이의 변화를 갖고 풀었다.

순열과 조합 그리고 브루트 포스

브루트 포스 (Brute-force) 는 '무차별 대입' 이라는 의미이다. 말 그대로 모든 경우의 수를 대입해보는 것이다. 완전탐색 전략을 사용하여 확실하게 답을 구하는 알고리즘이지만 단점은 시간복잡도에 있다. 모든 경우를 돌아보기 때문에 문제에서 시간초과가 발생 할 수 있다. 다음 문제를 보자. N개의 수를 입력 받아서 두 수를 뽑아 합이 가장 클 때는? 브루트 포스를 사용한다면 2중 for문을 돌면서 두 수를 골라 더해서 최댓값을 갱신하면 '두 수를 뽑는 모든 경우'를 살펴보게 되고, 답을 확실하게 구할 수 있다. 이때 시간 복잡도는 O(N^2)이 된다. 버뜨 list 사용해서 최댓값 찾고 그 두개를 더하면 시간복잡도는 O(NlogN)이다. 브루트 포스로 문제를 풀 때는 반복문을 사용할 때도 있고, ..