자료구조를 도구로써 사용할 순간

유찬홍·2023년 9월 9일
60
post-thumbnail

필자 소개

필자는 대덕소프트웨어 마이스터고에 다니는 평범한 2학년 학생이다.
22년 7~8월쯤부터 백준을 풀기 시작했지만 아직까지 계속 C로만 문제를 풀고 있다.

c++17이 가장 많이 차지하고있지만 사실 다 까보면 C다,,귀찮아서 그냥 고정해서 풀다보니 c++ 비율이 높아지게 되었다.

골드 1을 달고 점점 PS중 자료구조 구현 시간이 아까워져서 글을 작성하게 되었다.

정렬

사실 이런 생각은 예전부터 해왔다.
특히 실버 5 => 골드 5로 넘어올때 정렬에 대해 많은 고민을 했었다.

퀵정렬 코드를 외워야 하나?

시간이 너무 아깝다

문제 난이도가 올라가면서 이분탐색, 투포인터, 크루스칼, 스위핑 등등 정렬이 필요한 상황이 많아지고, 이런 문제가 있을때마다 정렬 구현에 대해 의구심을 가지게 되었다.

물론 언어에서 자체적으로 지원해주는 정렬은 너무 편하다.

python만 해도 array.sort하면 알잘딱으로 정렬해주고, 다른 언어도 마찬가지다.
C에는 qsort라는 <stdlib.h> 라이브러리에 있는 함수가 정렬을 지원한다.

하지만 한편으로는 내가 정렬을 구현하지 않으면서 정렬 코드를 잊어버리거나 기본적인 시간복잡도를 까먹으면 어떻게 하지라는 생각이 계속 떠올랐다.

알고리즘 & 자료구조의 이론과 현실

코테를 본다고 한다면, 정렬을 하기 위해 정렬 코드를 구현하고 있다면 누구나 멍청하다는 말을 할 것이다.

시간이 생명인데 굳이..?

정렬이 필요하다고 생각하면 그냥 정렬하면 된다.

내부 로직은 알 이유도 없고 알 필요도 없으며, 정렬된 결과물만 내가 얻을 수 있다면 된다.

도구로써 정렬을 사용하는 경우는 그렇다.

이는 다른 자료구조도 마찬가지이다.
내가 코테를 보는 도중 저장한 데이터중 중요도가 높은 자료부터 뽑아와야 한다면, 우선순위 큐를 쓰면 된다.

스택이 필요하다면 사용하면 되고, 인접리스트가 필요하다면 사용하면 된다.

놀랍게도 보편적으로 사용하는 거의 모든 언어에서는 이것들을 지원해준다.

있는걸 사용하는것은 잘못된 생각??

필자가 아직까지 C를 사용해서 문제를 푸는 이유는, 처음 배운 언어라 그렇기도 하지만 도구로써 최소한의 지원만 해주기 때문이라고 생각한다.

C는 지원하는 자료구조가 없기 때문에 스택이냐 큐를 사용하기 위해 직접 구현해야 했다.

그렇기 때문에 스택이나 큐가 어떤 방식으로 동작하는지,
큐의 경우에는 front와 rear, 스택의 경우에는 top를 공부해야 해서 이론 공부가 뒷받침되어야 사용할 수 있었기 때문에 사용하지 않았나 싶다.

결국 자료구조를 사용하기 위해 원론적인것까지 파고들어야 하는데, 사실 오히려 이게 더 잘못된 생각이다.

원론적인 것을 파고들어서 기초부터 공부하기엔 세상엔 배울게 너무 많고, 그에 비해 우리에겐 시간이 매우 적다.

어차피 공부해봤자 결국 사용하는 코드는 매번 똑같을텐데 그냥 있는거 쓰자는 생각이다.

사람의 급소를 모두 공부해서 칼로 죽이는 연습을 하는것보다,
총 한두발 쏘는게 더 편하고 빠르지 않을까?

파이썬을 사용하지 말아주세요

예전에는 한창 C를 쓰면서 파이썬을 그렇게 싫어했다.

사용자에게 많은 편의를 제공하기 때문에 이걸로 문제를 풀면 PS에 공부가 안될것이다...는 핑계고,

사기적인 기능들을 지원하는만큼 느린 파이썬에게 백준에서 시간 보정을 해주는게 싫었다.

있으면 있는대로 살아야지 왜 * 3 + 2만큼의 시간을 더 주는건지,
최고의 무기를 들고 있는 들고 있으면서 느리다는 이유로 장애우복지정책을 내세우는건지.

"꼴받아서" 파이썬을 게이썬이라 부르며 파이썬을 쓰지 말라는 말을 하고 다녔다.

하지만 코테 준비를 하는 친구들을 보며 현실과 타협하기로 했다.
아무래도 코테에서마저 C를 쓰라고 말하는건 아이들을 망치는 행위이기 때문이다.

파이썬은 담배와 같다

예시로 파이썬만 건드는거같아 좀 미안하지만, 다른 언어들도 마찬가지이다.

너무 좋고, 너무 편하기 때문에 어린나이에 그걸 일찍 알아버리면 커서 잘못될 가능성이 있다고 생각한다.

담배나 술을 미성년자에게 금지시키는 이유는, 당연하게도 너무 어리기 때문이다.

그래서 나는 자료구조를 지원하는 타 언어를 사용하는 친구가 PS를 입문한다면 이렇게 말한다.

실버 5까지는 C를 써보지 않을래?

플레 5 문턱에서 c++을 기다리며

G1 => P5까지 13점을 앞두고, 이제는 C를 사용하는것에 지쳤다.

언제까지고 다익스트라 알고리즘을 사용하기 위해 인접리스트를 구현하고 있을수 없는 노릇이고, 덱을 사용하기 위해 그 많은 함수들을 만들고 있을 시간이 너무 아깝다.

플레티넘을 달고 나면 도구로써 사용할 자료구조 구현보다 로직을 짜는데 더 집중할 계획이다.

물론 절대적으로 알고리즘 & 자료구조에 대한 이론 공부도 놓치지 않을 생각이다 ^_^

마치며

지금까지 한 말은 지극히 주관적이기 때문에 정답이 아닐 수도 있다.

내가 한 말중 틀린 말이나 의견이 다른 독자가 있다면 댓글로 알려주길 바란다 ^^7

profile
재미없는건 안 합니다

22개의 댓글

comment-user-thumbnail
2023년 9월 11일

이야...정말 멋진 글이네요!
좋아요 누르고 갑니당~ㅎㅎ

1개의 답글
comment-user-thumbnail
2023년 9월 11일

ㅋㅋㅋㅋㅋ 주로 파이썬을 쓰는데 공감하며 읽었습니다

1개의 답글
comment-user-thumbnail
2023년 9월 13일

ㅋㅋㅋㅋㅋ 파이썬에 대한 비유가 너무 재밋네요. 공부할 때 참고하겠습니다 ㅋㅋㅋ 파이썬 사용자2

1개의 답글
comment-user-thumbnail
2023년 9월 14일

게이썬 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 웃겨서 댓글남기고 갑니다

1개의 답글
comment-user-thumbnail
2023년 9월 14일

ㅋㅋㅋㅋㅋㅋㅋㅋ담배같은 파이썬 개발자입니다

1개의 답글
comment-user-thumbnail
2023년 9월 15일

재미추 드립니다ㅋㅋㅋㅋㅋㅋㅋ

1개의 답글
comment-user-thumbnail
2023년 9월 15일

ㅋㅋㅋㅋㅋ 공감합니다. 저도 입문 언어는 C언어로 배웠었는데요. 당시엔 개발 속도가 안 나오니 참 지루하고 힘들더라고요. 그러다가 다른 언어를 배우게 되니까 그야말로 신세계가 펼쳐지더라고요. 물론 컴퓨터 구조를 익히기에는 C언어가 참 좋습니다만... 상황에 따라 적절한 언어를 선택하는 것도 중요한 것 같아요. 사실 있는 도구를 사용하지 않고 베이스부터 모두 올리려면 어셈블리어만 한 게 없습니다. 근데 어셈블리어로 코드 짜려면 한 세월이 걸리죠. 어셈블리어로 곱셈 계산기 하나만 만들어보셔도 느낌 확 오실 겁니다. (근데 그 힘든 걸 해낸 사람이 있습니다. => 크리스 소이어)
하지만 사용하기 앞서 원론적인 것까지 들여다보는 것은 아주 좋은 학습 방식이라고 생각합니다. 원리를 알고 쓰는 것과 모르고 쓰는 것은 큰 차이가 있으니까요. C언어로 그동안 해오셨으면 앞으로 다른 언어로 하면 무척 수월하게 잘 하시겠군요!

1개의 답글
comment-user-thumbnail
2023년 9월 16일

저는 데이터 사이언티스트라 파이썬을 주로 사용하는데 취미로 다른 언어 배울라고 보면 너무 어려워보이는 일이 생기긴합니다 ㅋㅋㅋ 파이썬이 절 이렇게 망쳤습니다 ㅋㅋㅋ

1개의 답글
comment-user-thumbnail
2023년 9월 16일

ㅋㅋㅋ 파이썬은 담배와 같다.ㅋㅋㅋㅋㅋㅋ

1개의 답글
comment-user-thumbnail
2023년 9월 18일

망치만 사용할 줄 알면, 모든 문제가 못으로 보이게되죠. 목적에 맞게 도구를 선택하는 것이 전부입니다.

1개의 답글
comment-user-thumbnail
2023년 9월 19일

고등학생이라 담배 안피시지 안나요 ㅋㅋ
표현은 딱 맞는거 같아요

1개의 답글