-
안전지대코딩 테스트/Level 0 2022. 11. 8. 15:39반응형
https://school.programmers.co.kr/learn/courses/30/lessons/120866
파이썬
board와 같은 크기의 check 라는 2차원 리스트를 만들었다.
def solution(board): check = [[1 for _ in board[0]] for _ in board] for y in range(len(board)): for x in range(len(board[0])): if board[y][x]: for yy in range(y - 1, y + 2): for xx in range(x - 1, x + 2): if 0 <= xx < len(board[0]) and 0 <= yy < len(board): check[yy][xx] = 0 return sum(sum(each) for each in check)
위 코드가 다중 for문 치고는 단순한 구조라 읽기 어렵진 않지만,
itertools.product 를 이용해도 좋다.from itertools import product def solution(board): check = [[1 for _ in board[0]] for _ in board] for y, x in product(range(len(board)), repeat=2): if board[y][x]: for yy, xx in product(range(y - 1, y + 2), range(x - 1, x + 2)): if 0 <= xx < len(board[0]) and 0 <= yy < len(board): check[yy][xx] = 0 return sum(sum(each) for each in check)
개인적으로는 함수당 하나의 기능을 가진 다음과 같은 구조를 선호한다.
from itertools import product def solution(board): def check_danger(y, x): for yy, xx in product(range(y - 1, y + 2), range(x - 1, x + 2)): if 0 <= xx < len(board[0]) and 0 <= yy < len(board): check[yy][xx] = 0 def solve(): for y, x in product(range(len(board)), repeat=2): if board[y][x]: check_danger(y, x) return sum(sum(each) for each in check) check = [[1 for _ in board[0]] for _ in board] return solve()
함수 내 함수 구조
는 객체 지향에서의 프라이빗(private)과 비슷한 느낌도 있다.외부에서는 check라는 리스트에 접근할 수 없지만
내부의 check_danger 함수와 solve함수는 이를 자유롭게 접근할 수 있다.코틀린
class Solution { fun solution(board: Array<IntArray>): Int { var answer = 0 for (i in board.indices) for (j in board[0].indices) if (board[i][j] == 1) for (k in i - 1..i + 1) for (l in j - 1..j + 1) if (k in board.indices && l in board[0].indices && board[k][l] == 0) board[k][l] = 2 for (i in board.indices) for (j in board[0].indices) if (board[i][j] == 0) answer++ return answer } }
반응형