https://www.acmicpc.net/problem/14719
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)
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);
}
}
이 문제는 주어진 구간안에서 빗물이 얼만큼 쌓였는지를 요구합니다. 각 영역이 1x1의 형태로 이루어진 2차원 배열의 형태이기 때문에 시뮬레이션 유형으로 접근 가능합니다.
이중 반복문을 통해 낮은 지점에서부터 완전탐색을 진행하여 각 지점의 빗물이 고일 수 있는지 여부를 판단합니다.
각 지점에서 왼쪽과 오른쪽으로 배열 범위내에서 진행하여 벽이 있는지 확인함으로써 빗물이 고일 수 있는지를 확인할 수 있습니다. 이 경우에서는 while문을 활용한 탐색으로 간단하게 벽을 탐색할 수 있으며 조건문을 통해 벽인지 또는 범위를 벗어났는지를 확인할 수 있습니다.
해당 지점의 확인부터 벽이 있는지 확인까지 반복문으로 진행한 후 양쪽 지점에 벽이 있으면 해당 지점에 빗물이 고일 수 있으므로 정답에 추가해주는 방법을 통해 빗물이 고이는 상황을 시뮬레이션화 해서 코드화 할 수 있습니다.
이렇게 Python과 Java로 프로그래머스의 할인 행사 문제를 해결해보았습니다. 코드와 개념 설명을 참고하여 문제를 해결하는 데 도움이 되셨길 바랍니다! 😊