[BOJ/백준] 5462번 POI

안녕하세요. 오늘은 다소 간단한 문제에 대해 풀어보았습니다.

https://www.acmicpc.net/problem/5462

N <= 2000, T <= 2000 이고, 대충 계산해도 O(N*T)에는 풀리는 문제이기 때문에 크게 시간 제한을 신경 쓰지 않고 풀이가 가능합니다.

다만, 문제가 글로 풀어 쓰여져 있고, 관리해야 할 수치들이 좀 있기 때문에 변수 명을 잘 정해두어야 헷갈리지 않을 것 같습니다. ( 저는 변수명을 대충 지어서 풀다가 한 번 틀렸네요 ㅠㅠ )

입력받은 N*T 의 테이블로부터 구해야 하는 것은 아래와 같습니다.

  1. 각 열의 0의 갯수 … zeros_t
  2. 각 행의 1의 갯수 … ones_n
  3. 각 참가자의 점수 … score_n : zeros_t와 input_table과의 연산으로 구함

수치를 구한 후에는, 조건에 맞게 카운팅을 실시해주면 됩니다. 정렬을 한 후에 카운팅을 한다면 좀 더 시간복잡도는 줄일 수 있을 것 같은데, 데이터가 많지 않기 때문에 굳이 그렇게 하지는 않았습니다. (연습삼아 시도해보는 것도 좋을 것 같습니다!)

풀이 코드는 아래와 같습니다.

n, t, p = list(map(int, input().split()))

input_table = list()
zeros_t = [0 for _ in range(t)]
ones_n = list()
score_n = [0 for _ in range(n)]

for idx in range(n):
    input_table.append(list(map(int, input().split())))
    ones_n.append(sum(input_table[idx]))

for i in range(t):
    for j in range(n):
        if input_table[j][i] == 0:
            zeros_t[i] += 1

for i in range(n):
    for j in range(t):
        score_n[i] += input_table[i][j] * zeros_t[j]

p -= 1

res = 1
ones_p = ones_n[p]
score_p = score_n[p]

for idx in range(n):
    if score_n[idx] > score_p:
        res += 1
    if score_n[idx] == score_p and ones_n[idx] > ones_p:
        res += 1
    if score_n[idx] == score_p and ones_n[idx] == ones_p and idx < p:
        res += 1

print(score_p, res)

풀이 후에 코드 정리를 실시하였는데요, 다양한 길이의 리스트가 존재하는 경우에는, 변수명 끝에 해당 리스트의 길이를 네이밍해주는 것도 좋은 것 같습니다. 한결 보기 좋아진 것 같네요.

카운팅을 실시하는 하단 로직은 else if 구문을 사용하면 더 깔끔해질 것도 같으나, 요즘 일을 하면서 수평적으로 로직 구성을 많이 하다보니, 습관적으로 짠 것 같습니다. 더 직관적인 것 같기도 하네요.

1일 1알고리즘 문제 풀이를 반 년 정도 한 것 같습니다. 쉬운 문제만 탐내는 것 같아 조금은 아쉽지만 그래도 퇴근하고 이렇게 나마 머리 식히는 시간을 가질 수 있어서 좋은 것 같습니다. 꾸준히 실력을 닦아 나가야겠습니다 🙂


게시됨

카테고리

작성자

댓글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다