songin.dev님의 블로그

서류 합격 후 코딩테스트 과제 후기 본문

Developer/Backend

서류 합격 후 코딩테스트 과제 후기

songin.dev 2023. 4. 3. 17:36
728x90

부트캠프를 수료하고 어느덧 취업준비 4개월차..
한 기업에서 서류 합격 통보와 함께 코딩테스트 과제를 받게 되었다.
주어진 시간은 익일 18시까지 약 30시간의 시간을 부여받았다.

문제 유형

1번 알고리즘 문제

1번부터 n까지의 숫자 배열을 재배열 하는 문제
단, 두 개의 연속된 숫자는 항상 같이 이동한다.

내가 작성한 코드

function shuffleArray(n) {
  const array = [];
  const result = [];

  for (let i = 1; i <= n; i++) {
    array.push(i);
  }

  const odd = array.filter(number => number % 2 !== 0);
  const shuffle = odd.sort(() => Math.random() - 0.5)

  for (let i = 0; i < shuffle.length; i++) {
    result.push(shuffle[i]);
    if (shuffle[i] < n) {
      result.push(shuffle[i] + 1)
    }
  }
  return result;
}

shuffleArray(8)

문제 풀이 설명

  1. 배열안의 홀수를 변수 odd에 저장했다.
  2. 변수 odd에 담긴 홀수로 이루어진 배열만 셔플 진행
  3. 셔플의 길이만큼 반복문을 돌린다.
  4. 셔플의 담긴 배열의 숫자를 result 변수에 순서대로 담아준다.
  5. 배열의 담긴 숫자가 n보다 작을 경우에는 배열의 담긴 숫자에 1을 더한 값을 그 뒤에 넣어준다.
  6. result에 담긴 결과값 리턴

2번 알고리즘 문제

얻을 수 있는 최대 자원을 리턴하는 문제
단, 오른쪽과 아래로만 이동할 수 있다.
(문제의 유출 우려가 있어 간략히 설명하고자 하는 점 양해부탁드립니다.)
예시)

map = ["1 2 3", "4 5 6", "7 8 9"]

1 2 3
4 5 6
7 8 9
답 : 21 (1 -> 2 -> 3-> 6-> 9)

내가 작성한 코드

function maxResourceReturn(map) {
  let result = 0;

  const resource = map.map((el) => {
    return el.split(' ').join('');
  });

  for (let i = 0; i < resource[0].length; i++) {
    result += Number(resource[0][i]);
  }

  for (let i = 1; i < resource.length; i++) {
      result += Number(resource[i][resource.length - 1]);
  }
  return result;
}

maxResourceReturn(["8 3 5", "4 3 4", "2 2 3"]);

문제 풀이 설명
지금 글을 쓰면서 깨달은 점이 있다.
문제를 잘못 이해해서 잘못된 답안을 제출했다.
반드시 오른쪽으로 끝까지 이동하고 아래로 내려가야하는 줄 알았다;;
그래도 그 당시에 작성한 의도를 토대로 풀이를 적겠습니다.

  1. result라는 변수의 0의 값을 넣어 선언 및 초기화
  2. 배열에 담긴 각 요소의 공백을 제거
  3. 반복문을 통해 배열의 0번째의 값을 모두 더해서 result에 저장
  4. 다시 한번 반복문을 통해 배열의 길이만큼 반복문을 돌면서 마지막 숫자만 result 변수에 더함(잘못된 이해)
  5. result에 담긴 결과값 리턴

문제를 제대로 이해했다면 4번째의 부분은 고쳐져야 한다.

3번 SQL SELECT 문제

내가 작성한 코드
학생의 평균 점수, 석차, 비고 등의 내용을 한 번에 확인하는 문제

SELECT 
    d.name AS department_name,
    s.name AS student_name,
    ROUND(SUM(l.credits * g.score) / SUM(l.credits), 2) AS avgscore,
    COUNT(g.lectures_id) AS lectures_cnt,
    RANK() OVER (ORDER BY ROUND(SUM(l.credits * g.score) / SUM(l.credits), 2) DESC) AS ranking,
    CASE 
        WHEN ROUND(SUM(l.credits * g.score) / SUM(l.credits), 2) >= 4.0 THEN '장학금'
        WHEN ROUND(SUM(l.credits * g.score) / SUM(l.credits), 2) < 2.0 THEN '학사경고'
        ELSE 'NULL'
    END AS remarks
FROM
    departments AS d
JOIN students AS s ON s.departments_id = d.id
JOIN grade AS g ON g.students_id = s.id
JOIN lectures AS l ON l.id = g.lectures_id
GROUP BY s.id
  1. department_name(학과명), student_name(학생 이름), avgscore(평균 점수), lectures_cnt(수강한 강의 수), ranking(석차), remarks(비고) 등의 속성 값 출력
  2. ROUND 함수로 학점을 계산하는 공식을 감싸서 avgscore로 표기
  3. students의 ID를 GROUP BY로 지정해서 grade 테이블의 수강한 강의 수 COUNT
  4. RANK() 함수를 이용해 avgscore를 기준으로 순위 오름차순 정렬 
  5. CASE 문을 통해 조건에 맞는 속성 값 출력
  6. 여러 JOIN 문들

문제가 참 많았구나...;;반성하게 되는 회고글이 될 것 같다.

4번 스타벅스 키오스크 서비스 만들기

시연 영상

  1. 상품 수량 선택 후 "주문 추가" 클릭 시 주문 내역에 상품 정보 추가(이 때 주문한 수량은 0으로 초기화)
  2. 추가 된 상품의 금액 계산하여 합계에 표시
  3. 주문내역에 있는 상품 삭제 시 상품 삭제와 함께 금액 차감
  4. "주문하기" 클릭 시 상품 초기화

글로 정리하면서 미흡한 부분을 많이 발견한 것 같다.
부족한 부분을 더 채워나갈 수 있도록 더 노력해야겠다.

반응형

'Developer > Backend' 카테고리의 다른 글

Social login 중복되는 API 통합  (0) 2023.03.25
Comments