티스토리 뷰

반응형


#. Problem

* The copyright in this matter is in Inflearn


#. Resolution Process

  1. Read and understand problem

  2. Redefine the problem + abstract

  3. Create solution plan (select Algorithm, Data structure)

  4. Prove the plan (check performance time and usage memory)

  5. Carry out the plan

  6. Look back on the plan and find a way to improve it


#. Solve

  1. 우선 입력된 수들을 크기 N 배열에 저장하고, K 시간만큼 반복하면 되겠다.

     3

     1 2 3

     5 

 

     1 2 3


     K = 1, pos = 1

     0 2 3


     K = 2, pos = 2

     0 1 3


     K = 3, pos = 3

     0 1 2 


     K = 4, pos = 2 (position이 N보다 크다면 1로 재설정)

     0 0 2 (0인 작업은 pass)


     K = 5, pos = 3

     0 0 1

     break;

     

     pos = 3,

     전기가 들어온 후로 3번 작업부터 시작하면 되므로

     3을 출력하면 되겠다.


#. Code

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
#include <cstdio>
#include <vector>
#include <algorithm>
 
using namespace std;
 
int N, K;
 
int main(void)
{
    freopen("input.txt""rt", stdin);
 
    int pos = 0, cnt = 0, i;
 
    scanf("%d"&N);
    vector<int> vt(N + 1);
 
    for (i = 1; i <= N; i++)
        scanf("%d"&vt[i]);
    
    scanf("%d"&K);
 
    while (cnt < K)
    {
        cnt++;
 
        while (1)
        {
            pos++;
 
            if (pos > N)
                pos = 1;
 
            if (vt[pos] != 0)
            {
                vt[pos]--;
                break;
            }
        }
    }
 
    for (i = 1; i <= N; i++)
    {
        while (1)
        {
            pos++;
 
            if (pos > N)
                pos = 1;
 
            if (vt[pos] != 0)
            {
                printf("%d\n", pos);
                return 0;
            }
            else
                break;
        }
    }
 
    printf("-1\n");
 
    return 0;
}
cs


으아.. 내 코드에서 정전이 발생한 시간이 총 작업 시간보다 클 경우

line 27~39 에서 무한루프에 빠져버리게 된다.

강사님 코드를 참고해서 다시 짜보자..

정전이 발생한 시간이 총 작업 시간보다 클 경우를 미리 처리해주면 좋을 것 같다.


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
67
68
#include <cstdio>
#include <vector>
#include <algorithm>
 
using namespace std;
 
int N, K;
 
int main(void)
{
    freopen("input.txt""rt", stdin);
 
    int i, pos = 0, cnt = 0, total = 0;
 
    scanf("%d"&N);
    vector<int> vt(N + 1);
 
    for (i = 1; i <= N; i++)
    {
        scanf("%d"&vt[i]);
        total += vt[i];
    }
 
    scanf("%d"&K);
 
    if (K >= total)
    {
        printf("-1\n");
 
        return 0;
    }
 
    while (cnt < K)
    {
        cnt++;
 
        while (1)
        {
            pos++;
 
            if (pos > N)
                pos = 1;
 
            if (vt[pos] != 0)
            {
                vt[pos]--;
                break;
            }
        }
    }
 
    while (1)
    {
        pos++;
 
        if (pos > N)
            pos = 1;
 
        if (vt[pos] != 0)
        {
            printf("%d\n", pos);
            
            break;
        }
    }
 
    return 0;
}
cs

line 26~31 에서 정전이 발생한 시간이 총 작업 시간보다 클 경우를 미리 처리해주었다.

이러한 특정 상황의 경우를 미리 처리해주면 그 다음 구현이 정말 편해질 수 있다는 것을 알게 되었다..


#. Other code

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
#include<stdio.h>
#include<algorithm>
 
using namespace std;
 
int a[2001];
 
int main(){
    int n, k, i, p=0, cnt=0, tot=0;
 
    scanf("%d"&n);
    for(i=1; i<=n; i++)
    {
        scanf("%d"&a[i]);
        tot=tot+a[i];
    }
    scanf("%d"&k);
 
    if(k>=tot)
    {
        printf("-1\n");
 
        return 0;
    }
 
    while(1){
        p++;
 
        if(p>n) 
            p=1;
 
        if(a[p]==0
            continue;
 
        a[p]--;
        cnt++;
 
        if(cnt==k) 
            break;
    }
 
    while(1){
        p++;
 
        if(p>n) 
            p=1;
 
        if(a[p]!=0
            break;    
    }
 
    printf("%d\n", p);
 
    return 0;
}
cs

line 19를 보면 전체 작업의 시간 total 을 작업 시간 입력 시 연산해준 후

k >= total 보다 더 큰 경우, 즉 전체 작업시간보다 정전이 발생한 시간이 더 큰 경우, -1 을 출력해준다.

정전이 발생했을 때, 이미 모든 작업이 완료된 상태이기 때문이다.. 

나는 무조건 다 처리해준 후 마지막에 0의 유무를 확인해주었는데,,

반성하자!


line 26~40) 정전이 발생하기 전까지 작업을 수행한다.

나처럼 이중 while 문을 쓰는 것보다 continue 와 break 를 잘 사용해주면 더 좋을 듯 하다.


line 42~50) 정전이 풀리고 나서 수행해야할 작업을 탐색한다.


#. Result

  - Input --------------------------------------------------------

3

1

2

3

5

------------------------------------------------------------------


  - Output --------------------------------------------------------

3

------------------------------------------------------------------



반응형
댓글
최근에 올라온 글
최근에 달린 댓글
링크
Total
Today
Yesterday