출처 : HackerRank - 3D Surface Area
문제
요약
1 x 1 x 1 크기의 블록으로 구성된 3D 입체의 겉 면적을 구하여라.
입력형식
첫줄은 3D 입체물이 놓여질 판의 크기를 2개의 숫자로 제공합니다.
다음줄에는 빈칸으로 구별한 숫자를 제공하는데, 이 숫자는 해당 좌표에 있는 블록의 높이를 의미합니다.
제약사항
1 ≤ H, W ≤ 100
1 ≤ A_i,j ≤ 100
출력형식
물체의 겉면적을 숫자로 화면에 출력합니다.
풀이
1 x 1 x 1 블록으로 구성된 입체물이므로 겉 면적은 6방향에서 제공됩니다. 위, 아래의 면적은 해당 위치에 블록이 쌓여 있을 경우는 1 없을 경우는 0으로 판단 할 수 있습니다. 측면의 면적은 옆에 쌓여진 블록과의 높이가 차이가 날 경우, 그 차이만큼이 면적으로 더해진다는 것을 관찰 할 수 있습니다.
surfaceArea 함수부분을 작성하였습니다.
#include <bits/stdc++.h>
using namespace std;
vector<string> split_string(string);
// Complete the surfaceArea function below.
int surfaceArea(vector<vector<int>> A) {
int S = 0, up, down, left, right;
for (int i=0;i<A.size();i++) {
for (int j=0;j<A[i].size();j++) {
// 윗면, 아랫면
if (A[i][j] !=0)
S += 2;
// 가장자리
if (i == 0) {
up = 0;
} else {
up = A[i-1][j];
}
if (j == 0) {
left = 0;
} else {
left = A[i][j-1];
}
if (i == A.size()-1) {
down = 0;
} else {
down = A[i+1][j];
}
if (j == A[i].size()-1) {
right = 0;
} else {
right = A[i][j+1];
}
if (A[i][j]>up) {
S += (A[i][j] - up);
}
if (A[i][j]>down) {
S += (A[i][j] - down);
}
if (A[i][j]>left) {
S += (A[i][j] - left);
}
if (A[i][j]>right) {
S += (A[i][j] - right);
}
}
}
return S;
}
int main()
{
ofstream fout(getenv("OUTPUT_PATH"));
string HW_temp;
getline(cin, HW_temp);
vector<string> HW = split_string(HW_temp);
int H = stoi(HW[0]);
int W = stoi(HW[1]);
vector<vector<int>> A(H);
for (int i = 0; i < H; i++) {
A[i].resize(W);
for (int j = 0; j < W; j++) {
cin >> A[i][j];
}
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
int result = surfaceArea(A);
fout << result << "\n";
fout.close();
return 0;
}
vector<string> split_string(string input_string) {
string::iterator new_end = unique(input_string.begin(), input_string.end(), [] (const char &x, const char &y) {
return x == y and x == ' ';
});
input_string.erase(new_end, input_string.end());
while (input_string[input_string.length() - 1] == ' ') {
input_string.pop_back();
}
vector<string> splits;
char delimiter = ' ';
size_t i = 0;
size_t pos = input_string.find(delimiter);
while (pos != string::npos) {
splits.push_back(input_string.substr(i, pos - i));
i = pos + 1;
pos = input_string.find(delimiter, i);
}
splits.push_back(input_string.substr(i, min(pos, input_string.length()) - i + 1));
return splits;
}
'알고리즘 트레이닝 > Hackers Rank' 카테고리의 다른 글
Strong Password (0) | 2019.10.09 |
---|---|
Maximum Element (0) | 2019.10.09 |
HackerRank - The Bomberman Game (0) | 2018.06.16 |
HackerRank - Halloween Sale (0) | 2018.06.12 |