전체 글 131

백준 11726 파이썬(DP)

예전에 공부할때 봤었던 이코테라는 책에 이 문제와 비슷한 유형이 있어서 쉽게 풀 수 있었다. 타일을 채우는 방법의 수를 구하는 문제인데 m(n) = m(n-1) + m(n-2)로 결국 피보나치 수열과 같다. 피보나치 수열은 DP의 대표적인 문제로 재귀와 반복문 둘다 풀이가 가능하고 둘다 알아놓으면 좋을 듯 하다. 이번에는 바텀업 방식으로 풀어보았다. 마지막에 10007로 나눈 나머지를 출력하는 것을 까먹으면 안된다 ㅠㅠ 이걸 놓쳐서 10분동안 "어.. 왜 안되지...??" 를 반복했다.ㅠㅠ # 11726번: 2xn 타일링 n = int(input()) m = [0]*1001 m[0] = 0 m[1] = 1 m[2] = 2 for i in range(3,n+1): m[i] = m[i-1] + m[i-2] ..

백준 9095 파이썬(DP)

일반적인 DP문제다. 오랜만에 문제를 풀어서 그런지(코딩 자체가 굉장히 오랜만이다...ㅠㅠ) 문제를 해결하는데 생각보다 오랜 시간이 들었던거 같다. 다이나믹 프로그래밍 문제는 기본적으로 문제를 작게 잘 쪼개는것이 가장 중요하다고 생각한다. 재귀를 이용해서 풀던(탑다운), 반복문을 이용해서 풀던(바텀업) 자기가 생각하기 편한 방식대로 풀면 된다. [DP조건] 중복되는 서브문제(overlapping subproblems) - 문제해결관점 : 큰 문제를 작은 문제로 쪼갤 수 있고, 큰문제와 작은문제를 같은 방법으로 풀 수 있다. => 메모이제이션 최적 부분 구조(optimal substructure) - 문제의 구조관점 : 전체 문제의 최적해가 부분 문제의 최적해들로써 구성된다. 이 문제는 주어진 수의 3번째..

비디오 게임 데이터를 이용하여 출시할 게임 설계하기

코드스테이츠 AI 부트캠프 3기 section1 프로젝트 내용을 정리한 것입니다. 1. 프로젝트 개요 1980년도부터 2020년까지 출시된 게임의 지역별, 연도별 판매량 데이터를 통해 게임시장의 트랜드변화와 앞으로 게임시장은 어떻게 될 것인지, 최종적으로 새롭게 출시할 게임을 설계하고 추천하는 프로젝트 입니다. 2. 프로젝트의 목표 새롭게 출시할 게임 설계하기. 게임장르 플랫폼 지역 게임회사 출시시기 3. 데이터 EDA 및 전처리 총 16000개 정도의 데이터와 9개의 피쳐(feature)를 가지고있는 게임데이터입니다. 게임이름(Name), 사용된 플렛폼(Platform), 출시년도(Year), 장르(Genre)와 회사정보(Publisher)가 있으며 각각 북미,유럽,일본,그외 지역의 판매량(Sales)..

차원축소(dimension reduction)

이번 블로그에서는 차원축소(dimension reduction)에 대해서 알아보도록 하겠습니다. (목차) 1. 차원축소는 왜 해야하는가? (필요성) >> 차원의 저주(curse of dimension) 2. 차원축소의 종류 2.1 - 차원선택(feature selection) 2.2 - 차원추출(feature extraction) - PCA 1. 차원축소는 왜 해야하는가? (필요성) >> 차원의 저주(curse of dimension) 차원축소를 해야하는 가장 큰 이유는 차원의 저주(curse of dimension) 때문입니다. 차원의 저주란 데이터 학습을 위한 차원(=특성,변수,피쳐)이 증가하면서 학습데이터의 수 보다 차원의 수가 많아지게 되어 모델의 성능이 떨어지는 현상을 말합니다. 즉, 데이터보다..

데이터 분석 2021.12.23

selenium을 이용한 네이버 뉴스 날짜별 크롤링

이번 블로그에서는 selenium을 이용해서 네이버 뉴스를 날짜별로 스크레이핑 하는 방법을 포스팅해보겠습니다~ 참고로 아래의 링크에 들어가시면 네이버 자체적으로 제공하는 api를 이용할 수 있습니다. 그런데 제가 찾았을때는 뉴스를 날짜별로 긁어올 수 있는 api는 없는것 같더라구요 ㅠㅠ 그래서 이번 기회에 공부도 하고 연습도 해볼겸 네이버 뉴스를 스크래핑 해보았습니다. https://developers.naver.com/main/ 1. selenium을 이용해서 코로나를 검색한 네이버뉴스창 띄우기. from selenium import webdriver from selenium.webdriver.common.keys import Keys driver = webdriver.Chrome('driver\chr..

파이썬 python 2021.12.20

랜덤포레스트 모델(Random Forest Model)

이번 블로그에서는 결정트리모델의 단점인 과적합문제를 보완하고 머신러닝에서 분류문제를 풀때 가장 많이 사용되는 랜덤포레스트모델(Random Forest Model)에 대해서 알아보도록 하겠습니다~! 랜덤포레스트 모델은 결정나무를 기본 모델로 사용하는 앙상블(Ensemble) 방법입니다. 다시 말해서 결정나무(Decision Tree)를 여러개 만들어서 그 결과들을 종합적으로 고려하여 결론을 도출하는 방법입니다. 예를 들어 집단지성을 통해서 결론을 도출할 때 한쪽에 치우치지 않은 더 좋은 결론을 도출해낼 수 있는 것과 비슷한 원리라고 생각하면 될 것 같습니다. 앙상블(Ensemble) 방법이란? 강력한 하나의 모델을 사용하는 대신 보다 약한 여러개의 모델을 조합하여 더 정확한 예측을 해주는 방법..

결정트리모델(Decision Tree Model)

이번 블로그는 머신러닝 모델에 가장 많이 언급되고 사용되는 결정트리모델에 대해서 알아보겠습니다. 누구나 어렸을 때 스무고개놀이를 해보셨으리라 생각합니다. 결정트리 모델은 스무고개를 통해서 정답을 추론하는 것과 비슷한 방법으로 데이터를 분류하거나 수치를 추론(회귀)하는 모델입니다. 예를 들어 "개/참새/오징어/고래" 이렇게 4가지를 분류하는 문제가 있다고 생각해봅시다. '물에 사는 동물인가요?'라는 질문으로 [개,참새] / [오징어/고래]로 나눌수가 있습니다. 다시 '날 수 있는 동물인가요?'라는 질문으로 개와 참새를 구분할 수 있고 '다리가 10개인가요?'라는 질문으로 오징어와 고래를 구분할 수 있습니다. 이렇게 어떤 기준을 잡아서 데이터들을 구분하는 모델을 결정트리(Decision Tree)모델이라고 ..

백준 1920 파이썬(이분탐색)

이진탐색(binary search)를 통해서 풀 수 있는 문제다. 이진탐색을 사용할 수 있는 조건은 배열이 정렬이 된 상태에서 사용할 수 있다. 또한 이진탐색은 순차적으로 탐색하는 방법보다 훨씬 빠르게 원하는 값을 찾아낼 수 있다. 시간복잡도 -> O(logN) 탐색해야하는 숫자의 수가 절반씩 줄어들기 때문에! 이진탐색은 반복문 말고도 재귀를 사용하여 구현할 수 있다. 두가지 모두 알아두고 구현해낼 수 있도록 연습해야겠다. # 1920 수 찾기 n = int(input()) list_n = list(map(int, input().split())) list_n.sort() m = int(input()) list_m = list(map(int, input().split())) # 반복문을 이용한 이진탐색 d..

백준 1744 파이썬(그리디)

그리디 문제인만큼 어떤 딱 떠오르는 아이디어를 찾으려고 하기보다는 생각나는대로 생각을 이어가보았다..!! 우선 양수와 음수를 따로 리스트로 변수설정을 해줬다. 양수 리스트에서는 큰 수 끼리 곱해서 더해줄 떄 가장 큰 값을 가지므로 내림차순, 음수 리스트는 작은수 끼리 곱해서 더해줄 때 (음수 * 음수 = 양수)가 되므로 오름차순으로 정렬했다. 그리고 큐 자료구조를 이용해서 양수,음수 리스트에서 하나하나 빼가면서 나중에 한꺼번에 곱해줄 리스트(ans)에 추가해줬다(append) 이후 조건에 대한 자세한 설정은 문제에 나와있는 예제들을 하나하나 만족시켜가면서 만들어 본 것이다. 운좋게 한번에 통과가 되었다. 역시 그리디 문제는 겁먹지 말고 조금 지저분한데 싶더라도 일단 해보는게 가장 좋은 전략인듯 싶다! #..

백준 1439 파이썬(그리디)

중간의 뒤집는 숫자의 개수가 얼마나 많던지 상관없이 숫자가 얼마나 바뀌는지만 잘 계산하면 풀리는 문제다. 0 -> 0번 바뀜 -> 0번 뒤집음 01 -> 1번 바뀜 -> 1번 뒤집음 010 -> 2번 바뀜 -> 1번 뒤집음 0101 -> 3번 바뀜 -> 2번 뒤집음 01010 -> 4번 바뀜 -> 2번 뒤집음 010101 -> 5번 바뀜 -> 3번 뒤집음 0101010 -> 6번 바뀜 -> 3번 뒤집음 이렇게 계산되므로 규칙을 생각해보면 바뀌는 수(count) 에 1을 더한 수를 2로 나눈 나머지가 뒤집는 횟수가 된다. num = input() count = 0 for i in range(len(num)-1): if num[i] != num[i+1]: count += 1 print((count+1)//2)