{{{~cpp # 3h 2m 51s class MineGround: def __init__(self, aRowSize, aColSize, aInfo ): self.ground = list() self.rowSize = aRowSize self.colSize = aColSize for row in range( aRowSize ): self.ground.append( [None] * aColSize ) for row in range( aRowSize ): for col in range( aColSize ): self.ground[row][col] = Room( aInfo[row][col] ) def getZone( self, aRow, aCol ): if aRow < 0 or aRow >= self.rowSize or\ aCol < 0 or aCol >= self.colSize: return Room.safyZone() return self.ground[aRow][aCol] class Room: def __init__(self, aKind): self.kind = aKind def equals( self, aRoom ): return self.kind is aRoom.kind def mine(): # static method return Room("*") mine = staticmethod( mine ) def safyZone(): # static method return Room(".") safyZone = staticmethod( safyZone ) class MineSweeper: def __init__(self, aGround): self.ground = aGround self.direction =\ ( (-1,-1), (-1,0), (-1,1),\ (0,-1), (0, 1),\ (1,-1), (1,0), (1,1)) def computeMineCount( self, aRow, aCol ): count = 0 for d in self.direction: if Room.mine().equals(self.ground.getZone( aRow + d[0], aCol + d[1])): count = count + 1 return count def sweep( self ): result = [""] * self.ground.rowSize for row in range( self.ground.rowSize ): for col in range ( self.ground.colSize ): if Room.safyZone().equals( self.ground.getZone(row,col) ): result[row] = result[row] + str( self.computeMineCount(row, col) ) else: result[row] = result[row] + "*" return result def run(): rowSize = input() colSize = input() info = [""] * rowSize for i in range(rowSize): info[i] = input() afterSweep = MineSweeper( MineGround(rowSize, colSize, info) ).sweep() for line in afterSweep: print line run = staticmethod(run) ######################################################################### import unittest class MineSweeperTestCase(unittest.TestCase): def test3x5example(self): info = ["**...",\ ".....",\ ".*..."] sweeper = MineSweeper(MineGround(3,5, info)) expected = ["**100",\ "33200",\ "1*100"] self.assertEquals( expected, sweeper.sweep() ) def testComputeMineCount(self): sweeper = MineSweeper(MineGround(1,1, ["."])) self.assertEquals( 0, sweeper.computeMineCount(0,0) ) sweeper = MineSweeper(MineGround(1,2, ["*."])) self.assertEquals( 1, sweeper.computeMineCount(0,1) ) self.assertEquals( 0, sweeper.computeMineCount(0,0) ) class MineGroundTestCase(unittest.TestCase): def testGetZone(self): ground = MineGround(1,1, ["*"]) self.failUnless( Room.mine().equals( ground.getZone(0,0) ) ) ground = MineGround(1,1, ["."]) self.failUnless( Room.safyZone().equals( ground.getZone(0,0) ) ) self.failUnless( Room.safyZone().equals( ground.getZone(-1,0) )) ######################################################################### if __name__ == '__main__': ## unittest.main() MineSweeper.run() }}} == Thread == 작은 단계를 밟아가면서 TDD를 적용하다 보니까 시간이 많이 걸렸다. 게다가 모르는 파이선 문법 찾는데도 시간이 걸렸다. 파이선의 새로운 기능을 알게 되어 신기하다. 다음 문제를 풀어볼까나. --[Leonardong] ---- [MineSweeper], [AOI]