[JAVA] 백준 10711번: 모래성

2024. 6. 15. 16:46·problem solving/백준

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

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

 

 

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

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

 

 

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

저 이 문제 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로 다시 풀었을 뿐..!

  • 백준 코드 보기 : https://www.acmicpc.net/source/79638394
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};

 

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

 

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

저작자표시 비영리 변경금지 (새창열림)
'problem solving/백준' 카테고리의 다른 글
  • [C++] 백준 22255번 : 호석사우루스
  • [C++] 백준 1987번 : 알파벳
  • [C++] 백준 1004번 : 어린 왕자
  • [C++] 백준 1661번 : 다솜이의 신발 가게
u1qns
u1qns
http://github.com/u1qns
  • u1qns
    개발 블로그
    u1qns
  • 전체
    오늘
    어제
    • 분류 전체보기 (173) N
      • 회고 (1)
      • programming (17)
        • 개념 정리 (6)
        • CI CD (1)
        • 트러블 슈팅 (0)
        • 환경설정 및 팁 (7)
      • problem solving (155) N
        • 개념 정리 (3)
        • 백준 (129) N
        • SWEA (15)
        • 프로그래머스 (4)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    완전탐색
    DP
    SSAFY수료식
    POW
    HELLOSSAFY
    cpp
    구현
    미해결
    BFS
    백준
    boj
    투포인터
    되추적
    그리디
    SSAFY
    DFS
    cmath
    C++
    삼성청년SW아카데미
    SWEA
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
u1qns
[JAVA] 백준 10711번: 모래성
상단으로

티스토리툴바