[CS] 2023 컴퓨터학부 주관 신입생 알고리즘 대회

김두현·2023년 11월 14일
0

Computer Science Study

목록 보기
7/9
post-thumbnail

학교에서 전체 신입생 대상으로 알고리즘 대회가 열렸다. 총 문제 수는 8문항이였다. B, C번은 다 접근은 했지만 대회장에서는 해결하지 못했다. 대회가 끝나고 분명 해결 할 만한 쉬운 문제들인데 왜 못 풀었는가 싶어 다시 복기하여 풀어봤다.

A번

문제

a번은 누구나 풀 수 있게 단순히 "한양대 화이팅" 이런 1문장을 출력하는 문제였다.

입력

x

출력

한양대 화이팅

B번

문제

부동산 가격 계산에 대한 문제.
땅 가격을 입력받고, 좌표를 입력받아서 땅 가격의 합을 계산하는 문제이다.

입력

n줄 m개의 땅의 가격을 입력받는다.
t를 받는다.
t만큼 x1, y1, x2, y2를 받는다.

출력

(x1, y1)에서 (x2, y2)까지의 땅 가격의 합을 각각 출력한다.

풀이

n, m = map(int, input().split())

price = []

for i in range(n):
    price.append(list(map(int, input().split())))

print(price)

t = int(input())

for i in range(t): 
    x1, y1, x2, y2 = map(int, input().split())
    
    p = 0

    for py in range(y1, y2+1):
        for px in range(x1, x2+1):
            p += price[py][px]

    print(p)

n, m를 입력 받고 price 에 2차원 list의 형태로 저장하여 나중에 x1, y1, x2, y2를 받아 접근하기 용이하게 하려했다.
n개의 줄에 입력받기 때문에 n번 반복하여 한줄에 입력받고 split으로 분리하여 price에 list로 저장했다.
그러므로, [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 이러한 형태의 2차원 list 형태로 각각 저장된다.

그리고 t를 입력받고, t만큼 x1, y1, x2, y2를 받는다.
그 다음 p를 0으로 초기화하고 입력받은 x1, y1, x2, y2 값으로 저장했던 price 2차원 배열에 접근하여 p에 누적하여 더하고 출력하는 과정을 t번 반복했다.

이 문제는 왜 accept가 안됐는지 잘 모르겠다. 내가 기억하는 문제대로는 잘 구현한 것 같은데 문제를 잘못 이해해서 그런 것 같다. 계속 정답하고 다르게 나와서 문제를 몇번이나 다시 읽어봤었는데 내가 이해한대로 밖에 해석이 안되어서 패스하고 c번으로 넘어갔다.

C번

문제

C번은 장학금을 받을 학생을 선정하는 문제이다.
학생들의 학번과 학점을 입력받는다.
학점이 4.0이상의 학생은 장학금을 지급하지 않기 때문에 4.0미만의 학점을 가진 학생 중 상위 3명의 학생에게 지급한다.
학점이 같을 경우에는 학번의 오름차순으로 출력한다.

입력

첫째 줄에 학생 수인 s를 입력받는다.
다음 줄부터 s+1 줄까지 각 학생의 학번과 학점을 입력받는다.

출력

장학금을 받을 3명의 학생의 학번을 출력한다.

풀이

n = []
p = []

s = int(input())

for i in range(s):
    a, b = input().split()
    b = float(b)

    if b < 4.0:
        n.append(a)
        p.append(b)

l = []

for i in range(len(n)):
    l.append([n[i], p[i]])

l.sort(reverse=True, key = lambda x: x[1])

for i in range(len(l)):
    n[i], p[i] = l[i]

if p[0] == p[1] and p[1] == p[2]:
    for i in sorted(n):
        print(i)
elif p[0] == p[1]:
    for i in sorted([n[0], n[1]]):
        print(i)
    print(n[2])
elif p[1] == p[2]:
    print(n[0])
    for i in sorted([n[1], n[2]]):
        print(i)
else:
    print(n)

먼저 s를 입력받고 s번 만큼 학번과 학점을 입력받는다. 그때, 학점이 4.0 이상인 학생은 선발되지 않으니 4.0 미만의 학생만 각각 n list와 p list에 학번과 학점을 추가하였다.

list 안 각 index에 [학번, 학점] 꼴로 대응되게 만들기 위해 빈 리스트 l를 정의하고, l에 list의 형태로 [학번, 학점]을 추가하였다.

list.sort() method를 활용해 각 학점을 기준으로 학번과 학점을 내림차순 정렬했다.

각 학점과 학번을 비교하기 위해 다시 n과 p로 분리하였다.

학점이 같을 때, 학번의 오름차순으로 출력하기 위해서 학점이 내림차순으로 정렬되어 있을 때의 경우의 수를 생각해봤다.

내림차순으로 정렬되어 있기 때문에

p[0] >= p[1] >= p[2]

의 형태로 정리된다. 따라서 아래의 4개의 경우의 수가 생긴다.

p[0] = p[1] = p[2]

학점이 모두 같으므로 학번의 오름차순으로 출력한다.

p[0] = p[1] > p[2]

이 조건을 코드에서 'p[0] == p[1]' 형태로 쓴 이유는 첫번째 조건인 p[0] = p[1] = p[2] 에서 성립되지 않은 else if 문이기 때문에, p[0]는 p[1]과 같다는 것은 p[1], p[0] 와는 p[2] 가 다르니, p[2]는 항상 p[1] > p[2]의 조건을 만족할 수 밖에 없기 때문이다.

그러므로, n[0]와 n[1]를 오름차순 정렬하여 출력하고 n[2]를 출력한다.

p[0] > p[1] = p[2]

이 조건도 코드에서 'p[1] == p[2]'의 형태로 표현 된 것은 else if 식이기 때문이다.

따라서, n[0]를 먼저 출력하고, n[1]과 n[2]는 오름차순 정렬하여 출력한다.

p[0] > p[1] > p[2]

이 경우는 이미 학점순으로 학번이 정렬되어 있으므로 정렬할 필요 없이 출력한다.

이 문제는 logic은 그대로 다 생각했으나 b번에서 시간을 너무 많이 써서 코드를 짜는 도중에 대회 시간이 종료되어 다 풀지 못하고 끝났다.

대회 이후

내 역량을 전혀 못 발휘하고 온 것 같아서 너무 아쉽다. 하지만, 이 대회는 나에게 생각할 거리를 제공해 준 것 같다. 이 대회를 기점으로 내가 확실히 알고리즘 문제풀이 같은 논리적 사고 능력이 부족함을 다시 느꼈다.

원래 컴퓨터 분야에 관심을 가지게 된 것도 알고리즘이나 이러한 논리적인 면이 좋아서가 아니라 내가 사용하는 기기의 소프트웨어를 개발하고 싶다는 생각에 시작했던 거라 이때까지 문제풀이나 자료구조나 logic 같은 부분에 별 흥미가 없었고, 새로운 언어와 환경을 배우고 프로젝트만 계속 했었다.

하지만 그보다 근본적인 알고리즘 구현 능력이 떨어지니 차후에 할 프로젝트의 진행에도 문제가 생길 것이고, 코딩테스트의 문제도 있을 것이라 생각한다.

그래서 최근에는 프로젝트에 바빠서 알고리즘 문제 풀이를 멈추고 신경을 쓰지 못했는데 이제는 좀 제쳐두고 알고리즘 문제를 다시 열심히 풀려고 한다.

하지만, 백준 실버 4~5 부터는 자료구조 개념을 활용하는 문제가 시작하기 때문에 자료구조 내용을 공부하지 않은 나의 입장에서는 접근하기가 너무 어렵다는 생각을 했다.

그래서 1학년 겨울방학에는 자료구조와 알고리즘 공부를 최대한 해서 나의 알고리즘 구현 능력을 최대한 높일 것을 목표로 하고 있다.

이 대회에서 내가 원하는 만큼의 성과는 못 얻었다. 하지만, 나의 부족함을 다시 한번 깨닫고 내가 좀 더 우선적으로 집중해서 해야할 일이 무엇인지 알려준 것 같고, 다른 나보다 뛰어난 사람들 만큼 따라가게 해줄 역할을 할 것이므로 의미있는 경험이지 않나 싶다.

profile
HYU ERICA 23 ICT융합학부 미디어테크놀로지전공 김두현

1개의 댓글

comment-user-thumbnail
2023년 11월 14일

즐겁게 읽었습니다. 유용한 정보 감사합니다.

답글 달기