[백준] 21608 - 상어 초등학교 (Python)

냐항·2021년 12월 10일
1

🥦이 문제는 구현 능력이다!

제일 처음 이 문제를 보고 든 생각은 생각보다 쉽구먼~ 이였는데
구현 과정에서 어려움이 있었다.
문제에 주어진 3개의 조건을 각가 따로 def first(), def second(), def last() 이렇게 만들었는데 first에서 막혔다. 끝까지 그 풀이 방법으로 해결할까 했지만 스터디원의 코드를 보고 더 효율적인 풀이법을 알게되었다.
그래서 like와 blank를 한 번에 담는 방식으로 다시 풀었다.

🥝람다 뒤에 조건을 여러개 붙이고 싶다면??
정답 -> tmp.sort(key= lambda x:(-x[0], -x[1], x[2], x[3]))
오름차순이 아닌 내림차순 정렬을 원한다면 값 앞에 -를 붙여주면 된다.
위의 코드는 1번째, 2번째 인자는 내림차순으로, 3번째, 4번째 인자는 오름차순으로 정렬해줘! 하는 의미이다. 람다를 사용하지 못했다면 아마 for문을 여러 번 더 돌지 않았을까??


<import sys
input = sys.stdin.readline

dr = [-1, 1, 0, 0]
dc = [0, 0, -1, 1]


n = int(input())
arr = [[0]*n for _ in range(n)]
## 한 번에 정보를 받음
students = [list(map(int, input().split())) for _ in range(n**2)]

## 학생 수 만큼 for문을 돌며 자리에 앉혀 줌.
for order in range(n**2):
    student = students[order]
    ## 여기다가 가능한 자리를 다 담아서 정렬 후 앉힘
    tmp = []
    for i in range(n):
        for j in range(n):
            if arr[i][j] == 0:
                like = 0
                blank = 0
                for k in range(4):
                    nr, nc = i + dr[k], j + dc[k]
                    if 0 <= nr < n and 0 <= nc < n:
                        if arr[nr][nc] in student[1:]:
                            like += 1
                        if arr[nr][nc] == 0:
                            blank += 1
                tmp.append([like, blank, i, j])
    ### !!!! like, blank는 클 수록, 행과 열의 수는 작을수록 답이니 lambda 뒤의 조건을 잘 줘야함!!!
    tmp.sort(key= lambda x:(-x[0], -x[1], x[2], x[3]))
    ### 정렬 후 젤 앞에 있는 리스트의 행과 열의 번호에 학생 앉히기 
    arr[tmp[0][2]][tmp[0][3]] = student[0]

result = 0
## 점수를 매길 때는 학생 순서대로 점수 주기 위해 정렬함 
students.sort()

for i in range(n):
    for j in range(n):
        ans = 0
        for k in range(4):
            nr, nc = i + dr[k], j + dc[k]
            if 0 <= nr < n and 0 <= nc < n:
                if arr[nr][nc] in students[arr[i][j]-1]:
                    ans += 1
        if ans != 0:
            result += 10 ** (ans-1)
print(result)

0개의 댓글