기타

HSAT 7회 정기 코딩 인증평가 후기

코방코 2023. 8. 29. 14:39
728x90

지난 2023년 8월 11일에 현대차그룹에서 주관하는 HSAT에 Python 언어로 응시했다.

취득 시 현대차 지원에 코딩 테스트가 필요한 모집 분야에서 2년간 코테 면제가 가능하다는 장점이 있다.

1년에 두 번 정도 시행하는 것 같고, 또 자극받을만한 좋은 기회가 될 것 같아서 시험 응시했다.

두 문제가 출제 되는데 두 문제 완벽하게 풀어야 인증서 취득이 가능하다.

 

결론부터 말하면 떨어졌다.

 

그래도 글을 쓰는 이유는 그래도 생각보다 내가 잘해나가고 있다는 것을 느끼기도 했고, 

조금 느낀 점도 몇 개 있어서이다.

지난 문제는 아래 페이지에서 풀어볼 수 있다.

 

합/불만 알려주는 결과 시스템이었기 때문에 왜 떨어졌는지부터 복기해보려했다.

 

Softeer

 

softeer.ai

 

1번 문제는 리스트 item 중 3개를 골라 원하는 중간 값을 만드는 경우의 수가 몇 개 있는지 계산해내는 문제였다.

정말 간단한 문제라고 생각했다.

 

제공되는 숫자를 list 형태로 받고, sort 시켜

target 값이 존재할 경우 해당 인덱스 기준 왼쪽 개수와 오른쪽 개수를 곱한 것이 그 경우의 수이고

없을 경우 0을 return 하면 된다는 아이디어를 떠올렸다.

 

시험 당시의 코드를 복기해서 다시 코딩해보았다.

import sys

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

L = list(map(int, input().split()))
L.sort()

for _ in range(q):
    find = int(input())
    if find in L:
        temp = L.index(find)
        print((temp)*(n-1-temp))

    else:
        print(0)

쉬운 문제 하나 줬구나 생각하고 그대로 넘어갔다.

시간 복잡도 줄일 필요성도 딱히 느끼지 못했다.

대부분 python 내장 함수로 해결했기 때문이다.

 

근데 이게 무슨 일 

복기하면서 제출했는데 시간 초과가 뜨는 것이었다.

아차 싶었다.

설마 이거 시간 초과 떠서 떨어졌을거라곤 상상도 못했다.

 

set으로 내장 함수 in이 더 빠르게 작동하도록 코드 수정하고, sys.stdin / sys.stdout 써서 속도를 더 올리려했다.

 stdout은 어차피 개행문자 들어가서 똑같을수도 있긴한데.. 일단 넣어봤다.

import sys

n, q = map(int, sys.stdin.readline().split())

L = list(map(int, sys.stdin.readline().split()))
L.sort()
set_L = set(L)

for _ in range(q):
    find = int(sys.stdin.readline())
    if find not in set_L:
        sys.stdout.write("0" + "\n")
    else:
        temp = L.index(find)
        sys.stdout.write(str((temp)*(n-1-temp)) + "\n")

 

속도가 조금 개선되긴 했는데, 마찬가지로 통과가 안됐다.

솔직히 여기서부터는 정말 엥? 싶었다.

이것도 통과가 안되면 index 내장 함수 자체가 사용 불가하다는 판단을 했다.

python 자체의 문제인가?  내가 python으로 언어를 작성해서 떨어진걸까?

그래서 해설 강의를 좀 참조했다. 

해답은 bisect 라이브러리로 해결하는 것이었다.

 

...

 

진짜... 조금 억울한 느낌도 들고.. 내가 바보인건가..

python으로 붙은 사람들은 index 함수가 시간초과가 뜰걸 예측하고 미리 알고 썼다는 말인가..

많은 생각이 들었다.

python index 함수도 이분탐색으로 해결할텐데...

왜 bisect는 통과가 되고 index는 통과가 안되는지.. 

조금 분했다.

어쨌든 통과한 코드는 다음과 같다.

import sys
import bisect

n, q = map(int, sys.stdin.readline().split())

L = list(map(int, sys.stdin.readline().split()))
L.sort()
set_L = set(L)

for _ in range(q):
    find = int(sys.stdin.readline())
    if find not in set_L:
        print(0)
    else:
        temp = bisect.bisect_left(L, find)
        print((temp)*(n-1-temp))

 

2번 문제도 다시 풀어봤다.

2번 문제는 maze 내에서 반드시 방문해야하는 노드들을 방문하고 최종점에 도착하는 경로의 개수를 출력하는 문제였는데,

모든 경우의 수를 dfs를 통해 탐색해야겠다는 생각을 했다.

재귀 함수로 구현하다보니, root를 백업해두고 update해서 가능한 모든 경로를 찾는 과정을 구현하는 것이 조금 어려웠던 것 같다.

시험 시간에는 많은 케이스 구성해서 넣어보고 어느정도 맞췄다는 확신이 들었을 때 제출했다.

시간 복잡도와 recursionlimit은  애초에 n=4 까지 밖에 없어서 딱히 걱정은 안했다.

 

복기한 작성 코드는 다음과 같다.

import sys
sys.setrecursionlimit(10000)

def dfs(vertex, root, visited):
    if vertex == must_visit[-1]:
        root.append(vertex)
        all_root.append(root)
        return
    for d_row, d_col in [(-1, 0), (0, 1), (1, 0), (0, -1)]:
        next_row = vertex[0] + d_row
        next_col = vertex[1] + d_col
        if 0 <= next_row < n and 0 <= next_col < n and given_map[next_row][next_col] == 0:
            if vertex not in visited:
                temp_visited = [i for i in visited]
                temp_root = [i for i in root]
                visited.append(vertex)
                root.append(vertex)
                dfs((next_row, next_col), root, visited)
                visited = temp_visited
                root = temp_root
            
n, m = map(int, input().split())

given_map = []
must_visit = []
all_root = []

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

for i in range(m):
    r, c = map(int, input().split())
    must_visit.append((r-1,c-1))

#print(given_map)
#print(must_visit)

dfs(must_visit[0], [], [])

answer = 0
for r in all_root:
    temp = []
    #print(r)
    for index in r:
        if index in must_visit:
            temp.append(index)
    #print(temp)
    if temp == must_visit:
        answer += 1
print(answer)

 

나는 당연히 2번 문제를 못풀어서 불합인줄 알았는데

2번 문제는 바로 통과가 됐다.

...

씁쓸함이 좀 몰려왔던 것 같다.

아쉽기도 하고.

그냥 아쉽다.

정말로.

 

굉장히 뿌듯한 감정을 느낄 수도 있었을 것 같은데

참 아쉽다.

그래도 취준의 신호탄을 쐈던 것 같은데

나쁘지 않았다는 생각도 한다.

첫 술에 배부를 수 있는가.

아쉽지만 더 준비를 잘해야겠다는 생각도 했다.

끝까지 방심하지 않기로

 

더 부단히 준비해야겠다.

728x90
반응형

'기타' 카테고리의 다른 글

2023년을 떠나보내며.  (0) 2023.12.31
2023 스페인 세비야 여행기  (0) 2023.03.03
2023 스페인 그라나다 여행기  (1) 2023.03.01
2023 스페인 바르셀로나 여행기  (2) 2023.03.01
분기점, 2022년  (0) 2022.12.31