Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 하카타역
- queue
- 미로찾기
- 깊이 우선 탐색
- deque
- BOJ
- 알고리즘
- 큐
- 시뮬레이션
- 삼성테스트
- 후쿠오카 요도바시 하카타
- dfs
- 다이나믹 프로그래밍
- IOS
- 백준
- 삼성시험
- brute force
- DP
- 일본 여행
- 후쿠오카 캐널시티
- 완전 탐색
- 완전탐색
- 플로이드 와샬
- BFS
- 삼성 SW 테스트
- 후쿠오카 4박 5일
- 후쿠오카
- 후쿠오카 여행경비
- 너비 우선 탐색
- 플로이드
Archives
- Today
- Total
맛있는감귤
BOJ : 12100 2048(Easy) 본문
문제 : https://www.acmicpc.net/problem/3190
2016년 삼성 하반기 공채 SW 역량테스트 오전 문제
째로탈출과 같이 나온 오전 문제.
한 때 인기몰이를 했던 2048 게임의 축소판이다.
이 문제는 최대 이동횟수가 5이기에 DFS나 BFS 두 가지 방법으로 모두 해결가능하다.
하지만 한 쪽으로 기울일 때 숫자가 합쳐지는 과정을 어떻게 구현하느냐가 문제!
상하좌우를 각각 짜서 코드 가독성이 매우 안좋음
나는 한 쪽으로 치우쳐지면서 숫자가 합쳐지는 것을 vector로 짰다.
0(빈공간)을 제외한 숫자를 벡터에 받고 v[k]와 v[k+1]을 비교한 후 같으면 v[k]*2, v[k+1]=0으로 만들어주고 다시 숫자판에 초기화해주었음.
포스팅하기 민망한 코드이지만 필요할 수도 있는 사람을 위해서 올림ㅠㅠ
2016년 삼성 하반기 공채 SW 역량테스트 문제
12100 2048(Easy) / 해설 오전
3190 뱀 오후
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 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 | #include <cstdio> #include <vector> #include <queue> using namespace std; int N,ans=0,cnt=1; vector<vector<int>> m; queue<vector<vector<int>>> q; void print(vector<vector<int>> map){ for(int i=0;i<N;i++){ for(int j=0;j<N;j++){ printf("%d ",map[i][j]); } printf("\n"); } printf("\n"); } int main(){ scanf("%d",&N); m.resize(N*N); for(int i=0;i<N;i++){ for(int j=0,n;j<N;j++){ scanf("%d",&n); m[i].push_back(n); } } ans=m[0][0]; q.push(m); while(!q.empty()){ int sz = q.size(); while(sz--){ vector<vector<int>> t = q.front(); q.pop(); //right vector<vector<int>> tt; tt.resize(N*N); for(int r=0;r<N;r++){ for(int rr=0;rr<N;rr++) for(int cc=0;cc<N;cc++) tt[rr].push_back(0); vector<int> v; v.resize(N); for(int c=N-1;c>=0;c--) if(t[r][c] !=0) v.push_back(t[r][c]); for(int k=0;k<v.size();k++){ if(k==v.size()-1) { if(ans < v[k]) ans=v[k]; continue; } if(v[k]==v[k+1]) { v[k] += v[k+1]; if(ans < v[k]) ans = v[k]; v[k+1] = 0; } } for(int k=0,l=N-1;k<v.size();k++){ if(v[k] !=0){ tt[r][l--] = v[k]; } } } q.push(tt); //left tt.clear(); tt.resize(N*N); for(int r=0;r<N;r++){ for(int rr=0;rr<N;rr++) for(int cc=0;cc<N;cc++) tt[rr].push_back(0); vector<int> v; v.resize(N); for(int c=0;c<N;c++) if(t[r][c] !=0) v.push_back(t[r][c]); for(int k=0;k<v.size();k++){ if(k==v.size()-1) { if(ans < v[k]) ans=v[k]; continue; } if(v[k]==v[k+1]) { v[k] += v[k+1]; if(ans < v[k]) ans = v[k]; v[k+1] = 0; } } for(int k=0,l=0;k<v.size();k++){ if(v[k] !=0){ tt[r][l++] = v[k]; } } } q.push(tt); //up tt.clear(); tt.resize(N*N); for(int c=0;c<N;c++){ for(int rr=0;rr<N;rr++) for(int cc=0;cc<N;cc++) tt[rr].push_back(0); vector<int> v; v.resize(N); for(int r=0;r<N;r++) if(t[r][c] !=0) v.push_back(t[r][c]); for(int k=0;k<v.size();k++){ if(k==v.size()-1) { if(ans < v[k]) ans=v[k]; continue; } if(v[k]==v[k+1]) { v[k] += v[k+1]; if(ans < v[k]) ans = v[k]; v[k+1] = 0; } } for(int k=0,l=0;k<v.size();k++){ if(v[k] !=0){ tt[l++][c] = v[k]; } } } q.push(tt); //down tt.clear(); tt.resize(N*N); for(int c=0;c<N;c++){ for(int rr=0;rr<N;rr++) for(int cc=0;cc<N;cc++) tt[rr].push_back(0); vector<int> v; v.resize(N); for(int r=N-1;r>=0;r--) if(t[r][c] !=0) v.push_back(t[r][c]); for(int k=0;k<v.size();k++){ if(k==v.size()-1) { if(ans < v[k]) ans=v[k]; continue; } if(v[k]==v[k+1]) { v[k] += v[k+1]; if(ans < v[k]) ans = v[k]; v[k+1] = 0; } } for(int k=0,l=N-1;k<v.size();k++){ if(v[k] !=0){ tt[l--][c] = v[k]; } } } q.push(tt); } cnt++; if(cnt>5) break; } printf("%d\n",ans); } | cs |
'알고리즘 > 백준 알고리즘' 카테고리의 다른 글
BOJ : 5567 결혼식 (0) | 2017.04.28 |
---|---|
BOJ : 13458 시험감독 (0) | 2017.04.28 |
BOJ : 13459 째로탈출 (2) | 2017.04.28 |
BOJ : 1261 알고스팟 (2) | 2017.04.28 |
BOJ : 1074 Z (2) | 2017.04.28 |