Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 새로운방
- 1108
- 최단거리
- 정올
- 토마토(고)
- 페이지 전환
- Floyd 알고리즘
- 2613
- 김씨만행복한세상
- maven #메이븐 #빌드 #build #lifecycle
- 큐
- 태그를 입력해 주세요.
- kubectl
- 암스트롱 수
- Floyd
- sql #오라클 #oracle #sequence #foreach #insert #mybatis
- CKAD
- 코드그라운드
- 알고리즘
- JAVA #필수값
- 오류교정
- hexagonal architecture #layer architecture #아키텍쳐 #헥사고날
- 새로운 방
- 페이지전환
- 1037
- kafka #ackmode #manual #acknowledge
- 1045
- kafka #consumer #autoStartup
- kafka connect #debizium #transform
- kubernets
Archives
- Today
- Total
별집사의 IT세상
NORMAL2 수강신청 본문
반응형
입력조건
출력조건
입력 | 출력 |
---|---|
1 4 13 2 4 6 8 | Case #1 12 |
dp를 이용해 해당 이수 학점을 들을 수 있을 때는 1, 없을 때는 0으로 저장하였다.
해당 학점(temp)에서 각 학점(sub[i])을 뺐을 때 나오는 학점을 들을 수 있다면,(dp[temp-sub[i]]==1) 해당 학점도 들을 수 있게 된다.
1학점부터 M학점까지 계산하였고, M에서 최대한 가까운 값을 출력하였다.
최적화로 생각해 볼 것은 각 케이스마다 배열을 동적 할당하여 메모리를 줄이는 방법과, 문제에 설명이 안되있지만 과목이 크기순으로 정렬을 확인하는 점이다.
문제에 제대로 설명이 안되어 있는데, 과목을 중복으로 들어도 되게 코딩을 했는데 통과한 걸 보면 중복으로 들어도 되나보다(대학 강의를 어떻게 중복으로 듣나..)
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 | #include <stdio.h> int main( void ) { setbuf (stdout, NULL); int dp[10001] = { 0 }; //해당 학점을 들을 수 있는가? int sub[5000] = { 0 }; int i, j; int T; int test_case; int N, M; int temp; int ans; scanf ( "%d" , &T); for (test_case = 1; test_case <= T; test_case++) { scanf ( "%d %d" , &N, &M); for (i = 0; i < N; i++) { scanf ( "%d" , &sub[i]); dp[sub[i]] = 1; //각 과목에 해당하는 학점은 들을 수 있으므로 1로 저장 } temp = 1; while (temp <= M) { if (dp[temp]) { //이미 해당 학점을 들을 수 있으면 스킵 temp++; } else { for (i = 0; i < N; i++) { //해당 학점에서 각 과목 학점을 뺀 학점을 들을 수 있고, 각 과목 학점이 해당학점 보다 작은 경우 해당 학점도 들을 수 있다. if (dp[temp - sub[i]] && sub[i] <= temp) { dp[temp] = 1; break ; } } temp++; } } ans = M; while (!dp[ans]) { ans--; } printf ( "Case #%d\n" , test_case); printf ( "%d" , ans); for (i = 1; i <= M; i++) { dp[i] = 0; } for (i = 0; i < N; i++) { sub[i] = 0; } } return 0; } </stdio.h> |
반응형
'IT > 코드그라운드' 카테고리의 다른 글
NORMAL2 새로운 방 (0) | 2017.04.11 |
---|---|
NORMAL 김씨만 행복한 세상 (0) | 2017.04.05 |
EASY 시험공부 (0) | 2017.02.20 |
Comments