ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • '2021 Dev-Matching: 웹 백엔드 개발자(상반기)' 기출 문제 해설
    취업 이야기 2021. 4. 26. 14:10

    'Dev-Matching 웹 백엔드 개발자'의 코딩 테스트는 어떠셨나요? 3개의 프로그래밍 문제와 1개의 SQL 문제가 출제되었는데요. 출제된 4개의 문제 중 어떤 문제가 가장 어려우셨나요? 프로그래머스에서 공개하는 해설을 보고 스스로 보완해야 할 부분이 어디인지 확인해보세요. 만약 내가 Dev-Matching 웹 백엔드에 참여하지 않았다면, 문제를 한번 풀어보고 해설을 확인하시는 걸 추천드립니다.

    문제를 다시 풀어보려면?

    프로그래머스 사이트 내에 '코딩테스트 연습' > '모든 문제'의 왼쪽 하단 칼럼 > '문제 모음' > 2021 Dev-Matching: 웹 백엔드 개발자(상반기)를 클릭하면 출제된 코딩 테스트를 풀어 보실 수 있습니다. 뿐만 아니라 '문제 모음'에서 이전에 출제된 문제들도 풀어 보실 수 있으니 확인해보세요!

    >> 코딩 테스트 연습 바로가기 <<

    그럼 문제 해설 시작하겠습니다.


    프로그래밍 문제 1 - 로또의 최고 순위와 최저 순위

    lottos의 원소 중에, win_nums에 포함된 원소의 개수를 equal_count, 0의 개수를 zero_count라고 합니다.

    지워진 번호가 모두 당첨 번호가 아니라면, 일치하는 숫자의 개수는 equal_count개,

    지워진 번호가 모두 당첨 번호라면, 일치하는 숫자의 개수는 equal_count+zero_count개 입니다.


    프로그래밍 문제 2 - 행렬 테두리 회전하기

    행렬의 테두리를 이루는 모든 숫자들을 한 칸씩 시계 방향으로 이동시키는 전형적인 구현 문제입니다.

    이때, 8가지 부분으로 나누어 처리하면 간단히 구현할 수 있습니다.

    • 왼쪽 위 모서리 숫자 : 오른쪽으로 이동
    • 왼쪽 아래 모서리 숫자 : 위로 이동
    • 오른쪽 위 모서리 숫자 : 아래로 이동
    • 오른쪽 아래 모서리 숫자 : 왼쪽으로 이동
    • 모서리를 제외한 왼쪽 테두리 숫자들 : 위로 이동
    • 모서리를 제외한 오른쪽 테두리 숫자들 : 아래로 이동
    • 모서리를 제외한 위 테두리 숫자들 : 오른쪽으로 이동
    • 모서리를 제외한 아래 테두리 숫자들 : 왼쪽으로 이동

    프로그래밍 문제 3 - 다단계 칫솔 판매

    이 문제는 다음 과정을 통해 해결할 수 있습니다.

    1. center를 루트(root) 노드로 하는 트리를 구성합니다.
    2. 최초 이익이 발생한 노드의 부모 노드를 순차적으로 방문하면서 적절히 이익을 배분합니다.

    먼저 트리를 구성하기 위해 연관 배열을 사용할 수 있습니다. 연관 배열이란 키 하나와 값 하나를 연관시켜 키를 통해 연관된 값을 얻을 수 있도록 하는 자료구조로, 언어에 따라 맵(map), 사전(dicitionary)라고 부르기도 합니다.

    tree_img.png

    예를 들어 위와 같은 트리의 경우 각 노드의 부모 노드를 다음과 같이 표현합니다(center는 -로 표시하였습니다).

    현재 노드 부모 노드
    john -
    mary -
    edward mary
    emily mary
    jaimie mary
    sam edward
    young edward
    tod jaimie

     

    이제 최초로 이익이 발생한 노드가 주어질 때, 부모 노드를 순서대로 거슬러 올라가며 이익을 배분할 수 있습니다.

    예를 들어 young이 1200원을 번 경우

    • young의 부모 노드는 edward입니다. young에게 1080원을 배분하고 현재 노드를 edward로 변경해 줍니다. 남은 금액은 120원입니다.
    • edward의 부모 노드는 mary입니다. edward에게 108원을 배분하고 현재 노드를 mary로 변경해 줍니다. 남은 금액은 12원입니다.
    • mary의 부모 노드는 - (center)입니다. mary에게 11원을 배분하고 현재 노드를 -로 변경해 줍니다. 남은 금액은 1원입니다.
    • -는 root노드이므로 더 이상 부모 노드를 탐색하지 않습니다.

    따라서 위와 같이 각 노드에 대해 부모 노드를 탐색하는 과정을 수행하며 이익을 배분하면 문제를 해결할 수 있습니다.


    SQL 문제 - 헤비 유저가 소유한 장소

    공간을 2개 이상 등록한 유저를 찾기 위해서는 다음과 같은 서브 쿼리를 사용해야 합니다.

    SELECT   HOST_ID 
    FROM     PLACES 
    GROUP BY HOST_ID
    HAVING   COUNT(*) >= 2

    이 쿼리를 짜는 게 이 문제의 첫 번째 목표였고 이 쿼리를 짰다면 아래와 같은 다양한 방법으로 답을 맞힐 수 있습니다!

     

    첫 번째 풀이

    WHERE 문에서 서브 쿼리를 이용한 풀이입니다. 서브 쿼리는 HOST_ID가 2개 이상인 HOST_ID를 나타내 줍니다. 그다음 IN 연산자를 통해 서브 쿼리에 속하는 HOST_ID만 나타냅니다. 이 풀이는 가장 많은 사람들이 작성한 풀이입니다.

     

    SELECT *
    FROM PLACES
    WHERE HOST_ID IN (
        SELECT   HOST_ID 
        FROM     PLACES 
        GROUP BY HOST_ID
        HAVING   COUNT(*) >= 2
    )
    ORDER BY ID;

     

    두 번째 풀이

    기존 PLACES테이블에 HOST_ID가 몇 번 나왔는지를 나타내는 열을 조인한 다음 HOST_ID가 2번 이상 나온 기존 테이블의 정보만 나타냅니다.

    SELECT A.* 
    FROM PLACES A, (SELECT HOST_ID, COUNT(*) AS CNT FROM PLACES GROUP BY HOST_ID HAVING COUNT(*) >= 2) B 
    WHERE A.HOST_ID = B.HOST_ID
    ORDER BY A.ID

     

    세 번째 풀이

    두 번째 풀이에서 WHERE 대신 JOIN을 사용한 쿼리입니다.

    SELECT A.*
    FROM PLACES A
    LEFT JOIN (
        SELECT count(HOST_ID) as c, HOST_ID
        FROM PLACES
        GROUP BY HOST_ID
    ) B
    ON A.HOST_ID = B.HOST_ID
    WHERE B.c >= 2
    ORDER BY A.ID

    맺으며

    코딩 테스트에서 좋은 결과를 얻기 위해 출제자의 의도를 파악해보는 연습을 해보세요. 해설을 보고 어떤 문제가 나왔는지 복기해본 후 어렵게 느껴졌던 문제와 비슷한 유형의 문제를 많이 풀어보시길 추천해 드립니다. 프로그래머스 '문제 모음'에 카카오 기출 문제 등 다양한 기출 문제를 풀어볼 것을 권합니다. 

    Dev-Mathing은 개발자들과 유수의 기업을 이어주는 프로그래머스의 채용 프로그램입니다. 지원자는 하나의 이력서로 최대 5개의 관심 있는 포지션을 선택하여 지원할 수 있으며, 이력서와 테스트 점수가 함께 기업에 전달되어 지원자를 더욱 주목받게 도와주는 프로그램입니다. 
    자세한 내용이 궁금하시다면 지난 2021 Dev-Matching 웹 백엔드(상반기) 내용을 한번 확인해보세요!

    >> 지난 2021 Dev-Matching 웹 백엔드(상반기) 내용 보러 가기 <<

     

    댓글 0

Programmers