반응형
snowman95
코딩수련장
snowman95
전체 방문자
오늘
어제
  • 분류 전체보기 (230)
    • 앱테크 (3)
    • 옵시디언 (5)
    • 드라마, 영화 (1)
    • 개발자 이야기 (24)
    • 프로젝트 (10)
      • 프로젝트 방법론 (7)
      • 프로젝트 기록 (2)
      • Github (1)
    • 개발 지식 (0)
      • 디자인 패턴 (0)
    • 프론트엔드 개발 (5)
      • 테크트리 (2)
      • React.js (19)
      • ReactNative (2)
      • Next.js (6)
      • GraphQL (6)
      • 패키지 매니저 (2)
      • 라이브러리 (3)
      • 상태관리 라이브러리 (4)
      • Web 지식 (3)
      • HTML CSS (26)
      • Javascript (16)
      • 도구 (Tool) (3)
      • 성능 최적화 (1)
      • 디자인시스템 (0)
    • Python (53)
      • 모음집 (1)
      • 문법 (12)
      • 라이브러리 (15)
      • 알고리즘 (10)
      • 백준 문제풀이 (9)
      • 코딩테스트 (2)
      • 도구 (Tool) (3)
    • C++ (20)
      • 알고리즘 (6)
      • 삼성SW기출 (6)
      • 삼성 A형 (6)
    • 데이터사이언스 (1)
    • 인프라 (9)
      • 하드웨어 지식 (4)
      • Ansible (2)
      • Database (2)
      • 쉘스크립트 (1)
    • 주식 (0)
    • 취업 준비 (4)
      • 취업 이야기 (0)

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • 개발자이직회고
  • 전공 요약 #네트워크
  • 언어
  • 기계식키보드 #nuphy
  • 백준
  • 티스토리챌린지
  • 25년도채용시장
  • 알고리즘
  • A형
  • Next.js #graphql #tailwind.css
  • 전공요약
  • 전공 요약 #데이터베이스
  • 오블완
  • C++
  • 개발자이직
  • 나의 해방일지
  • 개발자취업시장
  • 면접
  • 삼성SDS
  • 삼성SW역량테스트

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
snowman95

코딩수련장

코딩 테스트 풀이 - 2021 카카오 블라인드 1차 (1~4번 문제)
Python/코딩테스트

코딩 테스트 풀이 - 2021 카카오 블라인드 1차 (1~4번 문제)

2021. 9. 6. 00:52
728x90
반응형

문제 해설 공식 사이트


 

2021 카카오 신입공채 1차 온라인 코딩 테스트 for Tech developers 문제해설

지난 2020년 9월 12일 토요일 오후 2시부터 7시까지 5시간 동안 2021 카카오 신입 개발자 공채 1차 코딩 테스트가 진행되었습니다. 테스트에는 총 7개의 문제가 출제되었으며, 개발 언어는 C++, Java, Jav

tech.kakao.com

 

1번 문제


핵심 키워드 : 문자열 조작 + 구현

총 7가지의 단계를 단순 구현해내면 풀리는 문제다.

1단계 : str.lower() 를 통해 소문자로 변경

2단계 : string.digit(0~9) strings.ascii_lowercase(a~z) 를 알고 있으면 더 수월했을 것임.

3단계 : (주의) ..이 없어질 때 까지 ..을 .으로 변환해야함.

4단계 : 빈문자인지 check해주고 문자열 슬라이싱

5단계 : 빈문자이면 a 대입

6단계 : 길이가 16이상이면 문자열 슬라이싱으로 앞에서 15개 뽑고, 끝자리 .아닐때 까지 제거

7단계 : 길이 확인해서 부족한 만큼 늘려주기

 

 

코딩테스트 연습 - 신규 아이디 추천

카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로

programmers.co.kr

import sys,string
def solution(new_id):
    answer = ''
    
    # 1단계
    new_id = new_id.lower()
        
    # 2단계
    arr = '0123456789-_.'
    new_new_id = []
    for s in new_id:
        if s in arr or s in string.ascii_lowercase:
            new_new_id.append(s)
            
    new_id = ''.join(new_new_id)
    
    # 3단계
    while '..' in new_id:
        new_id = new_id.replace('..','.')
        
    # 4단계
    if new_id and new_id[0] == '.':
        new_id = new_id[1:]
    if new_id and new_id[-1] == '.':
        new_id = new_id[:-1]
    
    # 5단계
    if not new_id:
        new_id = "a"
        
    # 6단계
    if len(new_id) >= 16:
        new_id = new_id[:15]
        while new_id[-1] == '.':
            new_id = new_id[:-1]
            
    # 7단계
    if new_id:
        last_str = new_id[-1]
        size = 3-len(new_id)
        if size <= 2:
            new_id = new_id + last_str * size
            
    answer = new_id
    return answer

 

 

2번 문제


핵심 키워드 : 조합

전체 주문들을 반복하며 course 메뉴 개수만큼 조합(combination) 한 뒤, 가장많이 주문된 조합을 찾는 문제다. 


1번 주문이 A,B,C 이고 course 메뉴 개수가 2면 (A,B), (B,C), (A,C) 3가지 가능.

여기서 2번 주문이 AC, 3번 주문이 BC인 경우에 answer 배열에 AC, BC 둘 다 들어가야 함.

 

 

 

코딩테스트 연습 - 메뉴 리뉴얼

레스토랑을 운영하던 스카피는 코로나19로 인한 불경기를 극복하고자 메뉴를 새로 구성하려고 고민하고 있습니다. 기존에는 단품으로만 제공하던 메뉴를 조합해서 코스요리 형태로 재구성해서

programmers.co.kr

import itertools

def solution(orders, course):
    answer = [] 
    orders = list(map(set, orders))
    order_combinations = []
    menu_dict = dict()
    for cnt in course: 
        menu_dict[cnt] = []

    for menu in orders:
        size = len(menu)
        for cnt in course:
            if cnt < size:
                items = list(map(''.join, list(itertools.combinations(sorted(menu),cnt))))
                order_combinations += items
            elif cnt == size:
                order_combinations.append(''.join(sorted(menu)))

    for item in set(order_combinations):
        cnt = order_combinations.count(item)
        if cnt >=2 :
            menu_dict[len(item)].append((cnt,item))
    # 각 요소들의 개수를 count 하여 가장 많이 등장한 것 확인

    for i, c in list(menu_dict.items()):
        max_cnt = 0
        arr = []
        for cnt, menu in c:
            if max_cnt < cnt:
                max_cnt = cnt
                arr = [menu]
            elif max_cnt == cnt:
                arr.append(menu)
        answer+=arr

    answer.sort()  
    return answer

(잡담)

처음부터 모든 주문에 대한 조합을 바로 구하면 무조건 시간초과 날 것이라 생각해서 어떻게든 전처리를 하고 조합을 구해야된다 생각했다.. 처음에 문제를 대충 읽고 집합 문제로 착각해서 set()로 변환시킨 뒤 각 주문들의 합집합(intersection)을 구했다. 그 결과에 조합(combination)을 구했는데 답이 안나오는거다. 어떻게 해야할 지 한참 고민하다가, 처음부터 조합을 바로 구해봤는데 너무나 쉽게 정답이 나와서 어이가 없었다.
아무래도 효율성 안따지는 문제는 복잡한 생각없이 푸는게 좋아 보인다.

 

3번 문제


핵심 키워드 : 전처리 + 이분탐색

입력 데이터 전처리를 얼마나 효율적으로 해내는가에 모든것이 달려있는 문제이다.

전처리 방법은 아래와 같이 만들 수 있는 모든 경우를 다 만들어 버리는 것이다.

java backend junior pizza 150 
- backend junior pizza 150 
java - junior pizza 150 
java backend - pizza 150 
java backend junior - 150 
- - junior pizza 150
...
- - - - 150

그리고 저것을 문자로 변환(''.join()) 해서 딕셔너리 키로쓰고, 값으로는 점수가 들어간다.

이렇게 하는 이유는 X점수 이상이라는 쿼리를 날릴때 이분탐색을 써서 시간을 줄이기 위함이다.

전처리만 잘해두었으면 쿼리는 단 몇 줄로 끝나버린다. wow
만약 전처리를 안했다면 극단적인 케이스에서 시간초과를 버틸 수 없을 것이다.

 

 

코딩테스트 연습 - 순위 검색

["java backend junior pizza 150","python frontend senior chicken 210","python frontend senior chicken 150","cpp backend senior pizza 260","java backend junior chicken 80","python backend senior chicken 50"] ["java and backend and junior and pizza 100","pyt

programmers.co.kr

import bisect, itertools
def solution(info, query):
    answer = []
    for index, value in enumerate(info):
        info[index] = list(value.split())
        info[index][-1] = int(info[index][-1])

    info.sort(key=lambda x : x[4])
    arr = [0,1,2,3]

    # new_info["문자열값"] = [오름차순 점수]
    # 사전에 모든 조합을 만들어버림
    new_info = dict()
    for person_info in info:
        combi_arr = set()
        combi_arr.add(''.join(person_info[:-1]))
        score = person_info[-1]
        for i in range(1,5):
            for it in list(itertools.combinations(arr,i)):
                tmp_info = person_info[:-1]
                for idx in it:
                    tmp_info[idx] = '-'
                key = ''.join(tmp_info)
                combi_arr.add(key)
        for key in combi_arr:
            if key not in new_info:
                new_info[key] = [score]
            else : 
                new_info[key].append(score)

    # 쿼리 시작
    for index, value in enumerate(query):
        new_query = value.split(' and ')
        new_query[-1], score  = new_query[-1].split()
        new_query = ''.join(new_query)
        score = int(score)
        size = 0
        # 점수 X 이상인 것
        if new_query in new_info:
            size = len(new_info[new_query]) - bisect.bisect_left(new_info[new_query], score)
        answer.append(size)
    return answer

(잡담)

앞으로 이런 고정된 데이터에 여러 번의 쿼리가 나오는 문제는 무조건 전처리에 힘을 다 쏟아부어야겠다고 다짐하게 만든 문제였다...

 

4번 문제


핵심 키워드 : 최단 경로 탐색 (플로이드 워셜 / 다익스트라)

S에서 시작해서 A,B가 각각 집으로 가는 문제다

1) S에서 A,B가 같이 택시타고 가다가 도중에 내려서 각자의 길을 가거나,
2) 처음부터 A,B가 따로 각자의 길을 갈 수 있다.

 

정점 개수가 200개 이하라는 것만 보고도, 이미 알 사람들은 플로이드 워셜이라는 것을 알았을 것이다.

※ C++은 O(n^3)이 500개 까지 버티지만 python은 200개 까지 버티므로 200개로 출제한 것으로 추측됨.

 

단순히 플로이드 워셜이라 알고리즘을 알고 있었고, 문제 풀어본 경험만 있어도 앞의 2,3번 문제보다 더 수월하게 해결된다.

정답은 최단경로 배열 arr[s→k] + arr[k→a] + arr[k→b] 중에서 가장 작은 값이다.

 

 

코딩테스트 연습 - 합승 택시 요금

6 4 6 2 [[4, 1, 10], [3, 5, 24], [5, 6, 2], [3, 1, 41], [5, 1, 24], [4, 6, 50], [2, 4, 66], [2, 3, 22], [1, 6, 25]] 82 7 3 4 1 [[5, 7, 9], [4, 6, 4], [3, 6, 1], [3, 2, 3], [2, 1, 6]] 14 6 4 5 6 [[2,6,6], [6,3,7], [4,6,7], [6,5,11], [2,5,12], [5,3,20], [2,4

programmers.co.kr

import sys
def solution(n, s, a, b, fares):
    INF = n*100000+1
    matrix = [[INF for j in range(n)] for i in range(n)]
    for i in range(n):
        matrix[i][i] = 0

    for c,d,cost in fares:
        matrix[c-1][d-1] = cost
        matrix[d-1][c-1] = cost

    for k in range(n):
        for i in range(n):
            for j in range(n):
                matrix[i][j] = min(matrix[i][j], matrix[i][k] + matrix[k][j])

    return min(matrix[s-1][k] + matrix[k][a-1] + matrix[k][b-1] for k in range(n))

 

반응형
저작자표시 비영리 동일조건 (새창열림)

'Python > 코딩테스트' 카테고리의 다른 글

코딩 테스트 풀이 - 2022 카카오 블라인드 1차 (1~4번 문제)  (0) 2021.09.12
    'Python/코딩테스트' 카테고리의 다른 글
    • 코딩 테스트 풀이 - 2022 카카오 블라인드 1차 (1~4번 문제)
    snowman95
    snowman95
    (17~19) Unity/Unreal Engine 게임 프로그래머 (20~21) System Administrator ___________ (22~) React 웹 프론트앤드 개발자 __________ 깃헙 : https://github.com/snowman95

    티스토리툴바