문제링크 : https://www.acmicpc.net/problem/7576


해결방법 : 

보관 후 하루가 지나면, 익은 토마토들의 인접한 곳에 있는 익지 않은 토마토들은 익은 토마토의 영향을 받아 익게 된다. 하나의 토마토의 인접한 곳은 왼쪽, 오른쪽, 앞, 뒤 네 방향에 있는 토마토를 의미한다. 

이 문제에서 주어진 설명을 보면 하루마다 익은 토마토 좌표를 기준으로 인접한 네 방향에 안익은 토마토를 익게하므로 BFS탐색 방법을 사용하기로 생각했다. 테스트케이스에서 익은 토마토를 기준으로 따라 그려나가다 보면 이해하기 쉬울 것이다.


따라서 상자에 있는 토마토 모두가 익는데 최소의 일수는 BFS 탐색을 하고난 후의 최종적인 depth(깊이) 값이다. (그림참고)


프로그램 로직은 크게 bfs 탐색 전후로 나눌수있는데,

탐색 전에서는 입력을 받는 가운데 map에서 -1값을 갖고있으면 해당 좌표를 방문처리를 미리 해버렸다.그리고 1값을 가진 토마토 익은 기준좌표를 queue에 넣고 이좌표 또한 방문 처리를 해준다. 그리고 한번 전체를 탐색해서 이미 다 익었는지를 확인하고 다익었으면 0을 출력하고 아니면 bfs 탐색을 시작하게 했다.

bfs를 탐색한 후에는 visit배열을 보고 0이 하나라도 남아있다면 -1 출력하고 아니라면 bfs탐색에서 구한 depth값을 출력했다.


소스코드)


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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include<iostream>
#include<queue>
 
using namespace std;
struct pos
{
    int x;
    int y;
};
int visit[1001][1001];
int map[1001][1001];
int M,N;
queue< pair<pos, int> > q;
int dx[4= {-1,1,0,0}; //상하좌우 0,1,2,3 
int dy[4= {0,0,-1,1};
bool isInMap(int x, int y)
{
    if(x <0 || x >=|| y<0 || y>=M)
    {
        return false;
    }
    else
        return true;
}
int bfs(void)
{
    pos p;
    int dep;
    while(!q.empty())
    {
        int nx = q.front().first.x;
        int ny = q.front().first.y;
        int ndep = q.front().second;
        dep = ndep;
        q.pop();
        for(int i =0; i< 4; i++)
        {
            int nnx = nx + dx[i];
            int nny = ny + dy[i];
            if(!isInMap(nnx,nny)) continue;
            else
            {
                if(!visit[nnx][nny])
                {
                    p.x = nnx;
                    p.y = nny;
                    visit[nnx][nny] = 1;
                    q.push(make_pair(p,ndep + 1));
                }
            }
        } 
    }
    return dep;
}
bool check()
{
    bool flag = false;
    for(int i = 0; i<N; i++)
    {
        for(int j = 0; j<M; j++)
        {
            if(visit[i][j] != 1)
            {
                flag = true;
                break;
            }
        }
        if(flag)
        break;
    }
    return flag;
}
int main()
{
    pos p;
    int ret;
    bool flag = false;
    scanf("%d %d"&M, &N);
    for(int i = 0; i<N; i++)
    {
        for(int j= 0; j<M; j++)
        {
            scanf("%d",&map[i][j]);
            if(map[i][j]==-1)
                visit[i][j] = 1;
            if(map[i][j] == 1)
            {
                visit[i][j] = 1;
                p.x = i;
                p.y = j;
                q.push(make_pair(p,0)); // 익은 사과의 좌표정보와 depth 값 push 
            }
        }
    }
    flag = check();
    if(flag == false)
    {
        printf("0\n");
    }
    else
    {
        ret = bfs();
        flag = check();
        if(flag){ 
            printf("-1\n");
        }
        else
        {
            printf("%d\n",ret);
        }
    }
    return 0;
}
cs


반응형

'PS > 백준' 카테고리의 다른 글

2448번 별 찍기 - 11  (0) 2018.11.12
1966번 프린터 큐  (0) 2018.10.28
2839 설탕배달  (0) 2018.10.19
14891번 톱니바퀴  (0) 2018.10.15
15686번 치킨 배달  (0) 2018.10.14

중학생때부터 20대때까지 즐겨하는 게임이 하나 있는데 그건 바로 스타크래프트라는 게임이다.

내가 이 게임을 좋아하는 이유는 예전에 친구들보다 조금? 잘햇어서 인기가 많아졌기 때문이다.

처음에는 친구들 보다 정말 못하고 뒤떨어졌는데 계속 하다보니까 어느새 프로게이머 만큼은 아니더라도 친구들 사이에서는 제일 잘해져서 나름 뿌듯해지고 재밌었다.

내가 이 글을 쓰는 이유는 "아 누군가는 이글을 보고 내가 노력한 부분을 인정해주겠지ㅋㅋ 비록 게임이지만.."라는 생각과 내가 그래도 다른사람들 보다 잘하는게 있다라는 것을 글로 남겨서 추억을 만들고 싶었기 때문이다.(ㅋㅋ 비록 게임이지만)

 

자 지금부터 내가 약 10년동안 스타를 하면서 느낀 생각과 공략을 적어보겠다.

일단은 스타크래프트는 전략시뮬레이션 게임으로 상대방을 이겨야 승리하는 게임이다.

그렇다면 상대방을 어떻게하면 이길 수 있을까? 이건 상대방에게 어떤 피해를 입혀서 혹은 자신이 발전을 더 많이해서 점점 격차를 벌리고 결국 좁혀지지 않은 격차를 만들어내게 되면 승리 할 수 있게 된다고 생각한다.

당연한 얘기지만 실제 게임을 플레이 하면은 정말 손가는대로 거의 기계처럼 아무생각없이 게임을 하는 게 대부분일 것이다.

그리고 어떤이유로 심리적으로 긴장이되서 혹은 격차가 벌려진걸 좁혀야겠다라는 생각으로 급해지게 되면 이때부터 마음대로 플레이가 잘 안되게된다.

심리적인 요인으로 내가 생각하던 플레이를 정확히 해내기가 어렵게 된다. 

그렇다면, 어떻게하면 심리적인 요인에 영향을 덜받고 내 플레이를 해내갈 수 있을까?

이건 내 감정을 잘컨트롤해서 플레이를 해야한다.

되게 추상적인 말인데 내가 생각하는 감정컨트롤은 몸동작으로부터 컨트롤을 할 수 있다고 생각한다.

즉, 몸 동작으로부터 내 감정컨트롤을 잘해낼 수있게되고 이렇게 되면 내가 심리적영향을 덜받고 내 플레이를 정확히 해낼수 있게 된다는 명제가 생겨난다.

이 명제를 뒷받침 해주는 증거?라고 느꼈던게 프로게이머들 개인화면 플레이 모습떄문이다.

테란 원탑이라 불리는 이영호, 정명훈 의 개인화면을 비교해서 보앗는데 공통점이 보였었다. 그건 바로 마우스 움직임이 그렇게 빠르지 않았다. 개인화면을 보면서 느낀것은 막 휙휙 빠르게 하는것보다 차분하고 느리더라도 필요한 마우스 움직임만 하는것이었다.

물론, 아닌케이스 김택용, 이제동과같이 매우 빠른 마우스 움직임? 도 있어서 명제가 항상 맞지는 않는다.

그렇지만 이것으로 아 소위 APM이라 불리는것은 실력에 있어서 높고 낮음이 상관이 없다는 것을 알아낼수있는것이다.

나는 몸동작을 조절하면서 감정컨트롤은 할 수 있다고 생각한다. 어떤 시험을 본다거나 아니면 소개팅을 본다거나 면접을 본다거나 긴장되는 상황에서 우리가 이 떨리는 감정을 어떻게 조절 할까를 생각해보면, 어깨를 펴본다거나 자신감있게 소리를지른다거나와 같이 행동으로 이 감정을 떨쳐내려고 노력하는게 자연스러운 행동이다.

그래서 게임도 똑같이 요런 자연스러운 행동으로 감정을 조절하듯, 키보드눌림과 마우스 무빙등을 최대한 의식해가면서 게임을 플레이하면 심리적인 것으로 영향을 덜 받을 수 있다고 생각한다.

나는 실제 게임 대회에 나가서 이방법대로 게임을 플레이 해보았고 4강까지 뚫었던 적이 있었다. 친구들은 물론 가볍게 이겼고.. ㅋㅋ

완벽히 심리적으로 해방되서 내플레이에 온전히 집중하여 게임을 하기는 아직도 어렵지만 자꾸 의식해보고 연습을 해나간다면 프로게이머 급으로 잘해질 수 있다고 본다. 왜냐하면 내가 직접 경험을 해보고 실력이 많이 늘었기 때문이다. (이제는 스타, 게임자체를 안하지만ㅋㅋ)

이 방법이 안맞을 수 있기도 하지만 크게 봐서 심리적인 요소에 흔들리지 않고 내플레이에 집중하며 게임하는것이 승리를 하는 길인건 분명한거니까 이거를 하기위한 자기만의 방법을 찾아서 플레이를 한번해보길 바란다. 

더 길게 쓸수있지만 전달하려는 바는 쓴것같고, 지금 자야하는 시간이기에 이만 자러 바바이

 

2022.06.04 

정명훈 배넷어택을 보면서 느낀점을 정리한다. 스타할때 다음 이미지를 떠올리면서 하면 깔끔하게되고 다음 플레이가 넘어가지면서 자연스레 빠른 멀텟이 가능하게 된다고 느껴진다.

- 다음을 잘 넘어가기위해서 어떻게하는지 보자.
- 되게 급하게 찍을거 같은것도 기다렸다가 찍는느낌
- 마우스 움직임이 되게 깔끔해보인다.
- 빨리 해야한다는지 그런게 안느껴진다.. 
- 최대한 마우스를 깔끔하게 하려고한다.

 

2022.06.05

"요종도면 충분하다"라는 식으로 마우스와 키보드를 빠르게 움직이지 않음
되게 정확하게 하려고하는거를 제일 우선으로 신경쓰는것 같음

반응형

오늘 도서관에 공부를 하고 스터디 모임을 했었다 .
그런데 제대로 공부를 한건지는 잘 모르겠다 . 그냥 느낌에는 공부를 하려고 한것 같은 느낌만 들었다 ..
이걸 공부를 할때마다 느끼는거같은데 내가 쉽게만 공부하려해서 그런건지 .. 조금씩 공부방법을 수정해 나가야겟다 ..
지금 새벽이고 유투브보다가 스르륵 자야지 ~ 내일 또 봅세

반응형

'일기' 카테고리의 다른 글

힘스 면접후기  (0) 2018.10.30
취업성공패키지 3단계 개꿀~!  (0) 2018.10.27
새벽에 글쓰고자야디  (0) 2018.10.22
단기알바 한날 - 창업박람회 스탭  (0) 2018.10.21
보라스카이 면접 후기  (0) 2018.10.18

+ Recent posts