최고를 향해 최선을 다하자
[SWEA] 2117. 홈 방범 서비스 본문
안녕? 나는 응애개발자
오늘은 SWEA의 2117번 문제를 풀었다.
사실 나는 디버그 할 때마다 로직 수정보다는 인덱스에서 시간을 참 많이 소모해버리는데...
오늘은 시간을 별로 안 써서 행복했다.
딱히 어려운 문제는 아니었지만 풀면서 'for문이 이렇게 들어가 버린다고? 이거 맞긴 해?' 하면서 풀었는데 맞다.
SWEA은 엥스러운 문제를 잘 내는 것 같다.
각설, 코드 리뷰 가자
#include <iostream>
#include <math.h>
using namespace std;
int N,M;
int map[20][20];
int ans = 0;
//현재 좌표가 맵 범위 밖이면 false, 안이면 true를 리턴한다
bool check(int y, int x){
if((y>=0) && (x>=0) && (x<N) && (y<N))
return true;
return false;
}
//운영 비용 = K * K + (K - 1) * (K - 1)을 계산하여 리턴하는 함수
int cost(int k){
int s = 0;
s += (k*k) + ((k-1)*(k-1));
return s;
}
//초기화 함수
void init_(){
ans = 0;
for(int i=0; i<N; i++)
for(int j=0; j<N; j++)
map[i][j] = 0;
}
void sol(){
//마름모의 범위당
for(int k=1; k<=N+1; k++){
//N*N범위를 체크하면서
for(int i=0; i<N; i++){
for(int j=0; j<N; j++){
int sum = 0;
//해당좌표로부터 K범위확인
for(int m=i-(k-1); m<=i+(k-1); m++){
for(int n=j-(k-1); n<=j+(k-1); n++){
//마름모 범위 안에 없다면
if((abs(i-m) + abs(j-n)) > (k-1))
continue;
//마름모 범위 안에 있으면서 집이 있다면
if(check(m,n) && map[m][n]!=0)
sum++;
}
}
//모든 범위 확인후 total에 저장
if((M * sum - cost(k)) >= 0 && sum > ans)
ans = sum;
}
}
}
}
int main(int argc, char** argv){
int test_case;
cin>>test_case;
for(int T=1; T<=test_case; T++){
cin>>N>>M;
for(int i=0; i<N; i++){
for(int j=0; j<N; j++){
cin>>map[i][j];
}
}
sol();
cout<<"#"<<T<<" "<<ans<<endl;
init_();
}
return 0;
}
나는 개인적으로 필요한 기능을 함수로 구현하여 필요할 때마다 갖다 사용하는 것을 즐긴다.
귀찮으신 분들은 그냥 코딩하셔도 된다!
안녕!
'SWEA' 카테고리의 다른 글
[SWEA] 2382. 미생물 격리 (0) | 2020.06.06 |
---|---|
[SWEA] 2105. 디저트 카페 (0) | 2020.06.06 |
[SWEA] 4013. 특이한 자석 (0) | 2020.06.05 |
Comments