본문 바로가기

SWEA/삼성SW역량테스트 C++

[SWEA] 활주로 건설

[문제]

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWIeW7FakkUDFAVH&

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

www.swexpertacademy.com

[풀이]

 

 

제출일 : 2019-08-02 20:18

  • C++언어
  • 12,628 kb메모리
  • 6 ms실행시간
  • 1,694코드길이
  • Pass결과

이 문제와 동일하다. 

2019/08/02 - [BOJ/삼성SW역량테스트] - [BOJ] 14890. 경사로

 

[BOJ] 14890. 경사로

[문제] https://www.acmicpc.net/problem/14890 14890번: 경사로 첫째 줄에 N (2 ≤ N ≤ 100)과 L (1 ≤ L ≤ N)이 주어진다. 둘째 줄부터 N개의 줄에 지도가 주어진다. 각 칸의 높이는 10보다 작거나 같..

jayrightthere.tistory.com

 


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
#include <iostream>
#include <cstring>
#include <cmath>
 
using namespace std;
 
int n, x;
int map[20 * 2][20];
int ans;
 
void findPath(int r)
{
    int stand = map[r][0];
    int height[7];
    memset(height, 0sizeof(height));
 
    height[stand] = 1;
 
    for (int i = 1; i < n; i++)
    {
        int next = map[r][i];
        //다음 칸 저장
        if (stand != next)
        {
            if (abs(stand - next) > 1)
            { //높이 차가 1 이상인 경우 -> 경사로 형성 불가
                --ans;
                return;
            }
            if (stand < next ) {
                //지금까지 지나온 높이가 같은 칸들이 x 이상이어야 한다. 
                if (height[stand] < x) {
                    --ans;
                    return;
                }
                height[stand] = 0;
                height[next] = 1;
            }
            else { //stand > next => 앞으로 지날 칸들 중 높이가 next와 같은 칸이 x이상 있어야 한다. 
                for (int j = i; j < i + x && j < n; j++) {
                    if (next == map[r][j]) {
                        height[next]++//얼마나 많은 칸들이 같은지 저장해줌 
                    }
                }
                if (height[next] < x) {
                    --ans;
                    return;
                }
                height[next] -= x;
                i += x-1//x칸 만큼 땡겨준다. 
            }
            stand = next;
        }
        else { //stand == next
            height[stand]++//stand가 같은 경우 카운트를 증가해줌
        }
    } //for 열
}
void init()
{
    memset(map, 0sizeof(map));
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
 
    int t;
 
    cin >> t;
 
    for (int tc = 1; tc <= t; tc++)
    {
        cin >> n >> x; //격자판의 너비, 경사로의 길이
 
        ans = n * 2;
 
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                cin >> map[i][j];
            }
        }
 
        for (int i = n; i < n * 2; i++)
        {
            for (int j = 0; j < n; j++)
            {
                map[i][j] = map[j][i - n];
            }
        }
 
        for (int i = 0; i < n * 2; i++)
        {
            findPath(i);
        }
 
        cout << "#" << tc << " " << ans << '\n';
    }
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

'SWEA > 삼성SW역량테스트 C++' 카테고리의 다른 글

[SWEA] 원자소멸시뮬레이션  (0) 2019.10.07
[SWEA] 점심식사시간  (0) 2019.09.11
[SWEA] 미생물 격리  (0) 2019.08.01
[SWEA] 보호필름  (0) 2019.08.01
[SWEA] 줄기세포배양  (0) 2019.07.31