우선 강사님께서 풀어주신 top-down 코드는 다음과 같습니다. class Solution(object): def uniquePaths(self, m, n): memo = {} def dfs(r, c): if (r, c) == (0, 0): # 출발점에 도달한 경우 return 1 if (r, c) not in memo: # 메모이제이션에 값이 없는 경우 계산 paths = 0 if r - 1 >= 0: # 위쪽 셀에서 오는 경우 paths += dfs(r - 1, c) if c - 1 >= 0: # 왼쪽 셀에서 오는 경우 paths += dfs(r, c - 1) memo[(r, c)] = paths # 결과 저장 return memo[(r, c)] # 결과 반환 return dfs(m - 1, n - 1) 이 코드는 grid에 해당하는 함수만 호출하고, 중복되는 호출은 memo에 저장하기 때문에 총 O(M*N)이 됩니다. 다음은, 디스코드의 다른 사람이 올려주신 코드를 참고해서 조합론을 적용한 코드입니다. class Solution(object): def uniquePaths(self, m, n): memo = {} def fact(x): if x <= 1: return 1 if x not in memo: memo[x] = fact(x - 1) * x # factorial의 결과값을 메모리에 저장 return memo[x] return fact(m + n - 2) / (fact(m - 1) * fact(n - 1)) # fact(m + n - 2) 부분만 호출하고, 분모는 캐싱하므로 시간복잡도는 O(M+N) 분자에 해당하는 부분만 함수를 호출하기 때문에 시간복잡도는 O(M+N)이 됩니다. 우선 제가 궁금한 것은 2가지입니다. 1) 위의 두 코드를 비교했을 때, 수학적으로 접근한 코드가 시간복잡도가 더 낮은데요 항상 dfs, bfs를 먼저 쓰는게 좋은 것은 아닌가요? 2) 강의에서는 조합론을 이용한 방법이 198C99 = 약 2*10^58이여서 완전탐색은 안된다고 하셨는데, 실제로 제출했을 때는 제출이 됬습니다. 왜 이런 차이가 발생한건가요?
[리뉴얼] 파이썬입문과 크롤링기초 부트캠프 [파이썬, 웹, 데이터 이해 기본까지] (업데이트)
- 본 강의 영상 학습 관련 문의에 대해 답변을 드립니다. (어떤 챕터 몇분 몇초를 꼭 기재부탁드립니다) - 이외의 문의등은 평생강의이므로 양해를 부탁드립니다 - 현업과 병행하는 관계로 주말/휴가 제외 최대한 3일내로 답변을 드리려 노력하고 있습니다 - 잠깐! 인프런 서비스 운영(다운로드 방법포함) 관련 문의는 1:1 문의하기를 이용해주세요. 서버에 피해가 가지않도록 크롤링할 수 있는 방법은 없을까요?
항상 startIndex가 endIndex보다 작다라는 게 보장되지 않나요? endIndex = r.text.find("};", startIndex + 1) if 0 <= startIndex else 0 여기 구문에서 endIndex는 항상 startIndex보다 큰 값을 가지는 게 보장되는데, 왜 if startIndex < endIndex: 이 조건을 추가해주나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. was 에 예외가 던져지면 BasicErrorController 를 호출해서 적절한 뷰를 찾아 주는건 알았습니다 근데 was 에 정상 요청이 도착하는데 그 안에 4xx 이나 5xx같은 에러 상태코드가 있는경우 response에 아무런 내용을 채우지도 않고 모델앤뷰도 아무것도 없는걸 리턴할경우를 보내보았는데 이런 뷰는 어디서 생기는걸까요 ? 기본 브라우저에서 제공하는 화면인걸까요 ?
안녕하세요 ! 동일한 코드로 선생님의 채점기에 돌렸을 때는 100점이 나왔는데 백준에서는 recursion 에러가 납니다. 종료조건도 잘 설정해준 것 같은데 어디서 그렇게 호출이 많이 일어나는지 이해가 되지않아서요 ㅠㅠ 강의 잘 듣고 있습니다. 감사합니다!! # 1. 재귀 (근데 백준에서는 recursion 에러 뜸..) n = int(input()) meetings = [] for _ in range(n): meetings.append(list(map(int, input().split()))) meetings.sort(key=lambda x: (x[1], x[0])) # 끝나는 시간을 기준으로 정렬 # x[1]이 같을 경우 x[0]을 기준으로 정렬 def find(i, cnt): for j in range(i+1, n): if meetings[i][1] <= meetings[j][0]: # 회의 끝나는 시간보다 시작하는 시간이 더 크거나 같은 것 찾기 cnt += 1 return find(j, cnt) # 또 찾기 return cnt print(find(0, 1))
자바 공부를 마치고 스프링공부를 하려고 강의를 듣는도중 뭔가 한두단계를 건너뛰고 스프링 공부를 시작하는 느낌이 들었습니다.. 지금 쓰고 있는 annotation, 라이브러리들이 뭔지 하나도 감이 잡히지 않았네요 저런 지식들은 스프링 공부하면서 외우거나 익히는 건가요? 아니면 선행 학습이 필요한 과목이 있나요?
[리뉴얼] 파이썬입문과 크롤링기초 부트캠프 [파이썬, 웹, 데이터 이해 기본까지] (업데이트)
리스트가 너무 이상하게나와요 ㅠ - 본 강의 영상 학습 관련 문의에 대해 답변을 드립니다. (어떤 챕터 몇분 몇초를 꼭 기재부탁드립니다) - 이외의 문의등은 평생강의이므로 양해를 부탁드립니다 - 현업과 병행하는 관계로 주말/휴가 제외 최대한 3일내로 답변을 드리려 노력하고 있습니다 - 잠깐! 인프런 서비스 운영(다운로드 방법포함) 관련 문의는 1:1 문의하기를 이용해주세요.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 클라이언트 요청 → DispatcherServlet → RequestMappingHandlerMapping: 어노테이션 기반의 요청 매핑을 처리하여 HandlerMethod를 반환 →수많은 어댑터중에 RequestMappingHandlerAdapter가 Support()로 확인해보니 HandlerMehtod클래스를 지원해서 HandlerMehtod클래스핸들러 사용 → 요청 처리 → . 응답 반환 근데 인터셉터는 RequestMappingHandlerAdapter로 어댑터 채택하고 RequestMappingHandlerAdapter가 Support()로 확인하는 과정 전에 호출되니 핸들러가 handler instanceof HandlerMethod 검증하는 과정이 필요하기때문에 preHandle함수에 저 로직에 넣는다고보면되나요 ?
안녕하세요. 커넥션 풀 관련 질문이 있습니다! 커넥션 풀에있는 커넥션들은 dbms와 계속 연결되어있는 상태라고 하셨습니다. 만약 커넥션풀에 커넥션이 10개일때 이 10개의 커넥션은 dbms 세션이 계속 끊기지않고 연결되어있을테고 dbms 서버가 다운되지않는 이상 세션이 계속 유지 될텐데.. temp table 같은 가상 테이블을 사용하게 되면 세션이 무조건 종료 되어야 메모리에서 가상 테이블이 소멸된다고 알고 있는데 커넥션풀을 사용하게되면 temp Table 은 소멸되지않고 계속 dbms 서버 메모리에 떠있게 되는건가요? 아니면 커넥션을 사용하고 반납하는 순간 세션이 끊기는건가요?
데이터 전처리 과정에서 이해되지 않는 부분이 있습니다. import pandas as pd import FinanceDataReader as fdr df_krx = fdr.StockListing('KRX') df_krx 로 데이터를 확인했습니다. ㄴ일부 컬럼 (ex.Dept)에 결측치가 있습니다. <- 값이 비어있습니다. Nan 값으로 채워진 것은 아닙니다. ㄴ이 때 info() 메소드와 df_krx.isnull()로 확인해보면 null값이 없는 것으로 나오고 isnull() 또한 모두 false가 나오는데 원인을 모르겠습니다. ㄴ이후 to_csv 메소드를 사용하여 파일을 저장한 후 저장한 파일을 읽어왔을 때는 해당 값들이 NaN 값으로 바뀌어 있는데요. 원인이 무엇일까요?
# warning 어쩌구 뜨면 쓰는건데 굳이 안써도 됨 import urllib3 urllib3.disable_warnings() # text None Type 에러 일 시 header를 추가해준다. # SSLdError 발생 시 verify옵션 추가해준다. header = { 'User-Agent' : 'Mozilla/5.0', 'Referer' : 'https://www.riss.kr/search/Search.do?isDetailSearch=N&searchGubun=true&viewYn=OP&queryText=&strQuery=%ED%8C%A8%EC%85%98+%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5&exQuery=&exQueryText=&order=%2FDESC&onHanja=false&strSort=RANK&p_year1=&p_year2=&iStartCount=0&orderBy=&mat_type=&mat_subtype=&fulltext_kind=&t_gubun=&learning_type=&ccl_code=&inside_outside=&fric_yn=&db_type=&image_yn=&gubun=&kdc=&ttsUseYn=&l_sub_code=&fsearchMethod=&sflag=1&isFDetailSearch=N&pageNumber=1&resultKeyword=%ED%8C%A8%EC%85%98+%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5&fsearchSort=&fsearchOrder=&limiterList=&limiterListText=&facetList=&facetListText=&fsearchDB=&icate=re_a_kor&colName=re_a_kor&pageScale=100&isTab=Y®nm=&dorg_storage=&language=&language_code=&clickKeyword=&relationKeyword=&query=%ED%8C%A8%EC%85%98+%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5' } for article in articles: title = article.select_one(".title > a").text link = 'https://www.riss.kr' + article.select_one(".title > a").attrs['href'] # 상세 페이지로 요청 response = requests.get(link, headers=header, verify=False) html = response.text soup = BeautifulSoup(html, 'html.parser') # 2. 순서를 기준으로 찾기 if soup.find('span', string='발행기관'): press = soup.find('span', string='발행기관').find_next_sibling().text # find_next_sibling 옆에 있는 명령어를 찾아라 라는 명령문 else: press = [] if soup.find('span', string='발행연도'): year = soup.find('span', string='발행연도').find_next_sibling().text else: year = [] if soup.find('span', string='주제어'): keywords = soup.find('span', string='주제어').find_next_sibling().text.split(';' '') keywords_result = [] for keyword_for in keywords: keywords_result.append(keyword_for.strip()) else: keywords = [] print(title, link, press, year, keywords_result) # result = [] # for keyword in keywords: # result.append(keyword.strip())
안녕하세요. 강의를 듣던중에 예외처리부분에 대해서 헷갈려서 다음장 예외처리 부분의 강의를 미리 보면서 구글링도 하면서 아래와 같이 정리해보았는데, 이렇게 이해하면 될까요? 0. throw = 예외를 던진다 = 예외를 발생시킨다. throws = 예외를 호출하는쪽으로 던진다. 1. [체크예외] - 반드시 예외처리를 해야함. 메소드 안에서 throw를 통해 throw new 체크예외()를 하게되면, throw new 체크예외()를 try~catch를 통해 해결하거나, throws로 체크예외를 던져서 해당메소드를 호출하는쪽에서 예외를 처리하도록 해야한다. public void call() { throw new 체크예외(); } 이 코드에서 call메서드는 예외를 처리하거나 throws로 던지지않았다. 그래서 컴파일오류가 발생한다. 그렇기때문에 call() 옆에 throws 체크예외를 적어주거나, public void call() { try { throw new 체크예외(); } catch (MyCheckedException e) { e.printStackTrace(); // 예외 처리 로직 } } try~catch로 예외를 처리해야한다. 즉, 메소드를 실행할떄 , 메소드 내부에서 throw을 사용해서 예외를 발생시키고 싶으면, 예외를 발생시키는 코드만 단독으로 있으면 안되고 try문안에서 예외를 발생시키고 예외가 발생하면 catch를 통해 예외를 처리하는 코드랑 같이 사용하거나, throws로 해당예외를 실행시키는 메소드를 호출하는쪽에서 예외처리를 하게하도록 throws를 통해 넘겨야한다. 참고로 try~catch를 통해 해결하면 메서드를 호출하는쪽에서는 별다른 예외처리 없이 메서드를 사용할수있다. 2. [언체크예외] - 예외처리를 하지않아도됨. public void call(){ throw new 언체크예외(); } 컴파일오류가 발생하지않는다. 이코드에서 call메서드는 예외를 처리하지않아도되고, throws로 예외를 던지지않아도된다. 3. 체크예외를 처리한 후 catch 블록에서 다시 throw new 언체크예외()을 하는 것은 체크 예외를 언체크 예외로 바꿔서 언체크 예외를 발생시키기위함이다. throw new 언체크예외();는 예외를 단순히 발생시키는 것이기때문에 try~catch를 통해 해결하지않아도 되고 별도로 throws를 하지않아도 되기때문이다. 참고로 throw new 언체크예외();를 통해 언체크예외가 발생하면 프로그램이 중단된다.