백준 9625 python

이미지
백준 9625 python 백준 9625 python 기본적으로 첫 시도로는 무식한 방법(브루트포스)을 선호한다. 문자열을 그대로 만들자 def get_next_brute ( string ) : new_chars = [ ] # new_string으로 해도 되지만 문자열 덧셈은 시간을 많이 잡아먹는다 for c in string : if c == "A" : new_chars . append ( "B" ) if c == "B" : new_chars . append ( "BA" ) return "" . join ( new_chars ) 시행횟수가 증가할 때마다 2배씩 길이가 증가하기 때문에 45까지하면 메모리가 터질 것이다. 개선하자. 직접 계산할 필요없이 A와 B의 개수만 세도 괜찮을 것 같다. def get_next ( a_cnt , b_cnt ) : a_cnt = b_cnt # b => b,a가 되기 때문에 a가 생김 b_cnt = a_cnt + b_cnt # return a_cnt , b_cnt

백준 2711 python

이미지
백준 2711 python 백준 2711 오타맨 고창영 인덱스가 0이 아닌 1부터 시작하니까 1씩 빼주면 끝 n = int ( input ( ) ) for _ in range ( n ) : k , string = input ( ) . split ( ) k = int ( k ) - 1 print ( string [ : k ] + string [ k + 1 : ] )

백준 11650 python

이미지
백준 11650 python 커스텀하게 sort하는 문제이기 때문에 def compare 함수가 필요하다 python2에서는 sort함수에 cmp라는 keyword parameter가 있어 아래와 같이 사용가능했지만 points . sort ( cmp = compare ) python3에서는 없기 때문에 from functools import cmp_to_key points . sort ( key = cmp_to_key ( compare ) ) 와 같이 사용해야한다. from functools import cmp_to_key # 1개 수만 비교한다 def compare_num ( a , b , ascending = True ) : flag = 1 if ascending else 0 if a > b : return flag elif a < b : return 1 - flag return 0 # pair를 비교한다. def compare ( p1 , p2 ) : comp1 = compare_num ( p1 [ 0 ] , p2 [ 0 ] ) if comp1 != 0 : return comp1 return compare_num ( p1 [ 1 ] , p2 [ 1 ] ) n = int ( input ( ) ) points = [ ] for _ in range ( n ) : p = tuple ( map ( int , input ( ) . split ( ) ) ) points . append ( p ) points . sort ( key = cmp_to_key ( compare ) ) 위와 같이 compare_num을 두게 되면 각 compare와 compare_num의 역할이 분리되어 더 깔끔하다.

버트(BERT) 모델 이해하기

버트(BERT) 모델 이해하기 버트란 개요 버트란 다양한 자연어 처리 태스크를 푸는데 활용될 수 있는 딥러닝 모델이다. 특징 어탠션 기반인 트랜스포머의 인코더를 쌓아 만들었다. (Pre-train) 큰 코퍼스를 비지도학습을 통해 대량의 머신을 사용해서 학습시킨다. (Fine-Tune) 해당 모델을 가져와 다양한 자연어 태스크들에 맞게 모델을 살짝씩 수정해 지도학습을 수행한다. 문장(문서)을 이루는 각 단어가 들어가 학습된 임베딩을 반환하는 구조이다. CLS, SEP 토큰. CLS(Classification) 토큰은 분류 문제를 풀기위한 추가한 요소로 출력 CLS 임베딩에 FCN + Softmax 레이어를 붙여 N클래서 분류문제를 풀 수 있다. SEP(Seperation) 토큰은 여러 문장을 입력할 때 각 문장을 구분하기 위해서 넣은 요소이다. 예를 들어 2개 문장을 입력할 때 두 문장이 연속된 문장인지 맞추는 이진분류 문제를 풀 때 사용한다. Positional, Segment Embedding Layer 각 단어의 순서를 의미하는 Position Embedding과 여러 문장의 구분을 나타내는 Segment Embedding을 랜덤 임베딩으로 학습시켜 더해서 사용한다. 학습 방법 비지도 학습(Pre-train) Masked learning : 모든 단어중 약 15%를 랜덤으로 뽑아 학습 대상으로 삼는다. 15%가 모두 Maske 토큰이 되는 것은 아니다. 12%의 입력단어는 <Mask> 토큰이 되어 해당 단어의 출력임베딩을 사용해 해당 정답 단어를 맞추는 방식으로 학습된다. 1.5% 입력단어는 변동없이 입력되어 실제 정답을 맞추도록 한다. 나머지 1.5% 입력단어는 이상한 단어로 치환되어 이 경우에도 정답을 맞추도록 한다. 위 과정을 통해 <Mask> 토큰에 대한 학습단계에서 오버피팅을 막고 테스트에서도 잘 동작하는 모델을 만들 수 있다. 이 학습

DeepST

이미지
DeepST 한마디 단순 시계열 이동 데이터를 이미지로 만들어, 시-공간을 반영하는 이동 예측 모델. 논문 간단 정리 사람들의 이동 데이터를 지도로 만들어 강제로(?) convolution처리를 하게 했다. 지도로 만듦으로써 이동에서 공간적(spatial) 연관성을 반영할 수 있었다. 시간이 흐름에 따른 과거 데이터도 지도로 만들어 convolution을 사용해 시간적(Temporal) 연관성을 반영할 수 있었다. 시간적 연관성을 3가지 연관성으로 나누었고 모두 convolution 처리를 통해 피쳐를 얻었다. 짧은 시간에서의 연관성 매일 같은 시각과의 연관성 시즌별 시간과의 연관성 2단계 convolution 각 지도데이터에 convolution을 한 번을 적용하는 경우보다 두 번의 convolution을 적용하는 경우 더 넓은 지역 연관성을 반영할 수 있었다. 이른 피쳐 합침(early fusion) 짧은 시간, 매일 같은 시각, 시즌별 시각에서의 convolution 피쳐를 합친 뒤에 새로운 레이어에 집어넣는다. 이를 통해 비슷한 도메인의 피쳐가 일찍 결합되어 네트워크를 오래 탈 수 있게 한다. 늦은 피쳐 합침(late fusion) convolution 피쳐 말고, 날씨와 같은 데이터는 마지막 레이어에서 합친다. 서로 다른 도메인 데이터는 나중에 합치는 게 더 좋다고 한다. 구현 내용 각 시각마다 여러 개의 시계열 지도 이미지를 사용해서 하나의 피쳐를 만들어 낸다. 식을 살펴보면 각 시계열 이미지에 각각 컨볼루션을 처리한 피쳐들을 단순히 더하고 상수를 더해 활성함수인 f를 통과시킨다. 그리고 3가지 시각으로 구성된 convolution 피쳐에 다시 컨볼루션을 적용한 후에 단순히 더해 early fusion한다. 그 후에 추가적인 2개의 컨볼루션을 사용해 총 4개의 컨볼루션을 통해 최종적인 이미지 피쳐를 생성한다. 또한 시간 데이터와 날씨와 같은 데이터들을 d

뼈속 깊이 이해하기 :: 3. 퀵소트

뼈속 깊이 이해하기 :: 3. 퀵소트 뼈속 깊이 이해하기 :: 3. 퀵 소트 Quick Sort - 피봇을 왼쪽 가장자리로 잡을 때. 핵심 원리 lp는 정렬할 배열의 왼쪽 끝에서 시작, rp는 오른쪽 끝에서 시작. lp는 피봇값보다 작거나 같은 값들일 경우에 계속해서 지나친다. lp가 지난 슬롯들은 모두 피봇보다 작거나 같다는 것이 증명이 된다. rp는 피봇값보다 크거나 같은 값들일 경우에 계속해서 지나친다. rp가 지난 슬롯들은 모두 피봇보다 크거나 같다는 것이 증명이 된다. lp < rp를 만족한다면 두 값을 스왑한 후 위의 1- 2 과정을 반복한다. lp는 피봇이 위치할 장소를 찾는다. 즉 lp - 1을 pivot과 바꾸기만해도 왼쪽 끝부터 lp - 1까지 정렬된 것을 확신할 수 있다. 또한 rp의 오른쪽은 피봇보다 크거나 같다는 것을 확신할 수 있다. 따라서 바꾼후 피봇의 오른쪽까지 정렬되게 하려면, pivot과 rp가 일치해야한다. 결론, lp - 1위치에 rp가 왔을 때 rp와 바꾸면 정렬이 완료된다. import sys sys . setrecursionlimit ( 10 ** 8 ) read = sys . stdin . readline n = int ( read ( ) ) inputs = [ 0 ] * n for i in range ( n ) : inputs [ i ] = int ( read ( ) ) def swap ( inputs , x , y ) : tmp = inputs [ x ] inputs [ x ] = inputs [ y ] inputs [ y ] = tmp return def quick_sort ( inputs , l , r ) : if r - l <= 1 : return pivot = l lp =

2020 카카오 블라인드 오프라인 코딩 테스트 후기

이미지
2020 카카오 블라인드 오프라인 코딩 테스트 후기 2020 카카오 블라인드 오프라인 코딩 테스트 후기 이번 주말에는 코테가 몰려있다. 오늘은 카카오 오프라인 코딩 테스트를 치렀고, 내일은 네이버 공채 온라인 테스트를 치게 된다. 내가 취준하는 시기에 맞춰서 IT회사들이 공채를 많이 뽑아서 감사하다. 목감기가 오고 전날 악몽을 꿔서 컨디션이 좋지 않은 상태로 시험을 치루러 판교로 이동했다. 오프라인 코딩 테스트에서는 총 300명 가량이 참석한 것 같았다. 작년 엘레베이터 문제 1차 코테를 치루고나서, 작년 오프라인 코딩테스트였던 엘레베이터 문제를 풀어보려다가, 1차보다 급격히 어려워진 난이도에 당황했었다. 서버와 통신하면서 문제를 푸는 방식이 낯설었다. 무엇보다 지금까지 알고리즘 문제들을 풀면서 보지 못했던, 중규모의 구현을 다루고 있었다. 가장 큰 차이점은, 백준이나 프로그래머스의 문제들을 특정 알고리즘들을 쓸 수 있느냐를 묻는 문제였다면, 엘레베이터 문제는 설계 능력을 묻고 있었다. 일반적으로 생각하는 큐, 스택, dp, 이진 탐색과 같은 알고리즘을 전혀 모르더라도 풀 수 있었다. 대신 문제를 푸는 과정에서 전체 프로세스를 설계하고 복잡한 의사 결정과정을 실제로 구현할 수 있는지를 묻고 있었다. 올해 : 팔로잉 추천 알고리즘 카카오가 새롭게 출시한 서비스에서는 팔로잉이 가능하다. 그리고 개발자는 유저에게 팔로잉할만한 사람들을 “잘” 추천해주어 빠르게 모든 유저들이 적어도 20명을 팔로잉 하도록 해야한다. 개발자는 유저가 추천해준 사람을 클릭할 확률을 미리 파악할 수 있는데 유저의 전화번호 북에 없는 사람들 : + 5% 유저의 전화번호 북에 있는 사람들 : + 30% 증가 유저의 전화번호 북에 있는 사람들이 팔로잉 하는 사람들 : 각 + 10% 유저가 팔로잉하는 사람들이 팔로잉 하는 사람 : 각 + 10% 위의 4가지 조건을 사용해 좋은 추천을 해주어야 한다. 하루 끝에 한 번만 추천을