머릿말

조합은 고등학교 때 정석으로 배울때는 이런거 배워서 뭐하나 싶지만, 나중에 알고리즘 공부를 하거나, 머신러닝 공부를 하거나, 실생활(?)에 있어서도 익혀두면 쓸모가 많은 개념이라는 생각이 듭니다. 고등학교때는 대충 넘어갔다가 나중에 다시 공부하게 되는 대표적인 수학 분야인 것 같아요.

 

조합의 기본

n개중 순서에 상관없이 k개를 고르는 경우의 수를 조합이라고 하고, $_{n}C_{k}$로 표현

기본 계산식은 다음과 같다.

$$_{n}C_{k} = {n\choose k} = {{n!}\over{k!(n-k)!}}$$

 

집합 분할하기

예시문제) 10명의 학생을 2명, 2명, 2명, 4명으로 분할하는 경우의 수는?
 
풀이) 10명중 2명을 순서에 상관없이 고르고 ($_{10}C_{2}$), 나머지 8명중 2명을 순서에 상관없이 고르고, ($_{8}C_{2}$), 나머지 6명중 2명을 순서에 상관없이 고르고, ($_{6}C_{2}$), 나머지 4명중 4명을 순서에 상관없이 고르고($_{4}C_{4}$).
 
이렇게 하면  $_{10}C_{2} \times _{8}C_{2} \times _{6}C_{2} \times _{4}C_{4} = 18900$이 답인 것 같지만, 
2명씩 나눈 저 세 집단은 간에는 순서가 없다고 봐야한다. 
 
따라서 결과를 $3!$로 나눈 3150이 답이 된다.
 

외부 링크

조합 계산기: http://ko.numberempire.com/combinatorialcalculator.php

n, k만 입력하면 계산해준다.

 

나이브 구현

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
 
int factorial(int n)
{
    if (n == 0return 1;
    return n * factorial(n - 1);
}
 
int combination(int n, int c)
{
    if (n < c) return 0;
    return factorial(n) / factorial(c) / factorial(n - c);
}
 
int main(void)
{
    printf("%d\n", combination(102));
    return 0;
 
}
 
cs

 

DP구현

C(n,k) = C(n-1,k-1) + C(n-1,k)라는 성질 이용

1
2
3
4
5
6
7
8
9
10
11
12
typedef long long LL;
LL combination(int n, int k)
{
    const int MAX_N = 51;
    static LL dp[MAX_N][MAX_N] = { 0 };
 
    LL& res = dp[n][k];
    if (res) return res;
    if (n == k || k == 0)
        return res = 1;
    return res = combination(n - 1, k - 1+ combination(n - 1, k);
}
cs

 

위에건 C(n,k)하나만 구하는거고 전체를 구해두려면 다음소스 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
 
int main(void)
{
    const int n = 10;
    long long c[n + 1][n + 1= { 0 };
    c[0][0= 1;
    for(int i=1;i<=n;i++)
    {
        c[i][0= 1;
        for(int j=1;j<=n;j++)
        {
            c[i][j] = c[i - 1][j - 1+ c[i - 1][j];
        }
    }
    printf("%d\n", c[10][2]);
    return 0;
 
}
cs

 

 

N, K가 매우 클때 약분을 이용해서 구하는 방법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
typedef long long LL;
LL combination(LL n, LL kk) {
    LL C[2];
    C[0= 1;
    LL r = -1;
    for (LL k = 0; k <= kk + 1++k)
    {
        LL n0 = k % 2;
        LL n1 = (k + 1) % 2;
        C[n1] = (C[n0] * (n - k)) / (k + 1);
        if (k + 1 == kk) r = C[n1];
    }
    return r;
}
int main(void)
{
    printf("%d\n", combination(2512));
    return 0;
 
}
cs

 

 

 

반응형

'수학' 카테고리의 다른 글

likelihood(가능도 = 우도)  (0) 2018.10.02
MLE, 최대우도추정(Maximum Likelihood Estimation)  (0) 2018.09.27
베이즈 정리(Bayes' theorem)  (0) 2018.09.27
독립사건, 독립시행  (0) 2018.09.27
조건부 확률  (0) 2018.09.27

sudo권한부여: vi /etc/sudoers 에서 변경


sudo명령으로 root 권한얻기 : sudo -s


user변경: su - userid

반응형

'Programming > Linux' 카테고리의 다른 글

crontab  (0) 2019.09.27
리눅스 계정 관리  (0) 2019.09.19
CentOS 7 방화벽  (0) 2017.12.04
리눅스 port 확인  (0) 2017.12.04
디스크/폴더 사용량, 남은용량 확인  (0) 2017.11.07

du -sh * 하면 현재 폴더 기준으로 모든 파일과 서브폴더들 용량을 보기좋게 보여준다.


-h 옵션은 human-readable

-s 옵션은 sumarize (이거 안하면 서브폴더의 모든 파일들이 다 나열되어 결과가 너무 길어진다)

-s옵션만 붙이고 * 옵션을 붙이지 않으면 현재폴더 기준으로 결과가모두 sumarize되어 결과가 한 줄만 나온다.



df -hP 하면 디스크별로 전체적으로 얼마 사용했고 얼마남았고 하는 정보를 보여준다.


-h 옵션은 human-readable

-P 옵션은 한줄로 나오게 해주는 옵션(이거 안하면 디스크경로가 길어 두줄로 표시됐을때 읽기 어렵다)

반응형

'Programming > Linux' 카테고리의 다른 글

crontab  (0) 2019.09.27
리눅스 계정 관리  (0) 2019.09.19
CentOS 7 방화벽  (0) 2017.12.04
리눅스 port 확인  (0) 2017.12.04
sudo 관련  (0) 2017.11.07

'190710

 오전에 91.9Kg 어제는 저녁을 갑자기 먹게되면서 컨트롤이 안되는 부분이 있었다.

따라서 오늘은 정말 딱 한끼만 가볍게 먹는걸 목표로 하고 먹는 시간도 6시 이후가 되도록 해보자.

다이어트에서 나같은 경우는 주말에 가족들하고 식사할때 폭식하게 되는게 큰 문제인것 같다.

이걸 피하기 위해서 구체적인 타임스케줄과 식사계획을 미리 세우도록 해보자.

덴마크 다이어트를 해보자

http://www.thedailymeal.co.kr/shop/shopdetail.html?branduid=904890






'190702 오전에 93Kg. 하루에 한끼를 먹되, 최대한 참다가 늦은 오후에 먹는걸로 해보고 있음. 퇴근후 야식먹게되는게 위험요소. 야식은 먹더라도 한입만 먹자.

'190703 오전에 91.9Kg. 어제 한끼만 먹었더니 빠지긴 빠지네. 오늘은 휴일이라 위험하다. 군것질을 안하고 두끼만 딱 먹는거 해보자.

'190704 오전에 92.1Kg. 어제 쉬는 날이었는데 200g증가면 선방한거 같긴하다. 군것질 안하려고 노력한게 효과가 있는듯 하다. 한끼만 늦게 먹는 전략 계속해보자.

'190705 오전에 91.8Kg. 어제는 한끼먹고 잘 선방했는데 살은 많이 빠지진 않네 ㅎ 다음날 아침에 배고파서 맥모닝을 먹었다. 다음날 몸무게 어찌될지..



현재 다이어트 진행중입니다.


하루종일 아무것도 안먹으면 1Kg 정도 감량되고, 한끼만 먹으면 400g정도 감량됨


이 때 중요한게 야식이나 간식을 먹지 말아야 함


음료수, 간식을 먹을 경우 칼로리가 대폭 상승함

특히 앙금빵 같은 경우 한 개에 무려 450KCal임


고비는 주중보다 주말에 있음. 주말에 여행을 간다던지 하는 이벤트가 있을 경우 맛집투어등의 이유로 세끼를 다먹고 간식까지 먹는 경우가 많음

이때 간략한 세 끼 800 x 3 = 2400에다가 간식 500 ~ 1000 정도를 먹게 되면 보통 살이 찌게 됨.

(또는 식사가 1,000KCal 이상으로 푸짐한 경우도 많음)


내 경우는 하루 1800칼로리 정도를 먹으면 체중이 유지되는 편인 것 같음

반응형

'다이어트' 카테고리의 다른 글

일정기록 다이어트  (0) 2020.04.09

현재 시간 얻어오기

from datetime import datetime
now = datetime.now()
print(now)  # 2017-10-31 13:20:54.339081
type(now)  # <type 'datetime.datetime'>


시간의 년도/월/일 등 각 항목을 얻어올때는 timetuple() 사용

from datetime import datetime
now = datetime.now()
now_tuple = now.timetuple()
now_tuple.tm_year  # 2017


타임존 변환

뉴욕시간을 서울시간으로변경(서머타임, day-light saving 자동으로 고려됨)

from datetime import datetime
from pytz import timezone

 # 뉴욕시간으로 오전 9시 30분 입력 
ny_dt = timezone('America/New_York').localize(datetime(2017, 10, 23, 9, 30, 0)) 
ny_dt  # 2017-10-23 09:30:00-04:00 

# 서울시각으로 변경
kr_dt = ny_dt.astimezone(timezone('Asia/Seoul'))
kr_dt  # 2017-10-23 22:30:00+09:00 


스트링을 datetime으로 형변환 하기

format은 여기 참조

from datetime import datetime
s = '2020-08-01T03:55:15+09:00'
dt = datetime.strptime(s, '%Y-%m-%dT%H:%M:%S%z')
dt  # datetime.datetime(2020, 8, 1, 3, 55, 15, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400)))

시간연산하기

현재시간(now)과의 차이를 구하기(KST timezone 고려)

from datetime import datetime, timezone, timedelta
KST = timezone(timedelta(hours=9))
n = datetime.now(KST)
(n-c).seconds  # days, hours등도 가능



반응형

'Programming > Python' 카테고리의 다른 글

Anaconda & Jupyter  (0) 2018.03.23
python numpy  (0) 2018.02.28
python virtualenv 가상환경  (0) 2017.11.16
python에서 doxygen 사용해보기  (0) 2017.11.14
python import  (0) 2017.11.14

+ Recent posts