✔문제링크
요약하자면 위와 같은 2차원 배열이 주어지고 공격 및 회복이 이루어지는데 배열 안의 값이 음수가 되면 파괴되고 최종 return 파괴되지 않은 배열의 개수를 구하면 된다.
▪ 2차원 배열을 하나의 리스트로 보고 하나의 리스트시작마다 공격,회복 분기
▪ 스킬의 공격데미지, 회복량 선언 및 초기화
▪ 주어진 조건속 skill 열의 길이는 6개 이므로 인덱스 1,2 / 3,4 가 공격,회복 범위
▪ 해당 구간만큼 다시 for문을 돌며 board 2차원 배열에 선언한 공격데미지,회복량 넘겨주기
class Solution {
public int solution(int[][] board, int[][] skill) {
int answer = 0;
//board는 판, skill은 공격(type:1),회복(type:2)
int skillDegree = 0;
int count = 0;
//스킬의 갯수 만큼 날릴건데
for(int x=0; x<skill.length; x++ ){
//공격,회복을
skillDegree = skill[x][5];
//보드판을 돌아다니면서
for(int i=0; i<board.length; i++){
for(int j=0; j<board[i].length; j++){
//스킬의 범위 안에 있다면
if(i>=skill[count][1] && i<=skill[count][3]){
if(j>=skill[count][2] && j<=skill[count][4]){
//공격,회복을 나눈후
if(skill[count][0] == 1){
board[i][j] -= skillDegree;
}else{
board[i][j] += skillDegree;
}
}
}
}
}
count++;
}
for(int x=0; x<board.length; x++){
for(int y=0; y<board[x].length; y++){
//System.out.println(board[x][y]);
if(board[x][y] > 0){
answer += 1;
}
}
}
return answer;
}
}
이중 for문을 돌면서 스킬의 범위를 조건거는 부분에서 계속 한두개씩 칸이 이상하게 돌길래
테스트값중에 들어오는 [1, 1, 1, 2, 2, 4], [1, 0, 0, 1, 1, 2] 에서 예를 들어 [1, 1, 1, 2, 2, 4], [1, 0, 0, 1, 1, 2] 일경우
array[1][1] ~ array[2][2] , array[0][0] ~ array[1][1]
이런식으로 바로 다음에 들어오는 값으로 작성해버렸다.
물론 이론상으로는 저 말이 맞지만 실제로 코드로 작성할때는 범위를 행,열의 쌍이 아닌(행,열의 쌍이면 그냥 한줄씩만 해당되므로 1x1이 되버린다) 행~행, 열~열 의 범위(NxN)로 정해야 했다.
디버깅도 안되서 sysout으로 하나씩 어디가 잘못된지 찾은 비하인드🤬가 있었다,,ㅎㅎ
엥,,,ㅎ😨 정확성 테스트는 모두 통과했는데 효율성 테스트에서 모두 통과하지 못했다..
시간 초과인 것을 봐서 아무래도 이중 반복문을 사용해 영향을 받지 않은 보드까지
모두 검사하다 보니 10 x10의 경우만 하더라도 100번을 수행해야 하기 때문에 timeout이 된 것 같다.
이중 반복문 안에서 조건문을 돌리는 게 아니라 먼저 조건을 수행 후 for문을 도는 구조로 바꿔보아야 할 것 같다..🙄