일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- 클린코드
- 데이터레이크
- 동시성
- 개발7년차매니저1일차
- 해커컵
- spray
- 2017회고
- 개발자
- 테스트주도개발
- Raw-Request-URI
- 2016년회고
- 박종천
- 알고스팟
- datalake
- clean code
- 데이터유통
- hackercup2017
- kafka
- 함수형 사고
- functional thinking
- coursera
- 개발자로살아남기
- 단위테스트
- 데이터플랫폼
- 켄트백
- 코딩인터뷰
- 데이터야놀자
- 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 |