SW Expert Academy의 Ladder2(1211 / d4) 문제이다.


[ 문제풀이 ]

1) Ladder1과 굉장히 비슷한 문제이다. 단지 다른점이 있다면, Ladder1에서는 가장 마지막에 '2'로 가게되는 사다리의 시작점을

   찾는것이 문제였다면, 이 문제는 가장 빠르게 가장 아래쪽으로 내려갈 수 있는 사다리 번호를 맞추는 것이 문제이다.

   구현과정은 Ladder1과 마찬가지로 그리 어렵지 않고, 설명보다는 소스코드를 보는 것이 이해가 더 빠를 것 같다.

   사다리가 있는 모든 칸에서 사다리게임을 시작하면서, 내려갈 때 존재하는 모든 칸수를 Count하면서 최소값과 비교하면서

   갱신해주는 방식으로 구현해주었다.


[ 소스코드 ]

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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#include<iostream>
 
#define endl "\n"
#define MAX 100
using namespace std;
 
int Answer, Temp_Answer;
int N;
int MAP[MAX][MAX];
 
void Initialize()
{
    Temp_Answer = 987654321;
    Answer = -1;
}
 
void Input()
{
    cin >> N;
    for (int i = 0; i < MAX; i++)
    {
        for (int j = 0; j < MAX; j++)
        {
            cin >> MAP[i][j];
        }
    }
}
 
int Start_Ladder(int line)
{
    int Cnt = 1;
    int x = 0;
    int y = line;
    char Dir = 'D';
 
    while (1)
    {
        if (Dir == 'D')
        {
            x++;
            Cnt++;
            while (1)
            {
                if (x == MAX - 1)
                {
                    return Cnt;
                }
 
                if (y + 1 < MAX)
                {
                    if (MAP[x][y + 1== 1)
                    {
                        Dir = 'R';
                        break;
                    }
                }
 
                if (y - 1 >= 0)
                {
                    if (MAP[x][y - 1== 1)
                    {
                        Dir = 'L';
                        break;
                    }
                }
                x++;
                Cnt++;
            }
        }
        else if (Dir == 'R')
        {
            y++;
            Cnt++;
            while (1)
            {
                if (x + 1 < MAX)
                {
                    if (MAP[x + 1][y] == 1)
                    {
                        Dir = 'D';
                        break;
                    }
                }
                y++;
                Cnt++;
            }
        }
        else if (Dir == 'L')
        {
            y--;
            Cnt++;
            while (1)
            {
                if (x + 1 < MAX)
                {
                    if (MAP[x + 1][y] == 1)
                    {
                        Dir = 'D';
 
                        break;
                    }
                }
                y--;
                Cnt++;
            }
        }
    }
}
 
void Solution()
{
    for (int i = 0; i < MAX; i++)
    {
        if (MAP[0][i] == 1)
        {
            int R = Start_Ladder(i);
            if (Temp_Answer > R)
            {
                Temp_Answer = R;
                Answer = i;
            }
        }
    }
}
 
void Solve()
{
    int Tc = 10;
    for (int T = 1; T <= Tc; T++)
    {
        Initialize();
        Input();
        Solution();
 
        cout << "#" << T << " " << Answer << endl;
    }
}
 
int main(void)
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
 
//    freopen("Input.txt", "r", stdin);
    Solve();
 
    return 0;
}
 
cs


'[ SWEA Code ] > # SWEA - ' 카테고리의 다른 글

[ SWEA 1213 ] String (C++)  (0) 2019.03.04
[ SWEA 1251 ] 하나로 (C++)  (2) 2019.03.04
[ SWEA 1244 ] 최대상금 (C++)  (0) 2019.02.19
[ SWEA 1210 ] Ladder1 (C++)  (0) 2019.02.19
[ SWEA 1208 ] Flatten (C++)  (0) 2019.02.19

+ Recent posts