일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |
Tags
- 해커컵
- 알고스팟
- 개발자로살아남기
- datalake
- hackercup2017
- 동시성
- kafka
- 박종천
- 실전사례
- 2016년회고
- 테스트주도개발
- Raw-Request-URI
- 데이터유통
- functional thinking
- coursera
- 클린코드
- 데이터플랫폼
- clean code
- 코딩인터뷰
- spray
- 2017회고
- 개발7년차매니저1일차
- 단위테스트
- wait region split
- 켄트백
- 개발자
- 데이터레이크
- 데이터야놀자
- 함수형 사고
- 회고
Archives
- Today
- Total
Software Engineering Note
Repeatless Numbers 본문
문제: REPEATLESS / 경우의 수
[해결책 / 후기]
제한 시간이 10000ms(10초)라고 해서 만만하게 볼 문제가 아니었다.
처음에는 모든 수에 대해서 중복되는 수로 구성되어 있는지를 조사하였지만 여지없이 TLE .. OTL
그러다 해결책이 떠올랐다.
이 문제는, 10개의 숫자 중 n개의 수를 중복 없이 뽑는 문제와 비슷해보인다. (순열..!!)
nPr = n! / (n-k)! (n개의 수에서 k개를 중복없이 뽑는 경우의 수)
그래서 해결책을 두 부분으로 나눌 수 있었다.
1) 순열을 이용해서 몇 자리 수인지 결정. n번째 수가 2자리 수인가? 3자리수인가?를 결정 하는 것이다.
만약 정답이 3자리 수(100 < n < 1000)라면, 이 수는 적어도 10개의 수 중 2개를 뽑는 방법의 가지수보다는 클것이다.
여기서는 처음자리에 0이 올 수 없으므로, 첫째 자리 수를 뽑을 때는 그 경우가 9가 된다.
2) 자리수가 결정되면 정답에 해당하는 수를 결정한다.
처음에는 자리수에 해당하는 모든 수에 대해 유효성을 검사하는 방법을 생각해보았으나,
그것보다는 직접 repeatless number를 추출해내는 것이 빠르겠다는 판단이 섰다. 이 부분은 재귀로 구현했다.
[출처] [AOJ 문제] Repeatless Numbers|작성자 DevMoon
코드: https://github.com/xgate/algospot/blob/master/NUM_OF_CASE/REPEATLESS.cpp
'알고리즘 > 알고스팟' 카테고리의 다른 글
Lucky Lucky Number (0) | 2014.08.16 |
---|---|
Microwaving Lunch Boxes (0) | 2014.08.16 |
할 일 순서 정하기 (0) | 2014.08.16 |
최대 연속 부분합 찾기 (0) | 2014.08.16 |
Brute-Force Attack (0) | 2014.08.16 |