별 찍기 문제와 매우 유사하다.
마름모 안에 들어있는 값을 모두 더해서 출력하면 되는 문제인데,
예를 들어 7 X 7 의 형태의 맵이 주어졌다고 가정하자.
[데칼코마니 : 상&하 같은 모양 ] 규칙 찾기
(3칸띄우고) map[0][3] ( 공백 : 3개 , 더할 값 : 1개 )
(2칸띄우고) map[1][2]~map[1][4] (공백 : 2개, 더할 값 : 2개)
(1칸띄우고) map[2][1]~map[2][5] (공백 : 1개, 더할 값 : 3개)
--------------------------------기준선-------------------------------------------
(0칸띄우고) map[3][0]~map[3][6] (공백 : 0개 , 더할 값 : 5개)
--------------------------------기준선-------------------------------------------
(1칸띄우고) map[4][1]~map[4][5] (공백 : 1개, 더할 값 : 3개)
(2칸띄우고) map[5][2]~map[5][4] (공백 : 2개, 더할 값 : 2개)
(3칸띄우고) map[6][3] ( 공백 : 3개 , 더할 값 : 1개 )
#접근 방법
1. 시작행과 끝행을 가리키는 down(아래방향으로 가는 행), up(윗방향으로 가는 행) 변수 생성하고 동시에 탐색
2. up 과 down이 교차하기 전까지 sum 변수에 값 더하기. (해당 행의 index 부터 rowSize크기만큼) *최초 index = sz/2+1
- 공백의 크기(index : 해당 행의 더할 데이터의 시작 위치를 의미) 는 하나씩 작아진다. (index--)
- 더할 데이터의 크기는 2개씩 커진다. (rowSize+=2)
- down ++ , up-- 갱신
3. up과 down 이 가리키는 행이 같다면 마지막으로 그 행의 데이터값을 다 더해주고 출력
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Solution {
static int [][] map;
static int down, up, rowSize, index, sum;
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int testCase = Integer.parseInt(br.readLine());
for(int x=1; x <= testCase; x++ ) {
int sz = Integer.parseInt(br.readLine());
map = new int[sz+1][sz+1];
for(int i=1; i<=sz; i++) {
String s= br.readLine();
for(int j=0; j<sz; j++) {
map[i][j+1] = s.charAt(j)-'0';
}
}
sum=0;
rowSize = down =1;
up = sz;
index = sz/2+1;
while(up>down) {
for(int i= index ; i<index + rowSize; i++) {
sum+=map[down][i];
sum+=map[up][i];
}
down++; up--; index--; rowSize+=2;
}
for(int i=1; i<=sz; i++) sum+=map[up][i];
System.out.printf("#%d %d%n", x, sum);
}
}
}
댓글