2021 라인 채용연계형 인턴 코딩테스트 후기(일기)

나의 첫 코딩테스트

결론: 아직 많이 부족하다!!

(결론부터 시작하는 이야기)

알고리즘…이 어찌됐든, 복잡도가 어찌됐든 2솔..ㅋㅋㅋ

내가 정말 깔끔하게 풀었으면, 기대할텐데 솔직히 내 코드 수준…멀었다

그래도 긴장하는 와중에, 어차피 못풀거, 떨어질거 포기할까 생각했는데 끝까지 풀어서 제출했다 라는 점에서 칭찬~

백준 기준으로 나는 아직 골4~실버 문제 위주로 풀고 있다. 그런데 코딩테스트 문제는 내가 봤을 때, 최소 골드이상인것 같다. 차근차근 여유를 갖고 여러 문제를 풀고 경험을 쌓다보면, 자신감도 많이 생길 것 같다.


현재 대학교 4학년 1학기… 2022년 2월 졸업예정

나의 첫 입사 원서, 자소서를 라인플러스 AD Platform 채용연계형 인턴 지원에 제출했다.

3월달에 코로나가 잠잠해지고 있는 것 같아, 4월말 시험끝나는 것에 맞춰 제주도를 가기로 했다.
어쩌다 제주도에서 돌아오는 날이 서류 마감일이었다. 때마침 비행기는 1시간 넘게 지연되었고, 공항에서 서류를 제출했다.

아직 감이 없어서, 붙을 줄 몰랐지만, 붙었다.


그렇게 갑작스럽게 하게 된 코딩테스트…

사실 2월말? 3월부터, 코딩테스트를 제대로 준비하기 시작했다. 원래 C++로 준비하다가, 작년 파이썬을 처음써보고 코딩테스트는 파이썬으로 준비해야겠다라는 생각이 들었다. 그래서 책을 사고 기초 알고리즘이랑 파이썬 문법, 라이브러리? 사용법을 어느정도 익히고, 백준을 엄청 풀었다. 당연히 낮은 레벨부터 시작했다.

하반기 공채에 넣을 생각으로… 그러면 코딩테스트도 당연히 하반기이기 때문에 그렇게 계획을 했다.

갑작스럽게 5월1일 라인…코딩테스트를 하게되었다. 나에게 엄청난 기회였다. 내가 아직 부족한걸 알지만, 가고 싶었던 기업이니깐…

그리고 모든게 처음이여서, 떨어져도 새로운 경험을 쌓을 수 있는 기회였고, 붙으면 걍 미친거고 ㅋㅋ

5월 1일 (토) 아침 8시에 일어나, 천천히 밥먹고 준비하고 느긋하게 10시가 되기를 기다리다 시작했다.

심장이 쿵쾅되었다. 그냥 백준 알고리즘 문제 풀 때와 느낌이 너무 달랐다.


1.

문자열 문제인 것 같다.

쉽게 여러가지 괄호.. ({<[]}) 등등이 있었는데, 주어진 문자열에서 짝이 잘 지어졌는지, 아닌지 확인하는 것이다. 대신 조건이 여러개다.

백준에서 비슷한 문제를 풀었는데, 기억이 나질 않았다. 심지어 그 수없이 하던, 문자열 리스트를 한개씩 쪼개는 것부터 막혔다. 문장 전체를 반복문으로 한개씩 확인할까… 아니면 문자열 하나하나 쪼개서 확인할까… 사실 뭐가 됐든 같은 방법인데, 나는 거기서부터 고민했다. (긴장하니깐 쓸 때 없는생각은 많아지고, 중요한 건 생각안나고)

뭐 어찌어찌 반복문 돌리기로 생각하고, 열린 괄호?, 닫힌 괄호? 두개로 나누어 String을 돌면서 괄호들을 넣어주었다.

그리고 두 괄호 스택들을 하나는 맨끝부터, 하나는 맨앞부터 비교하면서 짝이 맞는 지 확인했다.

기타 조건들은 생략~~~~

사실 지금 내 코드를 보면, 더 좋은 방법은 안떠오른다. 내가 만들고, 코드를 계속보니깐 다른 아이디어가 안떠올라… 나중에 시간이 어느정도 지나면, 그때 다시 풀어봐야지

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
def solution(inputString):
partition = ['(', '{', '[', '<']
partition2 = [')', '}', ']', '>']

# 첫 번째 문자가 닫는 괄호이거나 괄호가 없는 경우에는 0을 반환합니다.
if inputString[0] in partition2:
return 0

stack1 = []
stack2 = []
flag = 0 # 두 번째 문자 이후에서 닫는 괄호가 먼저 나오는 경우에는 닫는 괄호의 인덱스를 음수로 반환합니다.
for i in range(len(inputString)):
if inputString[i] in partition:
stack1.append(inputString[i])
flag = 1
elif inputString[i] in partition2 and flag == 0:
return -i
elif inputString[i] in partition2:
stack2.append(inputString[i])

wrong_element = 0
correct_count = 0
# 여닫는 괄호의 짝이 맞지 않으면 닫는 괄호의 인덱스를 음수로 반환합니다.
# 틀린 부분의 괄호를 찾아서 인덱스 반환
# 답이 중복으로 존재하는 경우 문자열 왼쪽 기준으로 먼저 등장하는 것을 답으로 합니다 (비교 순서)
while True:
if not stack1:
break
else:
stack1_temp = stack1.pop()
if not stack2: # 괄호가 열려 있는 상태로 문자열이 끝나면 문자열의 마지막 인덱스를 음수로 반환합니다.
return -(len(inputString) - 1)
else:
stack2_temp = stack2.pop(0)

if stack1_temp == '(' and stack2_temp != ')':
wrong_element = stack2_temp
break
elif stack1_temp == '{' and stack2_temp != '}':
wrong_element = stack2_temp
break
elif stack1_temp == '[' and stack2_temp != ']':
wrong_element = stack2_temp
break
elif stack1_temp == '<' and stack2_temp != '>':
wrong_element = stack2_temp
break
else:
correct_count += 1

# 모든 괄호를 정상적으로 사용했다면 총 괄호 쌍의 개수를 반환합니다
if wrong_element == 0:
return correct_count
else:
answer = -inputString.index(wrong_element)
return answer

2.

두 번째 문제… 어려웠다.

IT취업 오픈톡방에서 물어보니깐 백준의 오큰수 문제와 유사하다고 한다. 이걸 알았으면, 풀었지…. 하지만 예전에 풀었던 문제다…ㅋㅋㅋ

오큰수 문제를 왼큰수? 랑 함께 응용하면 가능할 듯

하지만 시험때는 도저히 생각이 안나던걸…

주어진 숫자 리스트에서 하나를 기준으로 좌우로 자신보다 큰 숫자를 찾고 인덱스 차이를 출력? 뭐 그런거다.

이건 코드가 쪽팔려서 안올린다.


3.

세 번째 문제… 딱 보고 그리디 + 동적 아니면 그리디 + 순열조합으로 풀어야겠다라고 생각했다.

근데 나중에 물어보니깐 사람들이 힙.. 우선순위 큐로 푸는거란다.

알고리즘 문제를 풀 때에는 한가지 답은 없다지만, 우선순위큐가 복잡도 측면에서 가장 좋은 방법인듯…

이 문제는 프로그래머스의 디스크 컨트롤러와 유사하다고 한다.

위 문제와 차이는 소요시간은 동일하고 기다리는 시간의 cost가 존재한다.. 그 cost를 최소화해야한다.

그래서 난 그리디로 생각했다. 지금까지 내가 풀어온 문제가 그랬고..ㅋ

어쨋든 여러가지 경우의 수를 고려해야해서 그냥 permutation을 이용해서 모든 경우의 수를 계산해서 그중 최소 cost를 출력했다.

결론 맞았지만, 틀렸습니다 ?

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
from itertools import permutations


def calculate(cases):
start_time = []
cost = []
for ad in cases:
start_time.append(ad[0])
cost.append(ad[1])

point = 0
total_cost = 0
for i in range(len(cases)):
sample_cost = 0
if point - start_time[i] >= 0:
sample_cost = (point - start_time[i]) * cost[i]
point += 5
else:
point += start_time[i] + 5

total_cost += sample_cost
return total_cost


def solution(ads):
cost_list = []
nPr = permutations(ads, len(ads))
for case in list(nPr):
# print(case)
cost_list.append(calculate(case))

answer = min(cost_list)
return answer

위 내용이 진짜인지 거짓일지…저는 문제를 유출하지 않았습니다.

2021 라인 채용연계형 인턴 코딩테스트 후기(일기)

https://devch.co.kr/2021/05/02/LIFE-21-05-02/

Author

Chaehyeon Lee

Posted on

2021-05-02

Updated on

2021-05-02

Licensed under

댓글