problem solving/백준

[JAVA] 백준 10711번: 모래성

u1qns 2024. 6. 15. 16:46

사실 이 문제 예전에 풀었던 문제입니다.

처음 풀 때는 시간 초과 때문에 인터넷의 도움을 받았던 기억이 생생합니다.

 

 

그래도 예전에 푼 문제를 다시 풀 때는 언제나 긴장됩니다.

과연 성장했는가, 제자리인가 .. 

 

 

솔직 고백하자면  뿌듯해서 올리는 풀이글입니다.

저 이 문제 JAVA 기준 1등이에요 ✌🏻🎶💖

나보다 나은 사람 코드 훔쳐보려고 등수봤는데 감격해서 굳이 굳이 씁니다. 

 


풀이 (C++)

https://viin.tistory.com/152

 

[C++] 백준 10711번: 모래성

🔗 문제 10711번: 모래성 10711번: 모래성 첫째 줄에는 모래성의 가로세로 격자 크기 H, W가 주어진다. (1 ≤ H, W ≤ 1,000) 그 다음 H줄에 걸쳐 W개의 문자로 모래성의 상태를 나타내는 문자가 들어온다

viin.tistory.com

 

 

접근법은 기존과 똑같습니다. 단지 요즘은 Java를 공부 중이니 Java로 다시 풀었을 뿐..!

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

public class Main {

    public static void main(String[] args) throws IOException {

        final int[] dx = {1, 1, 1, 0, 0, -1, -1, -1};
        final int[] dy = {-1, 0, 1, -1, 1, -1, 0, 1};

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int H = Integer.parseInt(st.nextToken());
        int W = Integer.parseInt(st.nextToken());

        int[][] grid = new int[H][W];
        Queue<int[]> q = new ArrayDeque<>();
        for(int i=0; i<H; ++i)
        {
            String line = br.readLine();
            for(int j=0; j<W; ++j)
            {
                char ch = line.charAt(j);
                if (ch == '.') q.offer(new int[]{i, j});
                else grid[i][j] = Character.getNumericValue(ch);
            }
        }

        int answer = 0;
        int[] front;
        while(!q.isEmpty())
        {
            int qSize = q.size();
            while(qSize-- > 0)
            {
                front = q.poll();

                for(int d=0; d<8; ++d)
                {
                    int x = front[0] + dx[d];
                    int y = front[1] + dy[d];

                    if((x<0 || y<0 || x>=H || y>=W)|| grid[x][y] == 0) continue;
                    if(--grid[x][y] == 0)
                        q.offer(new int[]{x, y});
                }
            }
            ++answer;
        }

        System.out.print(answer-1);
    }
}

 

 

시간을 줄이기 위해 나름 신경 썼던 부분

 

# 사용되는 부분이 많이 중복되지 않는다면 그냥 코드에 작성한다. 

예를 들어격자를 벗어나는걸 확인하는 메서드가 있습니다. 

그런데 이 메서드는 호출횟수가 굉장히 많고 사실상 if문 한줄만 가져오면 되므로 이번에는 굳이 함수로 작성하지 않았습니다. 

bool isValid(const int x, const int y)
{
    if(x<0 || x>=W || y<0 || y>=H)
        return false;

    return true;
}

 

 

# 필수가 아니라면 전역 변수를 지역 변수로 호출한다. 

평균적으로 전역이 접근할 때 시간이 더 걸리니 되도록이면 지역 변수를 사용했습니다. 

이번 문제에서는 위치를 방향을 저장하는 방향 배열도 지역으로 변경했습니다. 

const int dx[8] = {0, 0, 1, -1, -1, 1, 1, -1};
const int dy[8] = {1, -1, 0, 0, 1, -1, 1, -1};

 

+ 이래저래 필요없을 것 같은 변수들은 정리했습니다. 

 

-태희쌤 💙 이 수업 도중에 지나가듯이 말씀해주신 것인데 도움이 된 것 같아서 나중에 나를 위해서 작성-