백준 / 골드 5 / 상어 초등학교 / Python [구현, 완전탐색]

jjin·2023년 10월 18일
0

했던 실수들

jari[i-1][j+1]은 대각이지.. 상하좌우를 봐야하는데
j 써야하는 부분에 i 두 번 썼는지, 
-1 써야하는 부분에 +1을 두 번 썼는지 검토할 것.

느낀점

디버깅에는 모듈화가 정말 중요하다

통과

import sys
input = sys.stdin.readline

N = int(input())
N2 = N**2

jari = [[0] * (N) for _ in range(N)]
    
def computePl(i, j, likes):
    def islike(i, j):
        if i < 0 or j < 0 or i >= N or j >= N:
            return 0
        if jari[i][j] in likes:
            return 1
        return 0
        
    return islike(i-1, j) + islike(i+1, j) + islike(i, j-1) + islike(i, j+1)

def computePv(i, j):
    def isvacant(i, j):
        if i < 0 or j < 0 or i >= N or j >= N:
            return 0
        if jari[i][j] == 0:
            return 1
        return 0
    
    return isvacant(i-1, j) + isvacant(i+1, j) + isvacant(i, j-1) + isvacant(i, j+1)


def locateOne(one, likes):
    pl = [[0] * N for _ in range(N)]
    maxpl = 0
    pv = [[0] * N for _ in range(N)]
    maxpv = 0
    
    st1 = []
    
    for i in range(N):
        for j in range(N):
            if jari[i][j] == 0:
                pl[i][j] = computePl(i, j, likes)
                if maxpl < pl[i][j]:
                    maxpl = pl[i][j]
                    st1 = [(i, j)]
                elif maxpl == pl[i][j]:
                    st1.append((i, j))
    st2 = []
    while st1:
        i, j = st1.pop()
        pv[i][j] = computePv(i, j)
        if maxpv < pv[i][j]:
            maxpv = pv[i][j]
            st2 = [(i, j)]
        elif maxpv == pv[i][j]:
            st2.append((i, j))
    
    st2.sort()
    i, j = st2[0]
    jari[i][j] = one
    
inputs = dict()
score = 0    

for _ in range(N2):
    one, l1, l2, l3, l4 = map(int, input().split())
    l = [l1, l2, l3, l4]
    locateOne(one, l)
    inputs[one] = l

for i in range(N):
    for j in range(N):
        finalPl = computePl(i, j, inputs[jari[i][j]])
        # print(jari[i][j], inputs[jari[i][j]], finalPl)
        score += (0 if finalPl == 0 else 10**(finalPl - 1))
        
print(score)

초기 코드

import sys
input = sys.stdin.readline

N = int(input())
N2 = N**2

jari = [[0] * (N) for _ in range(N)]
    
def computePl(i, j, likes):
    def islike(i, j):
        if i == 0 or j == 0 or i == N or j == N:
            return 0
        if jari[i][j] in likes:
            return 1
        return 0
        
    return islike(i-1, j-1) + islike(i+1, j-1) + islike(i-1, j+1) + islike(i+1, j+1)

def computePv(i, j):
    def isvacant(i, j):
        if i == 0 or j == 0 or i == N or j == N:
            return 0
        if jari[i][j] == 0:
            return 1
        return 0
    
    return isvacant(i-1, j-1) + isvacant(i+1, j-1) + isvacant(i-1, j+1) + isvacant(i+1, j+1)


def locateOne(one, likes):
    pl = [[0] * N for _ in range(N)]
    maxpl = 0
    pv = [[0] * N for _ in range(N)]
    maxpv = 0
    
    st1 = []
    
    for i in range(N):
        for j in range(N):
            if jari[i][j] == 0:
                pl[i][j] = computePl(i, j, likes)
                if maxpl < pl[i][j]:
                    maxpl = pl[i][j]
                    st1 = [(i, j)]
                elif maxpl == pl[i][j]:
                    st1.append((i, j))
                
    st2 = []
    while st1:
        i, j = st1.pop()
        pv[i][j] = computePv(i, j)
        if maxpv < pv[i][j]:
            maxpv = pv[i][j]
            st2 = [(i, j)]
        elif maxpv == pv[i][j]:
            st2.append((i, j))     
    
    st2.sort()
    i, j = st2[0]
    jari[i][j] = one
    
inputs = dict()
score = 0    

for _ in range(N2):
    one, l1, l2, l3, l4 = map(int, input().split())
    l = [l1, l2, l3, l4]
    locateOne(one, l)
    inputs[one] = l

for i in range(N):
    for j in range(N):
        finalPl = computePl(i, j, likes[jari[i][j]])
        score += (0 if finalPl == 0 else 10**(finalPl - 1))
        

print(jari)
profile
진짜

0개의 댓글