본문 바로가기

코딩테스트/기업

2022년 새마을금고중앙회 하반기 코딩테스트

 

2022년 새마을금고중앙회 하반기 코딩테스트는 내 인생 첫 코테였다.

같은 과 언니가 백준과 프로그래머스에 있는 문제들로 공부를 하라고 했다.

어떤 문제를 풀어야 할지 고민됐는데 문자열에 관련된 문제가 많이 나온다고 했다.

그래서 문자열 위주의 문제를 많이 풀었다.

백준은 실버와 골드 위주로, 프로그래머스는 레벨2, 레벨3을 위주로 풀었다.

 

 

새마을금고중앙회는 총 4문제 120분 동안 프로그래머스로 코딩테스트가 진행되었다.

노트북 웹캠으로도 감독을 하고, 옆에 휴대폰도 설치해 감독을 한다.

 

문제가 너무 복잡해서 제대로 설명을 할 수 있을지도 이해를 할 수 있을지도 잘 모르겠다 ㅋㅋ

1번과 2번 문제는 풀었는데 3번과 4번 문제는 문제를 이해하는데도 오래 걸렸고 접근하는 법을 몰랐었다.

그래서 1번과 2번 문제 풀고 30분 정도 시간을 남기고 시험을 종료했다.

 

1번 문제다.

첫 번째 이중 리스트 judges에 여러 개의 리스트가 들어있고 그 리스트에는 5개의 값이 들어있다.

두 번째 이중 리스트 musics에 judges와 같은 수의 리스트가 들어있고 그 리스트에는 4개의 값이 들어있다.

judges의 첫 번째 리스트의 가장 큰 값과 가장 작은 값은 제외하고 모두 더한다.

musics의 첫 번째 리스트의 가장 큰 값 + 두 번째 큰 값 - 두 번째 작은 값 - 가장 작은 값을 한다.

그리고 인덱스와 그 두 값을 곱한 값을 리스트로 만든다.

이것을 모두 반복해 이중리스트로 만들고 두 값을 곱한 값이 제일 큰 값을 출력하는 것이였다.

만약 두 값을 곱한 값의 제일 큰 값이 여러 개일 경우에는 인덱스가 작은 값을 출력한다.

def solution(judges, musics):
    answer = []
    s = []
    s1 = []
    s2 = []
    
    for i in judges:
        s1.append(sum(i) - max(i)  - min(i))

    for i in musics:
        i.sort(reverse = True)
        s2.append(i[0] + i[1] - i[2] - i[3])

    for i in range(len(s1)):
        s.append(s1[i] * s2[i])

    for i in range(len(s) - 1):
        if s[i] >= s[i+1]:
            answer = [s.index(s[i])+1, s[i]]
        else:
            answer = [s.index(s[i+1])+1, s[i+1]]

    return answer

 

2번 문제다.

이중 리스트 loans에 여러 개의 리스트가 들어있었다.

그 리스트 안에는 5개의 값이 들어있는데 정확하게 어떤 값이였는지 기억나지 않는다.

하나의 예시로는 [3, 4, 1000, 100, 3000]이 있었다.

인덱스가 0번째의 값이 1이면 5, 2이면 4, 3이면 3, 4이면 2, 5이면 1을 인덱스 2번째 값에 곱해 변수에 담는다.

인덱스가 1번째의 값이 1이면 1000, 2이면 500, 3이면 300, 4이면 100을 그 변수에 더한다.

그리고 인덱스가 3번째의 값을 그 변수에서 빼준다.

마지막의 결과값이 인덱스가 4번째인 값보다 작으면 0, 아니면 1이 나오게 해서 리스트를 출력한다.

 

def solution(loans):
    answer = []
    loan = 0
    for i in loans:
        loan = i[2] * (6 - i[0])
        if i[1] == 1:
            loan += 1000
        elif i[1] == 2:
            loan += 500
        elif i[1] == 3:
            loan += 300
        elif i[1] == 4:
            loan += 100
        loan -= i[3]
        if loan - i[4] < 0:
            answer.append(0)
        else:
            answer.append(1)
    return answer

 

 

3번 문제다.

maps 이중 리스트와 word 문자열이 주어진다.

maps를 보고 word 문자열을 최단의 경로로 찾는 것이다.

첫 번째 모양으로 설명해보겠다.

maps는 [[-, -, a, -], [-, -, d, c], [b, -, c, -], [-, -, -, -]]이고, word는 abc였다.

첫 번째 칸에서 시작했을 때 최단의 경로로 abc를 찾는 방법은 a, c, b로 가는 것이기 때문에 8을 출력한다.

어떻게 접근해야 되는지 모르겠다..

 

4번 문제다.

임금을 의미하는 fee와 보상금을 의미하는 comp 숫자와 해당 일에 배송해야 할 상품의 개수 shippings 리스트가 주어진다.

shippings 리스트를 수정해서 최소의 비용이 들게 만들어야 한다.

fee는 400, comp는 100, shippings는 [3, 0, 2, 3]이 주어졌다.

첫 번째 날에 3개, 두 번째 날에 0개, 세 번째 날에 2개, 네 번째 날에 3개의 상품을 배송해야 한다는 뜻이다.

그러면 총 3일 일하기 때문에 임금과 곱하면 1200이 된다.

그런데 세 번째 날에 2개를 네 번째 날로 옮기게 되면 [3, 0, 0, 5]가 되고 2일만 일하면 되서 임금은 800이 됩니다.

대신 두 개가 하루 늦게 배송되기 때문에 상품 하나 당 100씩 보상금을 해서 보상금은 200이 된다.

그럼 총 1000의 비용이 들게 된다.

그래서 결과값은 1000을 출력하게 하면 된다.

역시 이것도 어떻게 접근해야 되는지 모르겠다....