일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 데이터야놀자
- 데이터플랫폼
- kafka
- 2017회고
- 코딩인터뷰
- clean code
- coursera
- 박종천
- wait region split
- hackercup2017
- functional thinking
- 개발7년차매니저1일차
- 2016년회고
- 회고
- spray
- datalake
- 클린코드
- 해커컵
- Raw-Request-URI
- 단위테스트
- 알고스팟
- 개발자로살아남기
- 테스트주도개발
- 데이터레이크
- 동시성
- 실전사례
- 함수형 사고
- 데이터유통
- 개발자
- 켄트백
- Today
- Total
목록알고리즘 (27)
Software Engineering Note
문제: DIAMONDPATH / 동적계획법(DP) 해결전략 시작점부터 계속해서 최대값을 유지해나간다. 최종 값이 최대값이 되려면 그 이전 단계까지의 값도 최대 값이 되어야 한다. 1) 1~5단계가 있다고 하면 일단 1->2단계로 가는 최대 값을 구한다. 2) 다음 2->3단계로 가는 최대 값을 구한다. 이런 식으로 5단계까지 간다. 코드: https://github.com/xgate/algospot/blob/master/DP/DIAMONDPATH.cpp
문제: COIINS / 동적계획법 (DP) [ 해결전략 ] 10, 50, 100원으로 110원을 만드는 경우를 생각해보자. 10x1110x5+50x150x210x1+100x1 이렇게 네 가지 경우이다. 더 작게 생각해보면 50원을 만들 수 있는 방법은 2가지 (10x5, 50원 자기자신) 이다. 여기서 어렵게 느껴지는 부분은 모든 경우의 수를 다 고려해야 한다는 점이다. 즉, 10원을 한 번 사용해보고(10원), 두 번 사용해보고(20원), 세 번 사용해보고(30원)... 만드려는 금액이 110원보다 작은 범위에서 모든 조합을 시도해봐야 한다. 동전의 종류가 많아진다면? 일일이 조합해서 카운트 하는 방법으로는 문제를 해결할 수 없다. 여기서 어떤 사실을 고려해야 하는지 생각해보면 실마리를 잡을 수 있다...
문제: ENDIANS / 구현 해결전략. - 1byte씩 읽어서 메모리에 값을 역으로 저장한다. 1) 입력 값이 저장된 변수의 주소+3위치로 이동한다. 1byte 단위로 이동을 위해 char형 포인터로 변환한다. 2) 결과값을 저장할 변수의 주소로 이동한다. 역시 char형 포인터로 변환. 3) 입력 값 변수의 주소 값은 감소, 결과 값 변수의 주소 값은 증가 하며 메모리 복사.[출처] [AOJ 문제] Endians|작성자 DevMoon 코드: https://github.com/xgate/algospot/blob/master/IMPL/ENDIANS.cpp
문제: NQUEEN / 조합탐색 해결전략 1. 이중배열 이용[출처] [AOJ 문제] N-Queen|작성자 DevMoon 1) 퀸을 놓기전에 상, 좌상, 우상 방향에 퀸이 있는지 검사한다. 2) 있으면 다른 칸에 놓는 것을 시도하고, 없으면 그 자리에 놓는다. 3) 다음 퀸을 놓기위해 재귀함수를 호출한다.[출처] [AOJ 문제] N-Queen|작성자 DevMoon 코드: https://github.com/xgate/algospot/blob/master/SEARCH/NQUEEN1.cpp 해결전략 2. bit 연산 이용 1) queen의 위치를 bit로 표현한다. 2) 위의 행에 있는 queen과 겹치는지 bit 연산을 이용해서 판단한다. 3) 다음 퀸을 놓기위해 재귀함수를 호출한다.[출처] [AOJ 문제] ..
문제: 남극기지 / 그래프 or 이진탐색 모든 노드가 전파를 받을 수 있어야 하고 전파의 출력은 최소화 해야한다. 이 문제를 해결하는데 두 가지 방법을 사용할 수 있다. 1. parametric search parametric search는 어떤 알고리즘으로 해를 바로 구해내는 것이 아니고, 임의의 값을 던지고 맞는지 확인해가며 해를 구하는 방법이다. 앞에서 언급한 임의의 값을 정하는 과정에 이진탐색이 사용될 수 있다. 이 방법을 이용한 알고리즘은 다음과 같다. 1. 초기 값으로 해의 최소값과 최대값을 이진탐색의 low, high 값으로 각각 지정한다. 2. mid((low+high)/2)값이 해가 될 수 있는지 검사해본다. 이말의 의미는 전파의 출력이 mid값인 경우 모든 노드들이 연락을 주고 받을 수..
문제: Shisen-sho / 조합탐색 사천성이라는 게임이 문제의 배경이고 게임 난이도를 정하는 것이 문제이다. 게임 난이도는 한 번에 없앨 수 있는 tile의 쌍으로 정해진다. 탐색의 방향이 정해져있으면 간단했을 건데 상.하.좌.우 모두 훑어봐야 하고, 중복되는 경우는 카운트 하지 말아야하기 때문에 약간 까다로웠다. 소소한 고민. 1. 꺽어지는 경우를 어떻게 판단할까? 문제에서는 3번 이상 방향이 전환되는 경우는 카운트하지 말아야한다고 했다. 방향 전환 유무를 어떻게 감지할까? 생각해보니 이전위치와 다음위치를 검사하면 될것같았다. 방향이 바뀌지 않았다면, 다음위치와 이전 위치가 적어도 x, y 둘 중 하나의 값은 같을 것이다. 둘다 다르다면 방향이 전환된 것이다. 그래서 재귀함수에 이전좌표를 넘겨줬다...
문제: MATEXP / 분할정복 한 번에 한 번씩 계산해서는 시간내에 해결할 수 없다. 그렇다면? 반 씩 나누어서 계산하면 빠르게 해결할 수 있다. 1*1 행렬 계산을 해서 승수 2에 대한 값을 만들고, 다시 2*2를 해서 승수 4에 대한 값을 만들고.. 이런 식으로 하면 logN번만 계산하면 된다. 100 by 100 행렬 계산에 그리 큰 시간이 소요되지 않으므로, 행렬 계산은 단순하게 3중 loop로 처리했다. 총 복잡도는 코드: https://github.com/xgate/algospot/blob/master/DIV/MATEXP.cpp