Tiny Star
본문 바로가기
Dev Log/Kotlin

[우테코 | 안드로이드] 코틀린 최종 코딩테스트 준비, 과제 모음

by 별터 2026. 1. 6.

이번 우테코 8기를 준비하며, 과제와 과제 요구사항을 모아보았습니다.

찾아보니 안드로이드 기수는 4기부터 생긴 것 같더라고요. 4기와 5기는 자바 베이스에 코딩을 했던 것 같아서 최근 기수인 6기와 7기 문제를 모아봤습니다.


1. [7기 최종] 📙 출석부

 

7기 문제는 구글링으로 찾은 pdf 가 있어 이를 첨부합니다.

https://github.com/woowacourse-precourse/kotlin-attendance-7

 

GitHub - woowacourse-precourse/kotlin-attendance-7

Contribute to woowacourse-precourse/kotlin-attendance-7 development by creating an account on GitHub.

github.com

[BE] 우테코 7기 최종 코테.pdf
0.52MB


2. [6기 최종] 🚨 개발자 비상근무

https://github.com/woowacourse-precourse/kotlin-oncall-6

 

GitHub - woowacourse-precourse/kotlin-oncall-6

Contribute to woowacourse-precourse/kotlin-oncall-6 development by creating an account on GitHub.

github.com

1. 기능 요구 사항

"서비스의 안정적인 운영을 위해 장애가 발생했을 때 대응할 수 있는 비상 근무 담당자를 배정하는 시스템을 구현한다."

비상 근무는 평일과 휴일의 근무 순번을 다르게 운영하며, 이를 통해 한 달 동안의 비상 근무표를 생성해야 한다.

📅 운영 규칙

1. 근무 시간 및 기간

  • 비상 근무는 24시간 단위로 운영된다.
  • 입력받은 월(Month)에 대해서만 비상 근무표를 생성한다. (연도는 고려하지 않는다.)

2. 평일과 휴일의 구분

  • 평일: 월요일 ~ 금요일 (단, 법정 공휴일은 제외)
  • 휴일: 토요일, 일요일, 법정 공휴일
  • 법정 공휴일:
    • 1월 1일: 신정
    • 3월 1일: 삼일절
    • 5월 5일: 어린이날
    • 6월 6일: 현충일
    • 8월 15일: 광복절
    • 10월 3일: 개천절
    • 10월 9일: 한글날
    • 12월 25일: 성탄절
    • 단, 위 날짜 외의 공휴일(설날, 추석 등)이나 대체 공휴일은 없다고 가정한다.

3. 근무자 배정 방식

  • 평일 순번휴일 순번을 각각 별도로 입력받아 운영한다.
  • 각 순번의 순서대로 하루에 한 명씩 배정한다.
  • 순번의 끝에 도달하면 다시 처음부터 순환한다.

⚠️ 연속 근무 불가 규정 (핵심)

비상 근무자는 어떤 경우에도 이틀 연속으로 근무할 수 없다. 순번대로 배정하는 과정에서 전날 근무자와 다음 날 근무자가 같을 경우, 다음 근무자의 순번을 그 다음 근무자와 바꾼(Swap) 뒤 배정한다.

  • 예시 상황:
    • 평일 순번: `준팍, 도밥, 고니, ...`
    • 휴일 순번: `수아, 루루, 고니, ...`
    • 상황: 5월 4일(목) 평일 근무자가 '고니'이고, 5월 5일(금, 어린이날) 휴일 근무 순번상 차례도 '고니'인 경우.
    • 처리: 5월 5일 근무자는 '고니'가 되면 안 되므로, 휴일 순번의 다음 사람인 '수아'가 5월 5일 근무를 선다. '고니'는 순서가 밀려 5월 6일(토) 근무자가 된다.
    • (즉, 휴일 순번 큐에서 `고니, 수아`의 순서가 일시적으로 `수아, 고니`로 바뀐다.)

2. 입출력 요구 사항

⌨️ 입력 양식

  1. 월(Month)과 시작 요일을 입력받는다. (쉼표로 구분)
  2. 평일 비상 근무 순서를 입력받는다. (쉼표로 구분, 닉네임은 최대 5자, 인원은 5명 이상 35명 이하)
    • 근무자 명단에 중복은 없다.
  3. 휴일 비상 근무 순서를 입력받는다.
    • 평일 순번의 인원과 동일하지 않을 수 있다.

🖥️ 출력 양식

  • 평일이면서 법정 공휴일인 경우, 요일 뒤에 `(휴일)`을 표기한다.
  • 형식: `[월]월 [일]일 [요일] [근무자]`

💻 실행 예시

비상 근무를 배정할 월과 시작 요일을 입력하세요> 5,월
평일 비상 근무 순번대로 사원 닉네임을 입력하세요> 준팍,도밥,고니,수아,루루,글로,솔로스타,우코,슬링키,참새,도리
휴일 비상 근무 순번대로 사원 닉네임을 입력하세요> 수아,루루,글로,솔로스타,우코,슬링키,참새,도리,준팍,도밥,고니

5월 1일 월 준팍
5월 2일 화 도밥
5월 3일 수 고니
5월 4일 목 수아
5월 5일 금(휴일) 루루
5월 6일 토 수아
5월 7일 일 글로
5월 8일 월 루루
5월 9일 화 글로
5월 10일 수 솔로스타
5월 11일 목 우코
5월 12일 금 슬링키
5월 13일 토 참새
5월 14일 일 도리
... (중략) ...
5월 31일 수 준팍

3. 프로그래밍 요구 사항

  • Kotlin 1.9.24 이상을 사용한다.
  • 프로그램 실행의 시작점은 `Application`의 `main()`이다.
  • `camp.nextstep.edu.missionutils`에서 제공하는 `Console` API를 사용하여 구현해야 한다.
  • [제약] 함수(또는 메서드)의 길이가 10라인을 넘어가지 않도록 구현한다.
  • [제약] `else` 예약어를 쓰지 않는다.
  • [제약] 도메인 로직에 단위 테스트를 구현해야 한다. 단, UI(System.out, System.in, Scanner) 로직은 제외한다.
  • [제약] 입출력을 담당하는 클래스를 별도로 구현한다.
  • [제약] `Enum`을 적용하여 관련 상수를 관리한다.
  • 사용자가 잘못된 값을 입력할 경우 `IllegalArgumentException`을 발생시킨 후, `[ERROR]`로 시작하는 에러 메시지를 출력하고 해당 부분부터 입력을 다시 받는다.

 

3. [7기 4주 차] 🏪 편의점

https://github.com/woowacourse-precourse/kotlin-convenience-store-7

 

GitHub - woowacourse-precourse/kotlin-convenience-store-7

Contribute to woowacourse-precourse/kotlin-convenience-store-7 development by creating an account on GitHub.

github.com

1. 기능 요구 사항

구매자의 할인 혜택과 재고 상황을 고려하여 최종 결제 금액을 계산하고 안내하는 결제 시스템을 구현한다.

🏪 재고 관리 및 프로모션

1. 재고 관리

  • 각 상품의 재고 수량을 관리한다.
  • 결제 시, 구매한 수량만큼 재고에서 차감한다.
  • [제약] 재고를 차감할 때 프로모션 재고를 먼저 차감하고, 부족할 경우 일반 재고를 차감한다.
  • `products.md` 파일에서 초기 재고 정보를 불러온다.

2. 프로모션 할인 (N+1)

  • `promotions.md` 파일에서 프로모션 정보를 불러온다. (예: 탄산2+1, 반짝1+1)
  • 오늘 날짜(`DateTimes.now()`)가 프로모션 기간 내에 포함된 경우에만 할인을 적용한다.
  • [상호작용 1] 프로모션 적용이 가능한 상품을 적게 가져온 경우, 혜택을 받기 위해 필요한 수량을 추가로 가져올지 묻는다.
    • 예: 2+1 상품을 2개만 가져온 경우 -> "현재 {상품명}은(는) 1개를 무료로 더 받을 수 있습니다. 추가하시겠습니까? (Y/N)"
  • [상호작용 2] 프로모션 재고가 부족하여 일부 수량을 정가로 결제해야 하는 경우, 결제 여부를 묻는다.
    • 예: "현재 {상품명} {수량}개는 프로모션 할인이 적용되지 않습니다. 그래도 구매하시겠습니까? (Y/N)"

3. 멤버십 할인

  • 프로모션이 적용되지 않은 금액의 30%를 할인받는다.
  • 프로모션 적용 후 남은 금액(정가 결제분)에 대해 할인이 들어간다.
  • [제약] 멤버십 할인의 최대 한도는 8,000원이다.

4. 결제 시스템

  • 사용자가 입력한 상품의 가격과 수량을 기반으로 최종 결제 금액을 계산한다.
  • 계산 공식:
    • 총구매액 = 상품별 가격 × 수량
    • 행사할인 = 증정된 상품 가격의 합
    • 멤버십할인 = (총구매액 - 행사상품 금액) × 30%
    • 최종결제금액 = 총구매액 - 행사할인 - 멤버십할인

2. 입출력 요구 사항

📂 제공 파일 (src/main/resources/)

1. products.md

name,price,quantity,promotion
콜라,1000,10,탄산2+1
콜라,1000,10,null
사이다,1000,8,탄산2+1
...

 

2. promotions.md

name,buy,get,start_date,end_date
탄산2+1,2,1,2024-01-01,2024-12-31
...

⌨️ 입력 양식

1. 구매할 상품과 수량

  • 형식: [상품명-수량],[상품명-수량]
  • 예시: [콜라-10],[사이다-3]

2. 여부 확인 (Y/N)

  • 프로모션 추가 수령 여부: (Y/N)
  • 프로모션 미적용 금액 결제 여부: (Y/N)
  • 멤버십 할인 적용 여부: (Y/N)
  • 추가 구매 여부 (영수증 출력 후): (Y/N)

🖥️ 출력 양식

1. 환영 인사 및 상품 목록

안녕하세요. W편의점입니다.
현재 보유하고 있는 상품입니다.

- 콜라 1,000원 10개 탄산2+1
- 콜라 1,000원 10개
- 사이다 1,000원 8개 탄산2+1
...

2. 결제 결과 (영수증)

==============W 편의점================
상품명		수량	금액
콜라		3	3,000
에너지바 		5	10,000
=============증	정===============
콜라		1
====================================
총구매액		8	13,000
행사할인			-1,000
멤버십할인			-3,000
내실돈			 9,000

3. 프로그래밍 요구 사항

  • Kotlin 1.9.24 이상.
  • `Application`의 `main()`에서 시작.
  • `camp.nextstep.edu.missionutils`의 `Console`, `DateTimes` API 사용.
  • [제약] `build.gradle` 변경 금지.
  • [제약] 함수(메서드) 길이 10라인 제한.
  • [제약] `else` 예약어 사용 금지.
  • [제약] `Enum` 사용.
  • [제약] 입출력 클래스(`InputView`, `OutputView`) 구현.
  • [제약] 사용자가 잘못된 값을 입력할 경우 `IllegalArgumentException` 발생 후 `[ERROR]` 메시지 출력 및 재입력.

4. [6기 4주 차]🎄 크리스마스 프로모션

https://github.com/woowacourse-precourse/kotlin-christmas-6

 

GitHub - woowacourse-precourse/kotlin-christmas-6

Contribute to woowacourse-precourse/kotlin-christmas-6 development by creating an account on GitHub.

github.com

1. 기능 요구 사항

"우테코 식당에서 12월 이벤트를 진행합니다. 12월 1일부터 12월 31일까지, 고객이 식당에 방문할 때 날짜와 메뉴를 입력하면 적용 가능한 모든 혜택을 계산하여 안내하는 프로그램을 만드세요."

📅 이벤트(할인) 규칙

1. 크리스마스 디데이 할인

  • 기간: 2023.12.1 ~ 2023.12.25
  • 1,000원으로 시작하여 매일 100원씩 할인 금액이 증가한다.
    • (1일: 1,000원, 2일: 1,100원, ..., 25일: 3,400원)
  • 총주문 금액에서 해당 금액만큼 할인한다.

2. 평일 할인 (일요일 ~ 목요일)

  • 기간: 2023.12.1 ~ 2023.12.31
  • 평일에는 디저트 메뉴를 메뉴 1개당 2,023원 할인한다.

3. 주말 할인 (금요일, 토요일)

  • 기간: 2023.12.1 ~ 2023.12.31
  • 주말에는 메인 메뉴를 메뉴 1개당 2,023원 할인한다.

4. 특별 할인 (별이 있는 날)

  • 기간: 2023.12.1 ~ 2023.12.31
  • 이벤트 달력에 별이 있으면 총주문 금액에서 1,000원 할인한다.
  • 별이 있는 날: 매주 일요일 + 크리스마스 당일(25일)

5. 증정 이벤트

  • 할인 전 총주문 금액이 12만 원 이상일 때, 샴페인 1개(25,000원)를 증정한다.

6. 이벤트 배지 부여

  • 총혜택 금액(할인 금액 + 증정 상품 가격)에 따라 배지를 부여한다.
    • 5천 원 이상: 별
    • 1만 원 이상: 트리
    • 2만 원 이상: 산타

📋 메뉴 데이터

  • [애피타이저] 양송이수프(6,000), 타파스(5,500), 시저샐러드(8,000)
  • [메인] 티본스테이크(55,000), 바비큐립(54,000), 해산물파스타(35,000), 크리스마스파스타(25,000)
  • [디저트] 초코케이크(15,000), 아이스크림(5,000)
  • [음료] 제로콜라(3,000), 레드와인(60,000), 샴페인(25,000)

⚠️ 주의 사항

  • 총주문 금액 10,000원 이상부터 이벤트가 적용된다.
  • 음료만 주문할 수 없다.
  • 메뉴는 한 번에 최대 20개까지만 주문할 수 있다.

2. 입출력 요구 사항

⌨️ 입력 양식

1. 방문 날짜

  • 12월 중 식당 예상 방문 날짜를 입력받는다. (1 ~ 31 숫자)
  • 범위 밖의 숫자 입력 시 에러 메시지 출력 후 재입력.

2. 주문 메뉴와 개수

  • 형식: 메뉴-개수,메뉴-개수 (예: 해산물파스타-2,레드와인-1,초코케이크-1)
  • 메뉴판에 없는 메뉴, 개수가 1 미만, 형식이 다른 경우 에러 메시지 출력 후 재입력.

🖥️ 출력 양식

1. 주문 메뉴 및 할인 전 총금액

<주문 메뉴>
티본스테이크 1개
바비큐립 1개
초코케이크 2개
제로콜라 1개

<할인 전 총주문 금액>
142,000원

 

2. 혜택 내역 (증정, 할인 상세)

<증정 메뉴>
샴페인 1개

<혜택 내역>
크리스마스 디데이 할인: -1,200원
평일 할인: -4,046원
특별 할인: -1,000원
증정 이벤트: -25,000원

(적용된 혜택이 없으면 "없음" 출력)

 

3. 최종 결과 (총혜택 금액, 결제 금액, 배지)

<총혜택 금액>
-31,246원

<할인 후 예상 결제 금액>
135,754원

<12월 이벤트 배지>
산타

3. 프로그래밍 요구 사항

  • Kotlin 1.9.24 이상 사용. (당시엔 Java 17이었으나 8기 기준 코틀린으로 연습)
  • `Application`의 `main()`에서 시작.
  • `camp.nextstep.edu.missionutils`의 `Console API` 사용.
  • [제약] `build.gradle` 변경 금지.
  • [제약] 함수(메서드) 길이 15라인 제한. (7기부터 10라인으로 줄었음)
  • [제약] `else` 예약어 사용 금지.
  • [제약] `Enum` 사용.
  • [제약] 입출력 클래스(`InputView`, `OutputView`) 구현.
  • [제약] 도메인 로직 단위 테스트 구현.

4기 5기와 깃허브 링크만 첨부하도록 하겠습니다.

[4기 페어 매칭 관리 애플리케이션]

https://github.com/woowacourse/java-pairmatching-precourse

 

GitHub - woowacourse/java-pairmatching-precourse

Contribute to woowacourse/java-pairmatching-precourse development by creating an account on GitHub.

github.com

 

[5기 점심 메뉴]

https://github.com/rhkrwngud445/kotlin-menu

 

GitHub - rhkrwngud445/kotlin-menu

Contribute to rhkrwngud445/kotlin-menu development by creating an account on GitHub.

github.com