일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 데이터유통
- 데이터플랫폼
- 동시성
- Raw-Request-URI
- coursera
- spray
- 테스트주도개발
- 실전사례
- 클린코드
- 개발자
- hackercup2017
- 단위테스트
- 데이터레이크
- 해커컵
- 알고스팟
- 데이터야놀자
- 박종천
- 2016년회고
- 켄트백
- 코딩인터뷰
- 개발7년차매니저1일차
- clean code
- datalake
- wait region split
- 2017회고
- functional thinking
- Today
- Total
목록알고리즘 (27)
Software Engineering Note
문제: DARPA / 동적계획법, 이진탐색 처음에 greedy로 접근했다가 몇 번 물먹은 문제다. 잊고 지내다가 알고리즘 책(프로그래밍 콘테스트 챌린징)에서 유사한 문제를 보고 다시 도전해서 성공했다. 핵심전략은 다음과 같다. 모든 카메라에 대해, 임의의 두 카메라 간격을 d로 만들 수 있는지 확인한다. 1. d값은 입력으로 주어진 간격의 최대 값부터 시작한다.2. 만약 모든 카메라를 d간격 이상으로 설치할 수 있다면 d값을 늘려서 시도해본다. 왜? 가장 가까운 카메라 간격을 최대화 시켜야 하니까.3. 만약 실패하면 d값을 줄여서 시도해본다. 이렇게 d값을 조절해가면서 범위를 좁혀나간다. 2, 3번 과정에 이진탐색이 적용된다. 2번일 경우 left 값을 mid값으로 한다. 3번일 경우 right 값을 m..
문제: LUCKYNUM / 그리디(탐욕적인 방법) [ 해결책/후기 ] 문제를 보자마자 떠오르는 생각은 주어진 입력으로 구성된 모든 숫자를 만들고 그 숫자 중에서 정답을 찾는 것이다. 그러나 최대 200자리까지 입력되는데 이 방법을 썼다가는 TLE가 뻔하다. OTL 그러니 다른 접근 방법을 찾아야하는데 내가 접근한 방법은 lucky number에 가까운 수를 만들어가는 것이었다. 예를 들면 k=6일때 입력 값 n중에서 6이 입력되었는지 살펴보고 6을 먼저 찜하는 것이다. 이 경우, 첫 자리 수를 6을 선택하면 최선의 선택이 되기때문이다. (6이 또 있으면 역시 다음자리 수로 6을 선택하는 것이 최선이다.) 또 이런 생각도 해볼 수 있다. k=6이고 6은 입력 된 숫자에 없고, 5와 7이 입력값에 있을 경우..
문제: LUNCHBOX / 그리디(탐욕적인 방법) [해결책 / 후기] 힌트 - 먹는 시간이 오래 걸리는 사람을 먼저 처리한다. 입력이 A, B, C, D 네명에 대하여 다음과 같을 때 M: 4 2 6 1 E: 5 2 2 1 아래와 같이 시간 흐름을 그려보니 문제가 좀 명확해졌다. (총 14분의 시간이 걸림) 빨간 숫자는 식사가 끝나는 시간을 나타낸다. 1) 먹는 시간이 오래걸리는 사람 기준으로 내림차순으로 정렬하고 2) 전자렌지가 사용가능한 시점을 기준으로 시간을 측정하였다. 코드: https://github.com/xgate/algospot/blob/master/GREEDY/LUNCHBOX.cpp[출처] [AOJ 문제] Microwaving Lunch Boxes|작성자 DevMoon
문제: REPEATLESS / 경우의 수 [해결책 / 후기] 제한 시간이 10000ms(10초)라고 해서 만만하게 볼 문제가 아니었다. 처음에는 모든 수에 대해서 중복되는 수로 구성되어 있는지를 조사하였지만 여지없이 TLE .. OTL 그러다 해결책이 떠올랐다. 이 문제는, 10개의 숫자 중 n개의 수를 중복 없이 뽑는 문제와 비슷해보인다. (순열..!!) nPr = n! / (n-k)! (n개의 수에서 k개를 중복없이 뽑는 경우의 수) 그래서 해결책을 두 부분으로 나눌 수 있었다. 1) 순열을 이용해서 몇 자리 수인지 결정. n번째 수가 2자리 수인가? 3자리수인가?를 결정 하는 것이다.만약 정답이 3자리 수(100 < n < 1000)라면, 이 수는 적어도 10개의 수 중 2개를 뽑는 방법의 가지수보..
문제: ORDERING / 그래프 [해결책 / 후기] 유명한 문제인 것 같다. 위상정렬이라는 것도 처음 알게 되었다. 내용은 일의 순서를 정하는 것. 문제 해결을 위해서 반드시 위상정렬을 이용해야 하는건 아닌 듯하다. 다음과 깉이 생각해볼 수 있겠다. 1. 작업을 그래프로 추상화 * 각 작업은 그래프에서 하나의 정점(vertice)이 된다. * 작업 A를 마치고 B를 한다는 것은 A에서 B로 가는 간선(edge)을 긋는 것이다.* 이때 B의 입력차수는 1증가 한다. 입력 차수가 있다는 것은 이전에 처리해야할 작업이 있음을 의미한다. 2. 작업 순서 (1) 정점 사이에 간선을 긋는다.(2) 입력 차수가 0인 작업들을 "우선순위 큐"에 넣는다. 그냥 큐를 사용하면 오답이 되는데, 문제에 "사전순"이라는 조건..
문제: MAXSUM / 구현 역시나 모든 경우를 다 해보면 TLE가 난다. 입력 크기 때문에 O(n^2)도 안될 듯하다. 입력으로 들어올 때 loop 한번에 해결해야 한다. 삽질 몇 번 해보고 나서 어떤 사실을 알게 되었다. 1) 음수가 부분합에 포함되어도 합한 값이 양수면 어쨌든 나중에 도움이 될 수도 있다. 그러나 음수면 도움이 안된다.2) 양수들만 모여있는 부분합이 최대 값이 될 수도 있다. 위의 두 가지를 고려해서 변수를 두 개 잡아서 해결했다. 현재 자신보다 커지는 경우만 선택하는 greedy 한놈, 합한 값이 양수면 안가리고 선택하는 any 한놈.[출처] [AOJ 문제] 최대 연속 부분합 찾기|작성자 DevMoon 코드: https://github.com/xgate/algospot/blob/m..
문제: BRUTEFORCE / 분할정복 [해결책 / 후기] 무척 고생한 문제다. 어떤 사람들은 바로 해결전략이 떠오르겠지만 머리가 별로 안좋은 난..쿨럭~ 1. 정답 파악 풀이 방법과 상관없이 정답이 무엇인지 따져본다. N=10일 때 한자리 암호를 만드는 방법은 10가지이다. 2자리 암호를 만드는 방법은, 첫 자리에 10가지가 있고 둘 째 자리에도 10자리가 올 수 있으므로 총 100가지가 된다. 그렇다면 이것은 중복순열? 정답인 즉, N+N^(A+1)+N^(A+2) .... N^B 가 된다. 2. 풀이법에 대한 고찰 이제 정답은 알았다. 그런데 풀이법이 만만찮다. (1) 일단 본능적으로 pow 함수를 쓰면 된다는 생각이 든다. pow(N, A)+pow(N, A+1)+pow(N, A+2) ... 더 효율..
문제: DECODE / 구현 후기 - 이것도 고전.. 알고리즘은 빨리 나왔는데 의외의 착오를... Encoding 문제와 짝을 이룬다. 해결전략 - 2차원 배열을 만들어서 spiral 형태로 순회. (하나는 진행방향 파악을 위한 배열, 다른 하나는 데이터 저장을 위한 배열) 1) 입력받은 binary string을 2차원 배열에 행으로 끊어서 저장한다. 2) spiral 형태로 순회 하면서 5개씩 끊어 문자로 decoding한다. 3) decoding 결과를 문자열로 저장한다. ※ 문제에서 아래 부분을 꼭 고려해야 한다. You should throw away any trailing spaces and/or partial characters found while decoding.[출처] [AOJ 문제] ..
문제: ENCODING / 구현 후기 - 의외의 실수로 엄청나게 고전한 문제.. 입력에 문제가 있을수도 있다.- 문자열을 입력 받을 때 입력이 제대로 되는지 확인할 것. 문자열 크기를 충분히 크게 잡을 것. 해결전략 - 2차원 배열을 만들어서 spiral 형태로 순회 1) 입력받은 문자열을 2진수로 encoding한다. 2) encoding된 문자열을 2차원 배열에 spiral 형태로 저장한다.3) 2차원 배열에 저장된 내용을 한 행씩 output 문자열에 복사한다.[출처] [AOJ 문제] Encoding|작성자 DevMoon 코드: https://github.com/xgate/algospot/blob/master/IMPL/ENCODING.cpp