사실 이 문제를 봤을 때 구글 번역기로 돌려도 이해하기가 힘든 문제였다. 한글로 봐도 애초에 뭘 원하는지 명확하게 이해하기가 힘들어서 많이 헤매게 되었다.
이 경우에는 C = 4인 것을 가정한다.
전체 과정
1. n을 기준으로 만들 수 있는 벽의 경우의 수 M을 구함
2. M보다 작은 소수의 개수 P를 구함
3. P를 출력함
n = 3일 때 4로 나누면 몫 : 0, 나머지 3
-> 이 경우 1개
n = 10 일 때 몫 : 2, 나머지 2
m = 1 선언 어차피 눕혀진 것이 없는 경우는 항상 존재하기 때문이다.
몫과 나머지로 조합을 생성
[0, 0, 1, 1]
조합을 구해야 하므로 가능한 케이스는 2가지 이다.
case 1
from itertools import combinations
combinations(array, n)
case 2
def combi(n):
if n == 0:
return 1
elif n < 0:
return 0
return combi(n-1) + combi(n-4)
Hackerrank는 내장 함수만 사용가능한 경우가 있어서 case 2로 해야하고 또한, 1개를 뺄지 4개를 뺄지 여러 조합이 다르기에 case2가 더욱 직관적이고 좋다.
여기서는 우리가 흔히 알려져있는 "에라토스테네스의 체"를 활용해 해보도록 하겠다.
소수 찾는 알고리즘
def SieveOfEratosthenes(n):
prime = [True for i in range(n+1)]
p = 2
while(p * p <= n):
if (prime[p] == True):
for i in range(p * p, n + 1, p):
prime[i] = False
p += 1
c = 0
for p in range(2, n):
if prime[p]:
c += 1
return c
def combi(n):
if n == 0:
return 1
elif n < 0:
return 0
return combi(n-1) + combi(n-4)
def SieveOfEratosthenes(n):
prime = [True for i in range(n+1)]
if n <= 2: return 0
p = 2
while(p * p <= n):
if (prime[p] == True):
for i in range(p * p, n + 1, p):
prime[i] = False
p += 1
c = 0
for p in range(2, n):
if prime[p]:
c += 1
return c
def redJohn(n):
return SieveOfEratosthenes(combi(n) + 1)
문제 해석만 잘하면 절차에 맞춰서 잘 풀수 있는 문제이지만 영어 해석부터 막혀서 힘든 문제인 것 같다.