classMeteor:def__init__(self,pic:list[list[str]]):self.pic=picself.r,self.c=len(pic),len(pic[0])self.surface=[None]*sself.grounds=set()self.fall_dist=0foriinrange(self.r-1,-1,-1):forjinrange(self.c):ifself.surface[j]isNoneandself.pic[i][j]=="X":self.surface[j]=iself.pic[i][j]="."elifpic[i][j]=="#":self.grounds.add((i,j))deffall(self)->bool:"""
유성을 한 픽셀 아래로 떨어뜨리고,
만약 떨어뜨릴 수 없다면 False를 반환합니다.
"""new_surface=self.surface.copy()forj,iinenumerate(self.surface):ifiisNone:continueif(i+1,j)inself.grounds:returnFalsenew_surface[j]=i+1self.surface=new_surfaceself.fall_dist+=1returnTruedefprint(self)->None:foriinrange(self.r-1,-1,-1):forjinrange(self.c):ifself.pic[i][j]=="X":self.pic[i+self.fall_dist][j]="X"self.pic[i][j]="."forj,iinenumerate(self.surface):ifiisNone:continueself.pic[i][j]="X"forrowinself.pic:print(*row,sep="")r,s=map(int,input().split())meteor=Meteor([list(input())for_inrange(r)])whilemeteor.fall():...meteor.print()