알고리즘

1일 1알고리즘

 

넥스터즈 8주차

벌써 마지막주차고, 최종 발표를 진행했다.

앱 출시가 되지않은건 아쉬웠지만 팀원들 모두가 열심히했고, 즐겼으면 됐다고 생각한다.

다들 너무 고생많았습니다!!

후기는 추후 업로드 예정

 

후기

넥스터즈 활동을 해서인지 1, 2월이 너무 녹아버렸다.

정규세션 끝나고 남은 주말을 개발에 올인했었는데 지금 쉬고있으니까 뭔가 어색한 느낌이다.

이번기수 활동이 끝났으니 이제 다른 생산적인 일을 해야겠다는 생각이 든다.

이전에 못했던 cs나 다른 개발지식들을 익혀보려고 한다.

'잡담' 카테고리의 다른 글

Nexters 22기 회고  (2) 2023.03.14
3월 2주차 결산  (0) 2023.03.12
2월 4주차 결산  (0) 2023.02.26
2월 3주차 결산  (0) 2023.02.19
2월 2주차 결산  (0) 2023.02.13

알고리즘

1일 1알고리즘

 

넥스터즈 7주차

이번주는 작업에 집중해야할 시간이다.

원래는 넥나잇으로 밤샘작업의 날이지만 어떠한 이유로 넥나잇 -> 넥버닝으로 변경되어 오전 ~ 저녁 시간에 진행되었다.

이번주에 서버 남은 api작업 및 스케줄링, firebase dynamic link를 위한 간단한 리액트 페이지까지 배포가 완료되었다.

금방 끝날줄 알았는데 생각보다 많은 시간을 소비해서 다른 학습은 하지 못했다.

시간이 너무 빨리 지나갔고, 의미있는 시간이었다.

 

후기

벌써 최종발표까지 한 주 남았다.

걱정되는건 앱 출시가 될지..? 앱 개발자분들이 늦은 시간까지 고생하고 계신다.

빠르게 QA가 진행되면 좋겠지만 생각보다 시간이 오래 걸리는것 같다. 무엇보다 서버에 에러가 없다면 너무 좋겠다.

아무튼 마무리까지 화이팅~

 

'잡담' 카테고리의 다른 글

3월 2주차 결산  (0) 2023.03.12
3월 1주차 결산  (3) 2023.03.05
2월 3주차 결산  (0) 2023.02.19
2월 2주차 결산  (0) 2023.02.13
2월 1주차 결산  (2) 2023.02.05

https://www.acmicpc.net/problem/25682

 

25682번: 체스판 다시 칠하기 2

첫째 줄에 정수 N, M, K가 주어진다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.

www.acmicpc.net

2차원 배열 내 누적합 문제입니다.

2차원 누적합은 (sx, sy) ~ (ex, ey)의 누적합을 말하며, dp[i][j] = cur + dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] 공식을 활용해야 합니다.

 

체스판은 검은색, 흰색이 번갈아 칠해져있어야 하고, (1, 1) 지점의 색은 정해지지 않았습니다.

따라서 (1, 1) 지점에 검은색이 올 경우와 흰색이 올 경우를 모두 구해서 최솟값을 구해야 합니다.

이를 위해 dp를 두개 사용합니다.

 

좌표의 x, y값을 더한 값이 홀수인 좌표들끼리와 짝수인 좌표들끼리의 색은 같습니다.

이를 활용하여 해당 좌표에 색이 바껴야하는지에 대해서 각각 누적합을 구할 수 있습니다.

dp를 채웠다면 K * K 크기의 정사각형의 누적합들을 순회하며 최솟값을 구하도록 합니다.

 

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <iostream>
#include <algorithm>
#define MAX 2001
using namespace std;
 
char list[MAX][MAX];
int bdp[MAX][MAX], wdp[MAX][MAX];
int N, M, K;
 
void getPrefixSum() {
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= M; j++) {
            bdp[i][j] = bdp[i - 1][j] + bdp[i][j - 1- bdp[i - 1][j - 1];
            wdp[i][j] = wdp[i - 1][j] + wdp[i][j - 1- wdp[i - 1][j - 1];
 
            if (list[i][j] == 'W') {
                if ((i + j) % 2) {
                    wdp[i][j]++;
                }
                else {
                    bdp[i][j]++;
                }
            }
            else {
                if ((i + j) % 2) {
                    bdp[i][j]++;
                }
                else {
                    wdp[i][j]++;
                }
            }
        }
    }
}
 
void func() {
    getPrefixSum();
    int ret = 2147483647;
    for (int i = K; i <= N; i++) {
        for (int j = K; j <= M; j++) {
            ret = min(ret, bdp[i][j] - bdp[i - K][j] - bdp[i][j - K] + bdp[i - K][j - K]);
            ret = min(ret, wdp[i][j] - wdp[i - K][j] - wdp[i][j - K] + wdp[i - K][j - K]);
        }
    }
 
    cout << ret << '\n';
}
 
void input() {
    cin >> N >> M >> K;
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= M; j++) {
            cin >> list[i][j];
        }
    }
}
 
int main() {
    cin.tie(NULL); cout.tie(NULL);
    ios::sync_with_stdio(false);
 
    input();
    func();
 
    return 0;
}
cs

'algorithm > dp' 카테고리의 다른 글

boj 12841 정보대 등산  (0) 2023.07.31
boj 25427 DKSH를 찾아라  (0) 2023.05.21
boj 12996 Acka  (0) 2023.01.29
boj 14450 Hoof, Paper, Scissors (Gold)  (0) 2022.12.30
boj 14453 Hoof, Paper, Scissors (Silver)  (0) 2022.12.30

알고리즘

1일 1알고리즘

 

넥스터즈 6주차

벌써 6주차. 이번주는 온라인으로 진행되었다.

22기 활동중이신 개발자분들이 강연을 해주셨고, 처음보는 것들이 있어 신기했지만 공감되는 주제도 있어 나름 집중해서 들었다.

개발은 이번주에 QA 진행중이고, github actions를 이용한 자동배포를 마무리했다.

 

후기

회사에서 진행중인 프로젝트도 어느정도 진행되고는 있지만 마무리가 언제일진 모르겠다.

기획, 개발이 동시에 진행되다보니 뭔가 바뀌는것도 있고 그런 상태다.

동아리에서는 배포쪽 공부를 해보고있는데 역시 어렵다 ㅎㅎ..

같은 백엔드 파트를 맡은 팀원분이 정말 많은것들을 알려주고 계셔서 너무 감사하다.

이번기수 마무리까지도 더 열심히 해야겠다.

'잡담' 카테고리의 다른 글

3월 1주차 결산  (3) 2023.03.05
2월 4주차 결산  (0) 2023.02.26
2월 2주차 결산  (0) 2023.02.13
2월 1주차 결산  (2) 2023.02.05
1월 4주차 결산  (2) 2023.01.30

알고리즘

1일 1알고리즘

 

넥스터즈 5주차

이번주 세션으로 중간발표를 했다.

각 팀의 진행 상황과 이전 주차때 진행했던 UT 피드백을 정리했고, 발표 준비를 위한 회의도 진행했다.

근데 당일에 우리팀 PM님의 개인 사정으로 내가 발표를 하게되었다?? 뭐지

순간 망함을 감지하여 급히 발표자료를 열어보았고, 다른 팀들 발표 시간에 집중을 못하고 멘트 구상을 했다.

긴장을 엄청하긴 했지만 무사히 마무리했다. 어케했는지 기억도 안나는데 팀원들이 잘했다고 하니 다행이다 ㅠ

 

후기

사실 이번주에는 프론트에 치이고 치여서 멘탈이 좀 나갔었다. 지금 프론트를 하는게 맞는건지, 도움은 되고 있는건지 생각이 좀 많았었다.

회사에 프론트 개발자가 없지만 프론트가 95인 프로젝트를 한다라.. 내가 선택하긴 했지만 프론트는 적응이 더 필요한것 같다.

넥스터즈는 벌써 3주밖에 남지 않았다. api 남은 작업들 마무리하면 배포에 시간을 많이 투자할 수 있을 것 같다.

남은 기간도 화이팅~

'잡담' 카테고리의 다른 글

2월 4주차 결산  (0) 2023.02.26
2월 3주차 결산  (0) 2023.02.19
2월 1주차 결산  (2) 2023.02.05
1월 4주차 결산  (2) 2023.01.30
1월 3주차 결산  (0) 2023.01.22

알고리즘

1일 1알고리즘

 

넥스터즈 4주차

이번주 주제는 UT였고, figma, maze를 이용하여 테스트를 진행했다.

사용성 테스트라는걸 처음 해본것 같은데 다른팀 서비스를 간접 체험하고 피드백을 주고받는 나름 의미있는 시간이었다.

이번주는 특히 maze, 설문까지 우리팀 디자이너분들이 너무 고생을 해주셨다.

그런만큼 나도 개발 더 열심히 해야할 것 같고, 받은 피드백들 바탕으로 개선할 점을 찾아야겠다.

 

후기

다음주는 중간 발표 시간이다.

API 개발은 잘 진행되고 있는것 같고, 이후 리팩토링 과정을 거치려고 한다.

이번 프로젝트는 배포를 배우고싶다는 생각이 크기때문에 여기에 많은 시간을 쓰지않을까 생각이 들고, 마무리 잘해야되겠다는 생각이 든다.

회사에서는 프론트엔드, 동아리에서는 백엔드.. 뭐 둘다해서 나쁠건 없지 ㅎㅎ

근데 프론트 너무 어렵다..

'잡담' 카테고리의 다른 글

2월 3주차 결산  (0) 2023.02.19
2월 2주차 결산  (0) 2023.02.13
1월 4주차 결산  (2) 2023.01.30
1월 3주차 결산  (0) 2023.01.22
1월 2주차 결산  (0) 2023.01.16

CloudFront를 통해 퍼블릭 상태의 객체에 대한 접근을 차단하고, https까지 적용시키려고 합니다.

 

https://whyeskang.com/411

 

AWS S3로 React 배포하기

S3와 CloudFront를 이용한 배포 방법이 있고, S3 만으로 배포하는 방법이 있습니다. 권장하는 방법은 S3, CloudFront를 모두 사용하는 방법이고, 이 글에서는 S3 만으로 배포하는 것을 다룹니다. 사전에

whyeskang.com

우선 이전 글에 이어서 포스팅하니, 앞 내용은 여기서 확인해주시면 됩니다.

 

현재 S3만으로 배포가 완료된 이 버킷은 퍼블릭 상태이고, 퍼블릭 차단이 해제되어 있습니다.

먼저 이것부터 돌려놓습니다.

퍼블릭 액세스 차단을 다시 활성화하고, 현재 등록된 버킷정책을 삭제하여 액세스를 "버킷 및 객체가 퍼블릭이 아님" 상태로 돌려놓습니다.

완료된 화면입니다.

 

그리고 정적 웹 사이트 호스팅로 "비활성됨" 으로 변경합니다.

 

https://us-east-1.console.aws.amazon.com/cloudfront/v3/home

 

https://us-east-1.console.aws.amazon.com/cloudfront/v3/home

 

us-east-1.console.aws.amazon.com

그러면 이제 위 링크를 이용하여 CloudFront 페이지로 넘어갑니다.

 

우측의 "배포 생성" 버튼을 누릅니다.

 

우선 원본 도메인으로 해당 버킷에 해당하는 도메인을 선택합니다.

그리고 S3 버킷 액세스를 "원본 액세스 제어 설정"으로 변경합니다.

 

그 다음 제어 설정 생성을 눌러서 해당 S3의 제어 설정을 생성합니다.

건드릴 것 없이 바로 생성 버턴을 누르시면 됩니다.

 

 

그리고 아래에 Origin Shield 활성화를 "예"로 변경합니다.

지역은 S3 버킷과 동일하게 맞춥니다.

 

기본 캐시 동작에서는 하나만 변경하면 됩니다.

뷰어 프로토콜 정책이 HTTP and HTTPS로 되어있을겁니다.

이거를 "Redirect HTTP to HTTPS"로 변경합니다.

 

그리고 맨 밑에 내려와서 기본값 루트 객체를 /index.html 으로 작성하고 배포를 생성합니다.

 

그러면 배포를 생성함과 동시에 S3 버킷 정책을 업데이트하라고 합니다.

정책을 복사해줍니다.

 

그리고 해당 S3로 넘어가서 버킷 -> 권한 -> 버킷 정책 -> 편집에서 해당 내용을 넣고 저장합니다.

위 사진처럼 되면 완료입니다.

 

다시 생성된 배포로 넘어가면 도메인이 표시되어 있습니다.

 

도메인 + /index.html 으로 들어가면 배포가 완료되었고, https까지 적용된 것을 확인하실 수 있습니다.

그리고 버킷의 엔드포인트까지 노출되지 않아서 S3만으로 배포한 방법보다는 안정적이라고 볼 수 있습니다.

 

하지만 도메인/index.html 을 통해서만 이 페이지가 뜨며, /index.html를 제거한다면 AccessDenied가 뜹니다.

여기서 오류페이지에 대한 응답을 직접 생성하는 방법으로 해결합니다.

 

해당 배포 -> 오류 페이지 응답 생성에서 사용자 정의 오류 응답 생성 버튼을 누릅니다.

 

여기서 오류코드를 응답 페이지로 이동하도록 지정할 수 있습니다.

/index.html로 경로를 설정하고, 응답 코드를 200으로 변경합니다.

 

같은 방법으로 403, 404에 대한 응답 페이지를 생성하였습니다.

 

이제 /index.html 없이 도메인 입력만으로 이동이 가능한 것을 확인할 수 있습니다.

'Etc' 카테고리의 다른 글

AWS S3로 React 배포하기  (0) 2023.02.02
GitHub Actions를 이용한 Slack Notification  (0) 2023.01.30
GitLab -> GitHub Mirroring  (0) 2022.06.12
Unity Script로 카메라 Culling Mask 기능 사용하기  (2) 2021.10.29
Unity 카메라 Culling Mask  (0) 2021.10.29

S3와 CloudFront를 이용한 배포 방법이 있고, S3 만으로 배포하는 방법이 있습니다.

권장하는 방법은 S3, CloudFront를 모두 사용하는 방법이고, 이 글에서는 S3 만으로 배포하는 것을 다룹니다.

 

사전에 준비하셔야할 것은 배포 하려고하는 React 프로젝트입니다.

npx create-react-app deploy-app

저는 기본 프로젝트를 배포하기 위해 위 명령어로 새 프로젝트를 만들었습니다.

 

우선 프로젝트를 S3에 업로드한 후에 배포를 진행하게 됩니다.

먼저 리액트 프로젝트를 아래 명령어로 빌드해주시면 됩니다.

npm run build

그럼 프로젝트 바로밑에 build 폴더가 생성되는 것을 확인할 수 있습니다.

build 폴더 아래의 모든 파일을 S3에 업로드합니다.

 

https://s3.console.aws.amazon.com/s3/buckets

 

https://s3.console.aws.amazon.com/s3/buckets

 

s3.console.aws.amazon.com

위 링크를 이용하여 S3 버킷 페이지로 이동합니다.

그리고 우측에 "버킷 만들기" 버튼으로 버킷을 생성합니다.

 

버킷 이름은 원하는대로 작성합니다.

 

객체 소유권은 비활성화됨을 유지합니다.

 

원래는 모든 퍼블릭 액세스를 차단하는 것이 맞습니다.

하지만 S3만으로 배포할 때는 차단을 해제합니다.

이는 추후에 업로드할 CloudFront로 보완할 수 있습니다.

 

나머지 설정은 기본으로 놔두고 버킷을 생성하시면 됩니다.

이렇게 생성된 버킷의 액세스는 "객체를 퍼블릭으로 설정할 수 있음" 상태입니다.

이것을 "퍼플릭" 상태로 변경해야 합니다.

이를 위해 버킷 -> 권한 -> 버킷 정책에서 "편집" 버튼을 눌러 버킷 정책을 넣어주시면 됩니다.

 

1시 방향의 "정책 생성기" 버튼으로 편하게 정책을 생성할 수 있습니다.

그 전에 왼쪽의 버킷 ARN을 복사하고 넘어가도록 합시다.

 

먼저 Policy Type은 "S3 Bucket Policy"를 선택합니다.

Principal은 *

Actions는 GetObject

ARN은 방금 복사했던 ARN + /*을 넣습니다. (/*을 반드시 포함해야 합니다.)

그러면 Add Statement 버튼이 활성화되며, 클릭합니다.

 

Generate Policy 버튼까지 누르면 JSON 형식으로 버킷 정책이 생성됩니다.

위 내용을 복사합니다.

 

그리고 다시 버킷 정책으로 돌아와서 복사한 내용을 붙여 넣으면 됩니다.

그리고 "변경 사항 저장" 버튼을 눌러 저장합니다.

 

그러면 객체의 액세스가 퍼블릭으로 변경된 것을 확인할 수 있습니다.

 

다시 해당 버킷으로 들어갑니다.

여기에 아까 build했던 파일을 다 업로드합니다.

업로드가 완료되면 이런 상태가 됩니다.

 

그리고 속성에서 맨 밑으로 내려가면 "정적 웹 사이트 호스팅"이 있습니다. 편집을 누릅니다.

우선 활성화부터 해주시고, 기본 페이지로 index.html 을 넣어줍니다.

그리고 변경사항을 저장합니다.

 

그러면 이렇게 URL을 발급 받을 수 있습니다.

 

그리고 해당 URL을 클릭하면 배포가 완료된 것을 확인할 수 있습니다.

 

다만 이 방법은 객체가 퍼블릭 상태고, https가 적용되지 않아 보안상의 이슈가 있습니다.

이를 해결하기 위해서는 CloudFront에 S3를 연결해주는 작업이 필요합니다.

CloudFront 관련 글은 아래 링크에서 확인해주시면 되겠습니다.

https://whyeskang.com/412

 

 

GitHub Actions를 이용하기 전에 Github & Slack부터 진행하며, Slack 워크스페이스가 만들어져 있다는 가정하에 시작합니다.

 

우선 알림을 받으려고 하는 채널을 생성합니다.

 

그리고 아래에 있는 "앱 추가" 버튼을 누릅니다.

 

"GitHub"를 추가합니다.

 

그 다음은 채널 우클릭 -> 채널 세부정보 보기 -> 통합 -> 앱 에서 앱 추가를 합니다.

GitHub를 추가하시면 됩니다.

그러면 해당 채널에서 위 메시지를 확인할 수 있습니다.

 

/github signin 명령어를 치면 GitHub에 연결할 수 있도록 메시지가 전송됩니다.

버튼을 눌러서 연결할 수 있고, Verification Code를 받으면 위 사진에 있는 Enter code에 입력하면 연동되는 것을 확인할 수 있습니다.

 

이제 계정과 연결을 했으니 GitHub Repository에 연결하도록 합니다.

명령어는 /github subscribe owner/repository 입니다.

여기 드래그된 부분을 owner/repository 자리에 넣어주시면 되겠습니다.

 

이 메시지를 받으셨다면 연결은 완료되었습니다.

 

이제 GitActions와 연동을 하겠습니다.

https://api.slack.com/apps

 

Slack API: Applications | Slack

Your Apps Don't see an app you're looking for? Sign in to another workspace.

api.slack.com

먼저 위 링크를 타고 가서 Create New App 버튼으로 앱을 생성합니다.

 

그리고 Settings -> Basic Information -> Add features and functionality에서 Incoming Webhooks를 누르고 활성화합니다.

 

그 다음 아래에서 Add New Webhook to Workspace 버튼으로 워크스페이스와 채널에 연결합니다.

그러면 이렇게 Webhook URL을 받을 수 있습니다. 이거를 GitHub의 secrets에 넣어줍니다.

 

GitHub -> Settings -> Security -> Secrets and variables -> Actions에 들어가셔서 New repository secret 버튼으로 발급 받은 Webhook URL을 넣어줍니다.

이렇게 등록되어야 합니다.

 

이제 yml 파일을 .github/workflows 경로 내에 작성해야 합니다.

Actions 페이지로 와서 "set up a workflow yourself"를 클릭합니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
name: Slack Notification
 
on:
  pull_request:
    branches: [ "master""develop" ]
 
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - name: action-slack
      uses: 8398a7/action-slack@v3
      with:
        status: ${{ job.status }}
        author_name: www-be
        fields: repo,message,commit,author,action,eventName,ref,workflow,job,took
        if_mention: failure,cancelled
      env:
        SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} # required
      if: always() # Pick up events even if the job fails or is canceled.
 
cs

먼저 name으로 workflow의 이름을 작성합니다.

 

on은 workflow가 실행될 조건을 명시합니다.

보통 push나 pull request를 등록하며, 저는 pull request만 작성했습니다.

 

jobs에는 실행되는 명령어들을 작성합니다.

여기서 secrets에 등록한 SLACK_WEBHOOK_URL을 사용합니다.

그 외 파라미터나 필드 등 설명은 https://action-slack.netlify.app/ 여기서 확인해주시거나 아래 레퍼런스에서 확인해주시면 되겠습니다.

 

등록이 완료되었다면 이렇게 알림을 받아보실 수 있습니다.

 

Reference

GitHub & Slack 연동

Git Actions 활용

'Etc' 카테고리의 다른 글

AWS S3 & CloudFront로 React 배포하기  (0) 2023.02.02
AWS S3로 React 배포하기  (0) 2023.02.02
GitLab -> GitHub Mirroring  (0) 2022.06.12
Unity Script로 카메라 Culling Mask 기능 사용하기  (2) 2021.10.29
Unity 카메라 Culling Mask  (0) 2021.10.29

알고리즘

1일 1알고리즘

 

넥스터즈 3주차

저번주 설 연휴가 있어서 오랜만에 정규활동을 진행했다.

이번주 활동으로는 팀 회의와 레크레이션이 진행되었다.

레크레이션은 퀴즈 위주로 진행되었고, 팀원 한분이 하드캐리를 하는 바람에.. 너무 재미있었다 ㅎㅎ

 

후기

개발을 계속 하고있지만 중간에 애매한 부분이 많아 물어보고, 회의 일정 잡고 하는 시간이 늘어난 것 같다.

화면 설계를 보면서 api 정리를 다시 해야할 것 같다.

벌써 1월이 끝나려고 하는데, 정말 열심히 하자는 생각을 갖고 올해가 시작되었고, 현재는 잘 지켜진것 같아 만족스럽다.

근데 점점 워커홀릭이 되어가는 느낌이다. 개발이 점점 재밌어지는데 긍정적인게 맞겠지?

'잡담' 카테고리의 다른 글

2월 2주차 결산  (0) 2023.02.13
2월 1주차 결산  (2) 2023.02.05
1월 3주차 결산  (0) 2023.01.22
1월 2주차 결산  (0) 2023.01.16
1월 1주차 결산  (0) 2023.01.09

https://www.acmicpc.net/problem/12996

 

12996번: Acka

첫째 줄에 앨범에 포함된 곡의 개수 S와 dotorya, kesakiyo, hongjun7이 불러야 하는 곡의 수가 주어진다. (1 ≤ S ≤ 50, 1 ≤ dotorya, kesakiyo, hongjun7 ≤ S)

www.acmicpc.net

N곡을 세 사람이 나눠서 불러 앨범을 완성해야 합니다.

정확히 N곡을 불러야하며, 세 사람의 기회가 모두 소진되어야 합니다.

 

그러면 경우의 수를 얻는 조건은 N이 0이되면서 세 사람의 기회가 모두 0이 되는 경우에만 1을 추가합니다.

dp[N][x][y][z]: N곡이 남았고, 세 사람의 기회가 x, y, z만큼 있을 때 앨범을 완성할 수 있는 경우의 수

 

한 곡에 대해 부를 수 있는 경우는 아래와 같습니다.

  1. 세 사람 중 적어도 한 명 이상이 불러야 한다.
  2. 세 사람 모두가 한 곡을 불러도 된다.
  3. 세 사람 중 두 사람이 한 곡을 불러도 된다.
  4. 세 사람 중 한 사람이 한 곡을 불러도 된다.

이 문제는 간단하게 위의 경우를 하나씩 모두 구해주시면 되겠습니다.

경우의 수를 더하면서 % MOD 연산을 해주도록 합시다.

 

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <iostream>
#include <cstring>
#define MAX 51
#define MOD 1000000007
using namespace std;
 
int dp[MAX][MAX][MAX][MAX];
int N, x, y, z;
 
int solve(int n, int a, int b, int c) {
    if (!n) {
        return !&& !&& !c;
    }
    
    int& ret = dp[n][a][b][c];
    if (ret != -1return ret;
    ret = 0;
 
    if (a && b && c) {
        ret = (ret + solve(n - 1, a - 1, b - 1, c - 1)) % MOD;
    }
 
    if (a && b) {
        ret = (ret + solve(n - 1, a - 1, b - 1, c)) % MOD;
    }
    if (a && c) {
        ret = (ret + solve(n - 1, a - 1, b, c - 1)) % MOD;
    }
    if (b && c) {
        ret = (ret + solve(n - 1, a, b - 1, c - 1)) % MOD;
    }
 
    if (a) {
        ret = (ret + solve(n - 1, a - 1, b, c)) % MOD;
    }
    if (b) {
        ret = (ret + solve(n - 1, a, b - 1, c)) % MOD;
    }
    if (c) {
        ret = (ret + solve(n - 1, a, b, c - 1)) % MOD;
    }
 
    return ret;
}
 
void func() {
    memset(dp, -1sizeof(dp));
    cout << solve(N, x, y, z) << '\n';
}
 
void input() {
    cin >> N >> x >> y >> z;
}
 
int main() {
    cin.tie(NULL); cout.tie(NULL);
    ios::sync_with_stdio(false);
 
    input();
    func();
 
    return 0;
}
cs

'algorithm > dp' 카테고리의 다른 글

boj 25427 DKSH를 찾아라  (0) 2023.05.21
boj 25682 체스판 다시 칠하기 2  (0) 2023.02.26
boj 14450 Hoof, Paper, Scissors (Gold)  (0) 2022.12.30
boj 14453 Hoof, Paper, Scissors (Silver)  (0) 2022.12.30
boj 2281 데스노트  (0) 2022.10.08

알고리즘

1일 1알고리즘

 

프로젝트 회의

이번주는 설 연휴라 정규활동이 없고, 팀원들과 온라인으로 회의를 진행했다.

조금 애매했던 부분들을 정리했고, 개발 시작할 예정이다.

일단 프로젝트 세팅은 마무리했고, 수정할 부분은 계속 수정할 예정이다.

 

후기

이제 개발을 시작했고, 새로운 기술들을 공부하면서 개발할 차례다.

회사일도 이제 개발 시작단계에 접어들어서 휴일을 많이 활용해야 할 것 같다.

명절이라 부산에 내려와서 충분히 휴식한 것 같다.

내일 올라와서부터는 다시 열심히 해야겠다.

'잡담' 카테고리의 다른 글

2월 1주차 결산  (2) 2023.02.05
1월 4주차 결산  (2) 2023.01.30
1월 2주차 결산  (0) 2023.01.16
1월 1주차 결산  (0) 2023.01.09
12월 5주차 결산  (0) 2023.01.02

+ Recent posts