코테

[소프티어] 나무 공격 Java

leeds123 2024. 11. 2. 18:00

Softeer 소프티어

Lv2. 나무 공격

해당 문제를 풀이한 뒤, 다른 풀이와 비교하였습니다.

저와 같은 풀이는 보이지않아 정리 글을 작성해봅니다!

 

[문제]

https://softeer.ai/practice/9657

 

Softeer - 현대자동차그룹 SW인재확보플랫폼

 

softeer.ai

 

[문제 설명]

n*m 크기의 격자에서 2번 공격(고정)을 한다.

첫 번째 열부터 마지막 열까지 투사체를 날려 공격을 진행한다.

투사체와 환경 파괴범이 만난다면 서로 사라진다.

공격되는 행의 범위는 주어진다.

 

[결과값]

2번 공격 이후, 남아 있는 환경 파괴범 수.

 

[접근 방법] 

2번 공격(고정) 이니 가장 바깥 쪽 for문으로 2번 반복할 것이다.

for (int attack = 0; attack < 2; attack++) {

공격되는 행의 범위가 주어졌으니, 이 범위에 따른 for문을 반복하자.

            for (int i = L[attack]; i < R[attack]+1; i++) {

또 모든 열을 거쳐야하니, 모든 열을 거치는 for문을 반복하자.

                for (int j = 0; j < m+1; j++) {

이렇게 되면 3중 for문이 나와 시간 오류를 걱정되지만 일단 해보고보자.

 

이제 공격받아 사라지는 환경 파괴범을 처리해주어야한다.

나는 여기에서 환경 파괴범이 발견되면 0으로 변경해 주고 for문을 빠져 나오는 코드를 작성했다.

0으로 변경해주어야 다음 공격때 중복되지 않으며, 0으로 변경하고 굳이 for문을 더 진행할 이유가 없었다.

이미 공격이 끝나 투사체가 사라졌기 때문.

            if (arr[i][j] == 1) {
                        arr[i][j] = 0;
                        break;

 

2차원 배열에 남은 환경 파괴범 수를 카운트하고 출력했다.

 

[코드]

import java.io.*;
import java.util.*;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        int[] L = new int[2];
        int[] R = new int[2];
        int ans = 0;
        // n 행 부터 m 행까지. 각 행마다 sum 값 -1 하기 (>0이라면.) -> 이걸 2번.
        int[][] arr = new int[n][m];
        for (int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < m; j++) {
                arr[i][j] = Integer.parseInt(st.nextToken());
            }
        }
        for (int i = 0; i < 2; i++) {
            st = new StringTokenizer(br.readLine());
            L[i] = Integer.parseInt(st.nextToken())-1;
            R[i] = Integer.parseInt(st.nextToken())-1;
        }
        // 공격 2번
        for (int attack = 0; attack < 2; attack++) {
            // n행부터 m행까지
            for (int i = L[attack]; i < R[attack]+1; i++) {
                for (int j = 0; j < m; j++) {
                    if (arr[i][j] == 1) {
                        arr[i][j] = 0;
                        break;
                    }
                }
            }
        }

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (arr[i][j] > 0) {
                    ans += arr[i][j];
                }
            }
        }
        System.out.println(ans);
    }
}

 

[결과]

3중 for문으로 시간 초과가 우려됐지만, 성공했다!

 

 

 

'코테' 카테고리의 다른 글

2차원 배열의 회전 - Python  (0) 2024.02.28