Menu 364

금광

1. 문제 설명 2. 문제 조건 n은 3, m은 4 1 3 3 2 2 1 4 1 0 6 4 7 형태로 되어있다. 3. 문제 해결 아이디어 금광의 모든 위치에 대하여 다음의 세 가지만 고려 1. 왼쪽 위에서 오는 경우 2. 왼쪽 아래에서 오는 경우 3. 왼쪽에서 오는 경우 세 가지 경우 중에서 가장 많은 금을 가지고 있는 경우를 테이블에 갱신해주어 문제를 해결한다. 이때 테이블에 접근할 때마다 리스트의 범위를 벗어나지 않는지 체크해야 한다. 4. 답안 #테스트 케이스 입력 for tc in range(int(input())): #금광 정보 입력 n, m = map(int, input().split()) array = list(map(int, input().split())) #DP 테이블 초기화 dp = [..

효율적인 화폐 구성

1. 문제 설명 2. 문제 조건 2가지(N)으로 총합 15(M)을 만들기 위해 2원화폐와 3원화폐 3가지(N)으로 총합 4(M)을 만들기 위해 3,5,7원 화폐 3. 문제 해결 아이디어 [Step 0] N = 3, M = 7이고, 각 화폐의 단위가 2, 3, 5인 경우를 확인 초기화 작업 먼저 각 인덱스에 해당하는 값으로 INF(무한)의 값을 설정 INF는 특정 금액을 만들 수 있는 화폐 구성이 가능하지 않다라는 의미 10,001을 사용가능 1~7까지는 만들수 없는 무작위의 값을 설정 인덱스(0) = 0원을 만들기 위한 최소한의 화폐 개수는 0 [Step 1] 첫 번째 화폐 단위인 2를 확인한다. 점화식에 따라서 다음과 같이 리스트가 갱신된다. 인덱스 2원을 만들 수 있는건 1개 인덱스 4원을 만들 수 ..

1로 만들기

1. 문제 설명 2. 문제 조건 3. 문제 해결 아이디어 피보나치 수열 문제를 도식화한 것처럼 함수가 호출되는 과정을 그림으로 그리면 이와같다. 최적 부분 구조와 중복되는 부분 문제를 만족 1을 빼는 연산을 제외하고는 해당 수로 나누어떨어질 때에 한해 점화식을 적용할 수 있다. 4. 답안 x = int(input()) d = [0] * 30001 #바텀 업방식 for i in range(2, x + 1): #현재의 수에서 1을 빼는 경우 d[i] = d[i - 1] + 1 #현재의 수가 2로 나누어 떨어지는 경우 if i % 2 == 0: d[i] = min(d[i], d[i // 2] + 1) #현재의 수가 3으로 나누어 떨어지는 경우 if i % 3 == 0: d[i] = min(d[i], d[i /..

개미 전사

1. 문제 설명 2. 문제 조건 3. 문제 해결 아이디어 N = 4일 때, 다음과 같은 경우들이 존재할 수 있다. 식량을 선택할 수 있는 경우의 수는 다음과 같이 8가지이다. 7번째 경우에서 8만큼의 식량을 얻을 수 있으므로 최적의 해는 8이다. i는 인덱스이므로 0부터 시작한다. 창고 0만 있을 때는 a(o) = 1이 최대 값 창고 0,1만 있을 때는 a(1) = 3이 최대 값 창고 0,1,2만 있을 때는 a(2) = 3이 최대 값 모든 창고일때는 창고1, 3 = 8이 최대 값 이렇게 DP 테이블 값을 재정의한다. 왼쪽부터 차례대로 식량창고를 턴다고 했을 때, 특정한 i번째 식량창고에 대해서 털지 안 털지의 여부를 결정 위 2가지 경우 중에서 더 많은 식량을 털 수 있는 경우를 선택하면 된다. 즉, i..

다이나믹 프로그래밍 개요 (피보나치 수열)

메모리를 적절히 사용하여 수행 시간 효율성을 비약적으로 향상시키는 방법이다. 이미 계산된 결과(작은 문제)는 별도의 메모리 영역에 저장하여 다시 계산하지 않도록한다. 다이나믹 프로그래밍(동적 계획법)의 구현은 일반적으로 두 가지 방식(탑다운과 바텀업)으로 구성 동적(Dynamic)이란? 자료구조에서 동적 할당(Dynamic Allocation)은 프로그램이 실행되는 도중에 실행에 필요한 메모리를 할당하는 기법 다이나믹 프로그래밍에서 다이나믹은 별다른 의미가 없다. 1. 다이나믹 프로그래밍의 조건 최적 부분 구조(Optimal Substructure) 큰 문제를 작은 문제로 나눌 수 있으며 작은 문제의 답을 모아서 큰 문제를 해결할 수 있다. 중복되는 부분 문제(Overlapping Subproblem) ..

10. Dev Tools(Tokenizer, Synonym)

데이터 전처리 진행(동의어처리, 사용자 정의사전) 1. Tokenizer 사용자 단어 정의 v2를 복사해서 v3를 만들고 그대로 내용을 붙여 넣는다. 그리고 ‘analyzer’ 의 하위 필드인 custom_nori를 만들어주고 내용은 아래와같이 넣는다. char_filter = 위에 만들었던 변수명 tokenizer = 위에 선언했던 변수명 filter = 적용할 필터 변수명 여기서는 아직 위의 필터를 정의하지 않았으므로 임의적으로 동의어필터 라는 단어를 넣었다. 바로 위 ‘tokenizer’ 필더의 하위 필더에 ‘custom_nori_tokenizer’를 선언한다. 내용은 이와같이 적는다. user_dictionry_rules : 에는 단어를 분리하지않고 하나의 단어로 인식할 단어의 목록들을 적는다. ..

9. Dev tools(GET, PUT, DELETE)

PUT라인에 커서를 올리고 ctrl + enter로 실행해본다. 에러없이 잘 진행됐으면 오른쪽에 이와같이 출력된다. 두 번이상 실행하면 에러가 뜬다. 이미 PUT을 했기에 중복이 안된다는 것이다. 이땐 아래처럼 DELETE를 이용해서 삭제하고 다시 정의해주면 해결된다. GET을 통해 출력이 잘 되는지 확인한다. 오른쪽에 잘 나온다. 4. TEST 잘되있는지 테스트해보자. GET이후 /_analyze를 이용한다. 이를 이용하면 token이 입력한 그대로 데이터그 자체로 토큰이 만들어진다. 이것과 꼭 일치한 것만 검색한다. 라는 의미이다. dtail뒤에 detail.raw를 쓰면 오른쪽과 같이 내부에서 자동적으로 토큰을 나눠준다. 여기서는 3개의 토큰으로 나뉘어 생성된다. 찾을 택스트는 : 와같이 적어준다...

8. Dev Tools(Setting & Mapping)

데이터 전처리 진행(불용어 제거, 맞춤형 검색, 수정, 정재) 1. 데이터 검토 및 Mapping 홈에서 메뉴를 클릭하고 Management의 Dev Tools에 들어간다. 미리 만들어두었던 Index Pattern을 GET으로 불러온다. 그 이후 Ctrl + Enter로 실행한다. 그러면 오른쪽에 쿼리를 쭉 살펴볼 수 있다. 왼쪽 화살표를 이용해도 좋고, 최소화 하고자하는곳에 커서를 올리고 Alt + 0을 누르면 축소시킬 수 있다. Index Pattern에는 크게 ‘mapping’ 와 ‘settings’쿼리가 존재한다. ’mapping’하위 필드는 ‘_meta’, ‘properites’ 등이 존재한다. ’properties’를 클릭해보면 각각의 document들이 가지고 있는 필드를 볼 수 있다. t..

7. Maps

키바나의 장점인 다양한 Maps 왼쪽메뉴에서 [Management]클릭 후 [Kibana]영역의 [Index Pattern] 클릭 그 이후 오른쪽 상단 Create index pattern을 클릭한다. 이 창에서 [Name]에 이와같이 적으면 오른쪽 인덱스가 쭉나온다. *(와일드카드)를 통해 하나의 인덱스로 모두 묶을 것이다.가 없으면 하나의 인덱스에 대해 패턴을 만드는 것 이 인덱스들은 네이버 쇼핑을 크롤링한 것들이다. 오른쪽 4개를 n_shopping으로 인덱스 패턴을 만들겠다. 오른쪽 메뉴 클릭 후 대시보드에 들어가 확인한다. 왼쪽 상단을 보면 Indexpattern이 잘 만들어져 들어간것이 보인다. 오른쪽 상단 부분의 그래프 부분을 드래그해서 확대해서 원하는 부분만 볼 수 있고 다시 돌아가러면 상..

6. Tag Cloud

가장 많이 언급된 단어를 클라우드처럼 시각화하는 기능이다. [All types] ⇒ [aggregation based] ⇒ [tag Cloud] 선택 오른쪽에서 Buckets추가해주고 Terms누르고 필드는 소분류, 크기는 100개로설정 [Orientations] = 글자 방향을 선택해줄 수 있다. 정방향, 역방향, 뒤집기 등등... [Font Size]로 크기도 설정할 수 있다. 범위는 작은건 더 작게,, 큰건 크게..등등 적용이 가능하다.