https://codefights.com/challenge/ZbGabd7jjYHRqePHy
std::vector< int > r, PrimeNumbers(int a, int b) {
for(int i; i=a<=b; i==a++?r.push_back(i),0:0)
for(; ++i<a&&a%i; );
return r;
}
정말 타고 나긴 타고 나나 보다.
약간 보기 좋게 바꾸면,
std::vector<int> PrimeNumbers(int a, int b) {
for(int i; i=a<=b;)
{
for(; ++i<a&&a%i; )
{
//skip non-prime numbers
}
if(i==a++) {
r.push_back(i);
}
}
return r;
}
r 선언은 내 gcc로는 에러나는데 codefight에서는 되는것 같다. 여튼간에,
받은 변수(a)를 잘 이용해서 새로운 변수를 선언하지 않는 것이나, 전위, 후위 연산자를 적절하게 이용하는 것, for문을 잘 이용하는 것등은 익숙한데, i==a++?r.push_back(i),0:0 이거 하나 더 배웠다. expression을 만들기 위해 0을 넣다니.
i는 종료조건에 다다르기 전까지 무조건 1에서부터 시작하고(그렇지 않다면 0으로 for가 종료된다) for문 처음에 ++i가 있어서 1을 제외하는 문제는 자연스럽게 해결된다. (1은 소수가 아니니까 제외해야 한다). 목표점(a)에 다다를때까지 어떤 숫자로도 나눠지지 않으면 소수이고, 마지막에 a++때문에 b에 도달할때까지 차례로 모든 수를 검사하게 된다.
댓글 없음:
댓글 쓰기