본문 바로가기

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

[SWEA] 보호필름

[문제]

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

 

SW Expert Academy

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

www.swexpertacademy.com

[풀이]

제출일 : 2019-08-01 13:42

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

1) 입력 : 세로 D, 가로 W, 통과 기준 K

 

2) 단면의 모든 세로방향에 대해서 동일한 특성의 셀들이 K개 이상 연속적으로 있는 경우에만 성능검사를 통과하게 된다.

 

3) 셀을 구성하는 특징은 A, B 두 가지이다. (A : 0 / B : 1) 

 

3) 약품을 투입하면 한 행의 모든 셀이 같은 특성으로 변경된다. 

 

4) 구하는 값 : 성능검사를 통과하기 위한 최소 약품투입 횟수

 

5) 약품을 투입하지 않고도 성능검사를 통과하는 경우에는 0을 출력한다.

  • k == 1 인 경우 

  • 입력 값이 이미 k를 만족하는 경우

6) 처음 입력값을 보존하고 복사한 맵에 약품을 주입한 후 다시 되돌리는 과정이 중요하다.

 

7) dfs(cur : 현재 검사하는 행,  cnt : 약품 투입 횟수)

 

8) 댓글에서 얻은 팁인데, d행 중 k개의 연속적인 특성을 만족함 -> d-k+1 까지 검사했을 때 연속된 특성이 K개가 아닐 경우에는 그 열은 통과되지 못한다. => 다음 열을 검사한다. 

 

9)  현재 검사하는 행이 d와 같더라도 (끝까지 검사) 바로 리턴하지 않고 검사 조건(k)를 만족했는지 확인하고 최소값을 갱신한다. 

(여기서 계속 바로 리턴을 해줘서 테스트케이스를 통과하지 못했다..)

 

10) 팁이라면 팁인데, 입력받은 맵과 그 맵을 복사한 값을 전역변수로 두고 복사맵을 변경한 후 되돌리는 값으로 원래 맵을 사용한다. 

(재귀 함수에 계속 map을 넘기다 보면 결국 map이 변경돼서 몇몇 테스트 케이스를 통과하지 못한다.)

 

* isThereK() => 한 열에 k 개의 특성이 연속되어 나타나는지 확인 

 


 

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
#include <iostream>
#include <cstring>
#include <climits>
 
#define INF 10000
using namespace std;
 
int d, w, k;
int ans;
bool c_film[13][20], film[13][20];
 
bool isThereK()
{
    //k개의 특성이 연속되는지 확인
    bool flag = false;
    for (int j = 0; j < w; j++)
    {
        for (int i = 0; i < d - k + 1; i++//d-k+1까지만 살펴봐도 연속된 특성이 없으면 그 열은 검사에 통과하지 못한다.
        {
            for (int z = 1; z < k; z++)
            {
                if (c_film[i][j] != c_film[i + z][j])
                {
                    flag = false;
                    break;
                }
                else
                    flag = true;
            }
            if (flag)
                break//이미 검사 완료
        }               //for d
        if (!flag)
            return false//하나의 열이라도 만족하지 못하면 검사 종료
    }                      //for w
    return true;
}
 
void dfs(int cur, int cnt)
{
    if (cur == d)
    { //마지막 행이 바뀌면 통과 될 수도 있기 때문에 바로 리턴하지 않고 값을 갱신해준다. 
    
        if (isThereK())
        {
            if (ans > cnt)
            {
                ans = cnt;
            }
        }
    }
 
    else
    {
        //dfs 호출
        dfs(cur + 1, cnt);
 
        //약물 넣는 과정
        memset(c_film[cur], false, w);
        dfs(cur + 1, cnt + 1);
        memset(c_film[cur], true, w);
        dfs(cur + 1, cnt + 1);
 
        //약물 넣기 전으로 되돌리기
        memcpy(c_film[cur], film[cur], w);
    }
}
 
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
 
    int t;
    cin >> t;
 
    for (int tc = 1; tc <= t; tc++)
    {
 
        cin >> d >> w >> k; //세로 /가로 /테스트 통과 조건
 
        memset(c_film, falsesizeof(c_film));
        memset(film, falsesizeof(film));
        for (int i = 0; i < d; i++)
        {
            for (int j = 0; j < w; j++)
            {
                cin >> c_film[i][j]; // a = 0 / b = 1;
                film[i][j] = c_film[i][j];
            }
        }
        //입력
 
        if (k == 1)
        {
            //통과 기준이 1이면 입력 값이 정답이다.
            cout << "#" << tc << " " << 0 << '\n';
            continue;
        }
        if (!isThereK())
        {
            ans = INT_MAX;
 
            dfs(00);
        }
        else
        {
            ans = 0;
        }
        //성능검사
 
        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.08.02
[SWEA] 미생물 격리  (0) 2019.08.01
[SWEA] 줄기세포배양  (0) 2019.07.31
[SWEA] 핀볼게임  (0) 2019.07.31
[SWEA] 디저트가게  (0) 2019.07.29