1. 알고리즘 문제 해결
문제 출제(백준 2854):
경우의 수를 따지는 DP 문제이다. 처음에는 DP 테이블을 구성할 때, 비연속적인 난이도의 문제를 선택하는 경우와 연속적인 난이도의 문제를 선택하는 경우, 두 경우로만 나누려고 했다. 그런데 그렇게 처리하려고 하니, 계산하기가 영 까다로웠다. 난이도가 n인 문제를 채택할 때 세 가지의 케이스는 따져야 할 것 같았다.
- 난이도 n의 문제를 선택하는 경우
- 난이도 n-1 또는 n의 문제를 선택하는 경우
- 난이도 n 또는 n+1의 문제를 선택하는 경우
첫 번째와 세 번째 케이스는 난이도 n-1인 문제를 채택하는 방법에 영향을 받지 않는 것이 자명하다. 따라서 난이도 n-1인 문제까지 선택한 경우의 수에 단순하게 곱해서 DP 테이블을 채울 수 있다. 하지만 두 번째 케이스는 이전 단계의 선택에 영향을 받는다. 이전 단계에서 난이도 n-1 또는 n의 문제를 선택한 경우(당시 시점 기준으로는 난이도 n' 또는 n'+1인 문제, n'=n-1), 현재 단계에서 난이도 n-1 또는 n 문제를 선택할 때 이전에 소모된 하나의 문제를 고려하여 계산해주어야 한다.
연속된 난이도 문제 배열에서 해당하는 난이도 문제 수에서 1을 빼고, 그 값만큼만 이전 세 번째 케이스의 경우에 곱해주면 된다. 이 때, 1을 뺀 값이 -1이 될 수 있으므로 결과가 음수라면 0이 될 수 있도록 처리한다. 물론 이전 첫 번째, 두 번째 케이스에 대해서는 현재 단계에서 난이도 n-1 또는 n 문제를 골라도 영향이 없으므로, 단순하게 곱하여 처리하면 된다.
줄 글로 작성하니 복잡해 보이지만, 코드로 작성하면 다음과 같이 명확하고 간단해진다.
#include <iostream>
#include <vector>
#define MOD_NUM 1000000007
using namespace std;
int main() {
cin.tie(nullptr);
ios_base::sync_with_stdio(false);
int n;
cin >> n;
vector<int> nonCont(n);
vector<int> cont(n);
for(int i=0; i<n; i++) {
cin >> nonCont[i];
}
for(int i=0; i<n-1; i++) {
cin >> cont[i];
}
vector<vector<long long> > dp(n+1, vector<long long>(3));
dp[0] = {nonCont[0], 0, cont[0]};
for(int i=1; i<n; i++) {
dp[i][0] = ((dp[i-1][0]+dp[i-1][1]+dp[i-1][2])%MOD_NUM*nonCont[i])%MOD_NUM;
dp[i][1] = (((dp[i-1][0]+dp[i-1][1])%MOD_NUM*cont[i-1])%MOD_NUM + dp[i-1][2]*(cont[i-1]-1<0?0:cont[i-1]-1)%MOD_NUM)%MOD_NUM;
dp[i][2] = ((dp[i-1][0]+dp[i-1][1]+dp[i-1][2])%MOD_NUM*cont[i])%MOD_NUM;
}
cout << (dp[n-1][0]+dp[n-1][1])%MOD_NUM;
}
2. 1주차 프로젝트 회고
일단 KPT 회고를 작성했었는데, 다음과 같다.
Keep:
궁금한게 생기면 적극적으로 물어보고 하는 분위기가 좋았습니다
모르는 기술도 열린 마음으로 적용해보려고 하는 마인드도 좋았습니다
(눈 떠보면 새로운 프레임워크, 라이브러리가 쏟아져 나오는 개발자들에게 중요한 마인드셋인 것 같습니다)
Problem:
숙련도 및 경험 부족으로 인한 형상관리 이슈
컨벤션 통일 & 공통 리소스 관리(프로젝트 크기가 커진다면 유지보수 비용에 영향을 줄 것 같습니다)
-해결 방안:
사소한 부분들도 계속 소통하고 서로 확인했다면 문제 크기가 작을 때 진화할 수 있었을 것 같습니다
Try:
다음에는 서로의 개발환경처럼 디테일한 부분도 미리 체크할 수 있도록 노력해야할 것 같습니다
feel:
다양한 사람이 모이는 자리라 걱정을 많이 했는데, 첫 프로젝트 팀원으로 다들 성격 모난 곳 없는 좋은 분들이 걸려서 만족스러운 프로젝트였습니다
기술적인 어려움은 문서 찾아보고 뜯어 고치면 되는거고, 확실히 사람과의 어려움이 없는게 프로젝트 할 때 더 중요한 것 같습니다
프로젝트에 관한 내용과 소감을 줄글로 좀 작성하자면, 첫 주차이기 때문에 프로젝트의 난이도 자체는 어렵지 않았다. 팀원들과 함께 각자를 소개하는 앱을 만들어 보는 프로젝트였고, 그래서 기능 구현이 필요한 부분은 거의 없었다. UI 디자인 및 간단한 클릭리스너나 Intent 작업 정도를 의도한 과제처럼 보였다. 하지만 다수의 인원과 Git을 통한 협업을 해보는 것은 좋은 경험이 될 것 같았다.
그래서 나는 팀원들에게 가볍게 뷰만 그리면 되니까, ViewBinding 바탕으로 구현하고 각자 개인페이지는 Activity로 생성해서 쓰자고 제안했다. 이후 팀원분이 생성해주신 초기 빌드 파일이 올라간 Git Repository에 Collaborator로 등록했고, master 브랜치를 클론해서 바로 내 브랜치도 생성해 작업을 시작했다. 간단한 UI 구현 위주라 구현은 금방 끝났고 내 브랜치로 push한 이후에, 팀원분들께 말씀 드리고 PR 후 master 브랜치에 병합했다.
"마스터 브랜치에 병합했으니까, 확인하시고 Pull 한 번씩 부탁드려요"
사실 이런 과정 속에서 내가 좀 더 디테일했다면 이후에 발생할 문제들이 없거나 적었을 것이라고 생각한다. 처음 올라와있던 Repository에 .idea 디렉토리가 포함된 것이라든지(프로젝트를 생성한 팀원의 .gitignore내에 누락), Git이 익숙하지 않아 clone이 아니라 깃허브 웹에서 코드만 다운로드한 팀원이라든지, 또 팀원들이 본인의 브랜치를 생성했고 내 요청에 Pull 제대로 받았는지 등 디테일하게 확인했어야 했다.
나도 협력해서 작업하는 경험이 부족해서 미리 예상하지 못한 부분들이었고, 아니나 다를까 이후에 형상관리에 관한 이슈가 많이 발생했다. 크고 작은 conflict부터 애초에 git 초기화가 되지 않은 상태에서 작업한 경우, 브랜치 관리 문제 등 팀원들에게 여러가지 이슈가 발생했고 그 때마다 모두 함께 붙어서 이슈 해결에 힘썼다.
혼자 Git을 사용할 때는 경험하지 못한 것들이었고, 적극적으로 팀원들의 이슈를 같이 고민하면서 나도 많이 배운 것 같다. 안드로이드 구현 쪽에서도 피드백을 좀 드려야하나 생각했는데, 1주차라 안드로이드에 익숙하지 않은 분들이 계셔서 그런 디테일 측면은 아직은 사족일 것 같았다.
다양한 이슈들을 해결하고 앱을 완성한 이후, 수강생들 앞에서 간단한 발표회를 거쳐 해당 프로젝트를 마무리 했다. 다른 조들도 다들 프로젝트에 이런 저런 아이디어를 적용해보려 한 게 보여서 보기 좋았다. 내가 너무 요구사항에만 충실하게 구현했나 싶기도 하고..
그래도 이유 없는 기술 나열이나 복잡성 증가가 목적인 프로젝트는 지양하고 싶어서, 앞으로도 심플하게 주요한 로직 위주로 공들여서 작업할 것 같긴하다.
위에서도 작성했지만 정말 다양한 사람이 모이는 곳이고, 그래서 팀 프로젝트를 조금 걱정했었는데(숙련도 문제가 아니라 분위기에 악영향을 주는 사람이 있을까봐) 다행히 첫 조의 팀원들은 다들 성격이 너무 좋았다. 그래서 더 얻은 게 많은 것 같고, 내일부터는 또 새로운 조와 함께 프로그래밍 기초/심화주차에 들어갈 것 같다. 아직까지는 비교적 여유가 있으니까 계속 손대고 있던 사이드 프로젝트의 와이어 프레임과 아키텍처를 도식화해서 튜터님께 좀 여쭤봐야 할 것 같다. Entity의 wrapping을 어느쪽에서 어느만큼 할 건지, Paging3는 어느 레이어에서 적용되어야 할 지, 애매한 부분들이 좀 있다.
전에 듣던 강의들도 마저 들어야 하고 CS 복습도 안 한지 오래되었는데, 어째 앉아 있는 시간은 늘었는데 할 건 넘쳐나는 느낌이다. 좀 더 밀도있게 공부해야 할 것 같다😂
'내일배움캠프 안드로이드 3기' 카테고리의 다른 글
[TIL] 24.03.06 알고리즘, 2주차 개인과제 (2) | 2024.03.06 |
---|---|
[TIL] 24.03.05 알고리즘, 2주차 개인과제 (0) | 2024.03.05 |
[TIL] 24.02.29 (0) | 2024.03.01 |
[TIL] 24.02.28 (1) | 2024.02.28 |
[TIL] 24.02.27 (1) | 2024.02.27 |