티스토리 뷰

https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV4suNtaXFEDFAUf



Core의 개수가 최대 12개 이므로 각각의 Core에 대해서 4가지 방향의 모든 경우의 수를 만들면 된다. 최대 4^12=16777216 이므로 시간 초과에 대해서는 걱정할 필요가 없음을 알 수 있다. 각 경우에 대해서 가장자리에 있는 코어는 어차피 전원에 연결되 있으므로 따로 카운트 해주고 나머지 코어들에 대해서 정해진 방향으로 전선을 만들어 보면서 기존의 코어나 전선과 겹치는 것이 없는지 확인한다. 그리고 정답을 갱신해 갈 때 Core의 개수, 전선 길이의 합 순으로 우선순위를 두어서 한다. 또한 테스트케이스가 여러 개이므로 전역변수들에 대하여 초기화를 꼭 해줘야함에 주의하자.


삼성 SW Test A형과 코딩테스트의 특징이 보통 시간에 대해서는 크기를 작게 해서 최적화나 특정 알고리즘 사용에 대해서는 고려하지 않아도 되고 주로 완전탐색을 통해 구현을 할 수 있느냐를 물어보는 것 같다.



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
#include <cstdio>
#include <vector>
using namespace std;
 
int t,n,map[12][12],cnt,cnt2,dx[4]={0,0,1,-1},dy[4]={1,-1,0,0},CORE,SUM;
vector<pair<int,int>> core;
vector<int> v;
 
void solve()
{
    int tmap[12][12];
    for(int i=0;i<n;i++for(int j=0;j<n;j++) tmap[i][j]=map[i][j];
    int sum=0,c=cnt2;
    for(int i=0;i<cnt;i++)
    {
        int x=core[i].first,y=core[i].second;
        while(true)
        {
            x+=dx[v[i]],y+=dy[v[i]];
            if(x<0 || x>=|| y<0 || y>=n) { c++break; }
            if(tmap[x][y]==1return;
            else tmap[x][y]=1,sum++;
        }
    }
    if(CORE<c) CORE=c,SUM=sum;
    else if(CORE==&& SUM>sum) SUM=sum;
}
 
void go(int n)
{
    if(n==cnt)
    {
        solve();
        return;
    }
    for(int i=0;i<4;i++)
    {
        v.push_back(i);
        go(n+1);
        v.pop_back();
    }
}
 
int main()
{
    scanf("%d",&t);
    for(int k=1;k<=t;k++)
    {
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                scanf("%d",&map[i][j]);
                if(map[i][j]==1)
                {
                    if(i==0 || i==n-1 || j==0 || j==n-1) cnt2++;
                    else core.push_back({i,j}),cnt++;
                }
            }
        }
        go(0);
        printf("#%d %d\n",k,SUM);
        core.clear(),cnt=cnt2=CORE=SUM=0;
    }
    return 0;
}
cs


'Algorithm > SW Expert Academy' 카테고리의 다른 글

2105 디저트 카페  (2) 2018.03.17
1953 탈주범 검거  (0) 2018.03.16
1952 수영장  (0) 2018.03.14
1949 등산로 조성  (4) 2018.03.14
3289 서로소 집합  (0) 2018.02.22
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday