[코딩테스트][백준] 🔥 백준 14719번 "빗물" 문제: Python과 Java로 완벽 해결하기! 🔥

김상욱·2024년 7월 14일
0
post-thumbnail

🔗 문제 링크

https://www.acmicpc.net/problem/14719

🕒 Python 풀이시간: 12분

h,w=map(int,input().split())

block=list(map(int,input().split()))
board=[[0]*w for _ in range(h)]
for i in range(h):
    for j in range(w):
        if i>=h-block[j]:
            board[i][j]=1

# for i in range(h):
#     print(board[i])

answer=0
for i in range(h-1,-1,-1):
    for j in range(w-1,-1,-1):
        if board[i][j]==1:
            continue
        else:
            left_have_wall=False
            right_have_wall=False
            ny=j
            while not left_have_wall and 0<=ny<w:
                if board[i][ny]==1:
                    left_have_wall=True
                    break
                ny-=1
            ny=j
            while not right_have_wall and 0<=ny<w:
                if board[i][ny]==1:
                    right_have_wall=True
                    break
                ny+=1
            if left_have_wall and right_have_wall:
                # print(i,j)
                answer+=1
print(answer)

🕒 Java 풀이시간: 15분

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

// The main method must be in a class named "Main".
class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int h=sc.nextInt();
        int w=sc.nextInt();
        int[] block=new int[w];
        int[][] board=new int[h][w];
        for(int i=0;i<w;i++){
            block[i]=sc.nextInt();
        }
        for(int i=0;i<h;i++){
            for(int j=0;j<w;j++){
                if(i>=h-block[j]){
                    board[i][j]=1;
                }
            }
        }
        int answer=0;
        for(int i=h-1;i>-1;i--){
            for(int j=w-1;j>-1;j--){
                if(board[i][j]==1){
                    continue;
                }else{
                    boolean left_have_wall=false;
                    boolean right_have_wall=false;
                    int ny=j;
                    while(!left_have_wall && 0<=ny && ny<w){
                        if(board[i][ny]==1){
                            left_have_wall=true;
                            break;
                        }
                        ny--;
                    }
                    ny=j;
                    while(!right_have_wall&&0<=ny&&ny<w){
                        if(board[i][ny]==1){
                            right_have_wall=true;
                            break;
                        }
                        ny++;
                    }
                    if(left_have_wall&&right_have_wall){
                        answer++;
                    }
                }
            }
        }
        System.out.println(answer);
    }
}

🧩 주어진 형태를 2차원 시뮬레이션으로 만들기!

이 문제는 주어진 구간안에서 빗물이 얼만큼 쌓였는지를 요구합니다. 각 영역이 1x1의 형태로 이루어진 2차원 배열의 형태이기 때문에 시뮬레이션 유형으로 접근 가능합니다.

🔄 완전 탐색을 활용하여 각 지점을 탐색하기!

이중 반복문을 통해 낮은 지점에서부터 완전탐색을 진행하여 각 지점의 빗물이 고일 수 있는지 여부를 판단합니다.

✅ 빗물이 고일 수 있는 지점인지 확인!

각 지점에서 왼쪽과 오른쪽으로 배열 범위내에서 진행하여 벽이 있는지 확인함으로써 빗물이 고일 수 있는지를 확인할 수 있습니다. 이 경우에서는 while문을 활용한 탐색으로 간단하게 벽을 탐색할 수 있으며 조건문을 통해 벽인지 또는 범위를 벗어났는지를 확인할 수 있습니다.

🔍 최종적인 결론: 완전탐색으로 이루어진 시뮬레이션

해당 지점의 확인부터 벽이 있는지 확인까지 반복문으로 진행한 후 양쪽 지점에 벽이 있으면 해당 지점에 빗물이 고일 수 있으므로 정답에 추가해주는 방법을 통해 빗물이 고이는 상황을 시뮬레이션화 해서 코드화 할 수 있습니다.

이렇게 Python과 Java로 프로그래머스의 할인 행사 문제를 해결해보았습니다. 코드와 개념 설명을 참고하여 문제를 해결하는 데 도움이 되셨길 바랍니다! 😊

0개의 댓글