아래 9개의 문제 중, 각 난이도 별 문제 하나씩을 선택하여 문제를 풀고 해설 코드를 캡쳐하여 제출해 주시기 바랍니다.
→ 올바른 선택 예시) 하-3, 중-1, 상-1
→ 잘못된 선택 예시) 하-1, 중-1, 중-2
(동일한 난이도 내 두 문제를 선택하는 것은 평가에 반영하지 않습니다. 반드시 각 난이도 별 문제 하나씩을 선택하여 주시기 바랍니다.)
모든 문제를 완벽하게 해결하지 못하셔도 괜찮습니다.
구현 하실 수 있는 만큼 코드를 작성하시고 캡쳐해주시기 바랍니다.
또한, 문제 해석과 관련된 질문은 답변드리기 어렵습니다.
양해 부탁드리겠습니다!
2차 프로그래밍 과제 리스트
난이도 | 문제 분류 | 문제 개요 |
하-1 | 자바 기초 & 알고리즘 | 정수 2개를 입력받고 5가지의 연산결과를 출력합니다. |
하-2 | 자바 기초 & 알고리즘 | 양의 정수를 입력받고 1부터 해당 입력값 사이의 모든 소수를 출력합니다. |
하-3 | 자바 기초 & 알고리즘 | 양의 정수를 입력받고 1부터 해당 입력값 사이의 모든 소수를 출력합니다.
(조건: -1을 입력하면 프로그램을 종료하며, 소수 판별 함수에 메모이제이션 기법을 적용하여 최적화 합니다.) |
중-1 | 객체지향 | 캐릭터는 무기를 교체할 수 있습니다. |
중-2 | 객체지향 | 캐릭터는 무기를 교체할 수 있습니다.
(조건: 얼음마법사의 기본무기는 얼음지팡이 입니다.) |
중-3 | 객체지향 | 캐릭터는 무기를 교체할 수 있습니다.
(조건: 캐릭터 클래스를 구상클래스로 구현하고, 캐릭터 객체 생성은 캐릭터공장 클래스에 의해 이뤄져야 합니다.) |
상-1 | 스프링부트 | 채팅 메세지를 작성하고 조회할 수 있습니다.
(조건: 조회 시 fromId 파라미터를 입력하면 모든 메세지들이 아닌 필터링 된 결과가 조회 되어야 합니다.) |
상-2 | 스프링부트 | 글을 작성하고 조회하고 수정할 수 있습니다.
(조건: 수정 시 수정 날짜가 갱신 되어야 합니다.) |
상-3 | 스프링부트 | 할 일을 작성하고 조회하고 삭제할 수 있습니다.
(조건: 삭제가 된 할 일의 번호는 할 일 생성 시에 다시 사용하지 않습니다.) |
하-1
정수 2개를 입력받고 5가지의 연산결과를 출력합니다.
•
5가지 연산
◦
합
◦
차
◦
곱
◦
나눈 몫
◦
나눈 나머지
•
두번째 입력값은 0이 될 수 없습니다.
◦
음수는 입력가능
•
입력된 데이터가 잘못 되었을 경우 오류메세지 출력 후 다시 입력 받습니다.
◦
입력된 데이터가 잘못된 경우
▪
정수가 아닌 경우
▪
두번째 입력값이 0인 경우
•
long 자료형이 아닌 int 자료형을 사용해주세요.
상세 설명 영상
입/출력 예시
== 입력 ==
숫자 1 입력 : [입력 1]
숫자 2 입력 : [입력 2]
== 결과 ==
- 합 : [결과 1]
- 차 : [결과 2]
- 곱 : [결과 3]
- 나눈 몫 : [결과 4]
- 나눈 나머지 : [결과 5]
Plain Text
복사
작동 예시
하-2
양의 정수를 입력받고 1부터 해당 입력값 사이의 모든 소수를 출력합니다.
•
소수: 1보다 큰 자연수 중 1과 자기 자신만을 약수로 가지는 수
•
long 자료형이 아닌 int 자료형을 사용해주세요.
상세 설명 영상
입/출력 예시
== 입력 ==
숫자 입력 : [입력 1]
== 결과 ==
- [결과 1]
- [결과 2]
- [결과 ..]
- [결과 n]
Plain Text
복사
작동 예시
하-3
양의 정수를 입력받고 1부터 해당 입력값 사이의 모든 소수를 출력합니다.
•
-1을 입력하면 프로그램을 종료합니다.
◦
즉, -1을 입력하기 전까지는 프로그램이 종료되지 않습니다.
•
입력된 수가 소수인지 판별하는 함수에 메모이제이션 기법을 적용하여 최적화합니다.
•
long 자료형이 아닌 int 자료형을 사용해주세요.
상세 설명 영상
입/출력 예시
== 입력 ==
숫자 입력 : [입력 1]
== 결과 ==
- [결과 1]
- [결과 2]
- [결과 ..]
- [결과 n]
== 입력 ==
숫자 입력 : [입력 1]
== 결과 ==
- [결과 1]
- [결과 2]
- [결과 ..]
- [결과 n]
== 입력 ==
숫자 입력 : [입력 2]
== 종료 ==
Plain Text
복사
작동 예시
중-1
캐릭터는 무기를 교체할 수 있습니다.
•
아래 코드가 작동하도록 Main 클래스 외에 나머지 부분을 코딩해주세요.
•
전사의 기본공격력은 10 입니다.
•
무기 추상클래스를 구현해주세요.
•
출력은 오직 System.out.printf 함수만 이용해주세요.
•
System.out.printf은 오직 무기 클래스에서만 사용할 수 있습니다.
상세 설명 영상
Main.java
public class Main {
public static void main(String[] args) {
전사 a전사 = new 전사();
a전사.공격();
// 출력 : 전사(이)가 칼(으)로 공격합니다.
// 출력 : 데미지 : 전사 기본공격력(10) * 칼 공격력(20) => 200
a전사.set무기(new 활());
a전사.공격();
// 출력 : 전사(이)가 활(으)로 공격합니다.
// 출력 : 데미지 : 전사 기본공격력(10) * 활 공격력(100) => 1000
}
}
Java
복사
중-2
캐릭터는 무기를 교체할 수 있습니다.
•
조건: 얼음마법사의 기본 무기는 얼음지팡이 입니다.
•
아래 코드가 작동하도록 Main 클래스 외에 나머지 부분을 코딩해주세요.
•
무기 추상클래스를 구현해주세요.
•
칼, 활, 불지팡이, 얼음지팡이 클래스를 구현해주세요.
•
캐릭터가 무기를 사용하는 구성으로 설계해주세요.
•
출력은 오직 System.out.println 함수만 이용해주세요.
•
System.out.println은 오직 무기 클래스에서만 사용할 수 있습니다.
•
얼음마법사는 초반 아이템이 얼음지팡이라는 점만 제외하면 나머지는 마법사와 같습니다.
상세 설명 영상
Main.java
// Main.java
public class Main {
public static void main(String[] args) {
캐릭터 a캐릭터 = new 전사();
a캐릭터.공격();
// 출력 : 전사(이)가 칼(으)로 공격합니다.
// 출력 : 데미지 : 전사 기본공격력(10) * 칼 공격력(20) => 200
a캐릭터.set무기(new 활());
a캐릭터.공격();
// 출력 : 전사(이)가 활(으)로 공격합니다.
// 출력 : 데미지 : 전사 기본공격력(10) * 활 공격력(100) => 1000
a캐릭터 = new 마법사();
a캐릭터.공격();
// 출력 : 마법사(이)가 불지팡이(으)로 공격합니다.
// 출력 : 데미지 : 마법사 기본공격력(5) * 불지팡이 공격력(50) => 250
a캐릭터 = new 얼음마법사();
a캐릭터.공격();
// 출력 : 마법사(이)가 얼음지팡이(으)로 공격합니다.
// 출력 : 데미지 : 마법사 기본공격력(5) * 얼음지팡이 공격력(60) => 300
}
}
Java
복사
중-3
캐릭터는 무기를 교체할 수 있습니다.
•
조건: 캐릭터 클래스를 추상 클래스로 구현하고, 캐릭터 객체 생성은 캐릭터 공장 클래스에 의해 이루어져야 합니다.
•
아래 코드가 작동하도록 Main 클래스 외에 나머지 부분을 코딩해주세요.
•
무기 추상클래스를 구현해주세요.
•
칼, 활, 불지팡이, 얼음지팡이 클래스를 구현해주세요.
•
캐릭터가 무기를 사용하는 구성으로 설계해주세요.
•
출력은 오직 System.out.printf 함수만 이용해주세요.
•
System.out.printf은 오직 무기 클래스에서만 사용할 수 있습니다.
•
얼음마법사는 초반 아이템이 얼음지팡이라는 점만 제외하면 나머지는 마법사와 같습니다.
•
각각의 캐릭터 객체는 2개이상 존재할 수 없습니다. 1개만 존재해야 합니다.
◦
캐릭터공장.get("활전사"); 코드를 2번 실행한다고 하더라도, 활전사 객체는 단 1명만 존재해야 합니다.
◦
캐릭터공장은 Map을 사용해서 한번 생성했던 객체들을 보관해야 합니다.
상세 설명 영상
입/출력 예시
// Main.java
public class Main {
public static void main(String[] args) {
캐릭터 a캐릭터 = 캐릭터공장.get("칼전사");
a캐릭터.공격();
// 출력 : 전사(이)가 칼(으)로 공격합니다.
// 출력 : 데미지 : 전사 기본공격력(10) * 칼 공격력(20) => 200
a캐릭터 = 캐릭터공장.get("활전사");
a캐릭터.공격();
// 출력 : 전사(이)가 활(으)로 공격합니다.
// 출력 : 데미지 : 전사 기본공격력(10) * 활 공격력(100) => 1000
a캐릭터 = a캐릭터 = 캐릭터공장.get("불마법사");
a캐릭터.공격();
// 출력 : 마법사(이)가 불지팡이(으)로 공격합니다.
// 출력 : 데미지 : 마법사 기본공격력(5) * 불지팡이 공격력(50) => 250
a캐릭터 = a캐릭터 = 캐릭터공장.get("얼음마법사");
a캐릭터.공격();
// 출력 : 마법사(이)가 얼음지팡이(으)로 공격합니다.
// 출력 : 데미지 : 마법사 기본공격력(5) * 얼음지팡이 공격력(60) => 300
}
}
Java
복사
상-1
채팅메세지를 작성하고 조회할 수 있습니다.
•
조건: 조회 시 fromId 파라미터를 입력하면, 모든 메시지들이 아닌 필터링 된 결과가 조회되어야 합니다.
•
스프링부트를 이용해서 채팅 메세지를 작성하고, 작성된 메세지들을 조회하는 API 엔드포인트 2개를 구현해주세요.
•
채팅 메세지 작성 요청 엔드포인트 : POST /chat/writeMessage
•
작성된 채팅 메세지들 조회 요청 엔드포인트 : GET /chat/messages
•
DB는 사용하지 않아도 됩니다.
•
요청과 응답형식 문제의 요구사항과 맞춰주세요.
상세 설명 영상
채팅 메시지 작성
[요청]
•
METHOD : POST
•
URL : /chat/writeMessage
•
Header
◦
Accept: application/json
◦
Content-Type: application/json
•
BODY : {"authorName": "작성자 명", "content": "채팅 메세지 내용"}
[응답]
{
"resultCode": "S-1",
"msg": "성공",
"data": {
"uuid": "80efe3fb-b0c3-4ea8-863e-c6c7e656c68e" /* 서버에서 입력받은 데이터로 채팅 메세지 객체를 만들 때, UUID 도 생성하여 추가한다. */
}
}
Java
복사
채팅 메시지 목록
[요청]
•
METHOD : GET
•
URL : /chat/message?fromUuid=[생략가능]
•
PARAMETERS
◦
필수
▪
없음
◦
옵션
▪
fromUuid
•
만약에 이 파리미터가 존재한다면, 해당 uuid 를 가지는 메세지를 기준으로 그 이후에 작성된 메세지들만 조회
•
이 파라미터가 없다면 전체 메세지들이 조회
•
Header
◦
Accept: application/json
[응답]
{
"resultCode": "S-1",
"msg": "성공",
"data": {
"messages": [
{
"uuid": "5682f525-dcd1-41db-bf80-750690688b4b",
"createDate": "2022-12-14 14:32:20",
"authorName": "홍길동",
"content": "내용 1"
},
{
"uuid": "1dc648c7-1649-4964-86ba-de596b6b7543",
"createDate": "2022-12-14 14:32:31",
"authorName": "임꺽정",
"content": "내용 2"
},
{
"uuid": "6cfc0f14-736a-43c4-8e21-7bbf84ec2a94",
"createDate": "2022-12-14 14:32:36",
"authorName": "홍길동",
"content": "내용 3"
},
{
"uuid": "bfac67a9-22c9-482a-b757-7879afe32325",
"createDate": "2022-12-14 14:32:38",
"authorName": "임꺽정",
"content": "내용 4"
},
{
"uuid": "7d59dbb5-1cb4-4eeb-a3c7-cbf28c9b9989",
"createDate": "2022-12-14 14:33:02",
"authorName": "홍길동",
"content": "내용 5"
},
{
"uuid": "5175b19b-e1da-4cb1-871e-4c7978d86fdb",
"createDate": "2022-12-14 14:36:10",
"authorName": "홍길동",
"content": "내용 6"
},
{
"uuid": "80efe3fb-b0c3-4ea8-863e-c6c7e656c68e",
"createDate": "2022-12-14 15:03:17",
"authorName": "홍길동",
"content": "내용 7"
}
]
}
}
Java
복사
Message.java
// Message.java
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;
import java.time.LocalDateTime;
import java.util.UUID;
@AllArgsConstructor
@Getter
@ToString
public class Message {
private final UUID uuid;
private final LocalDateTime createDate;
private final String authorName;
private final String content;
public Message(String authorName, String content) {
this(UUID.randomUUID(), LocalDateTime.now(), authorName, content);
}
}
Java
복사
상-2
글을 작성하고 조회하고 수정할 수 있습니다.
•
조건: 수정 시 수정날짜가 갱신되어야 합니다.
•
스프링부트를 이용해서 글을 작성하고, 작성된 글들을 조회하는 API를 구현해주세요.
•
작성된 글을 수정하는 API도 구현해주세요.
•
글 작성 API : POST /posts
•
글 수정 API : PATCH /posts/{글번호}
•
글들 조회 API : GET /posts
상세 설명 영상
글 작성
[요청]
•
METHOD : POST
•
URL : /posts
•
Header
◦
Accept: application/json
◦
Content-Type: application/json
•
BODY : {"subject": "제목", "content": "내용"}
[응답]
{
"resultCode": "S-1",
"msg": "성공",
"data": {
"id": 1 /* 서버에서 입력받은 데이터로 글 객체를 만들 때, id 도 생성하여 추가한다, id는 1씩 증가한다. */
}
}
Java
복사
채팅 메시지 목록
[요청]
•
METHOD : GET
•
URL : /posts
•
Header
◦
Accept: application/json
[응답]
{
"resultCode": "S-1",
"msg": "성공",
"data": {
"messages": [
{
"id": 1,
"createDate": "2022-12-14 14:32:20",
"modifyDate": "2022-12-14 14:32:20",
"subject": "제목 1",
"content": "내용 1"
},
{
"id": 2,
"createDate": "2022-12-14 14:32:31",
"modifyDate": "2022-12-14 14:32:31",
"subject": "제목 2",
"content": "내용 2"
},
{
"id": 3,
"createDate": "2022-12-14 14:32:36",
"modifyDate": "2022-12-14 14:32:36",
"subject": "제목 3",
"content": "내용 3"
},
{
"id": 4,
"createDate": "2022-12-14 14:32:38",
"modifyDate": "2022-12-14 14:32:38",
"subject": "제목 4",
"content": "내용 4"
},
{
"id": 5,
"createDate": "2022-12-14 14:33:02",
"modifyDate": "2022-12-14 14:33:02",
"subject": "제목 5",
"content": "내용 5"
},
{
"id": 6,
"createDate": "2022-12-14 14:36:10",
"modifyDate": "2022-12-14 14:36:10",
"subject": "제목 6",
"content": "내용 6"
},
{
"id": 7,
"createDate": "2022-12-14 15:03:17",
"modifyDate": "2022-12-14 15:03:17",
"subject": "제목 7",
"content": "내용 7"
}
]
}
}
Java
복사
글 수정
[요청]
•
METHOD : PATCH
•
URL : /posts/{글 번호}
•
Header
◦
Accept: application/json
◦
Content-Type: application/json
•
BODY : {"subject": "제목 NEW", "content": "내용 NEW"}
•
특이사항
◦
해당 글의 modifyDate 가 최신날짜로 갱신되어야 합니다.
[응답]
{
"resultCode": "S-1",
"msg": "성공",
"data": {}
}
Java
복사
Post.java
// Post.java
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;
import java.time.LocalDateTime;
@AllArgsConstructor
@Getter
@ToString
public class Post {
private final Long id;
private final LocalDateTime createDate;
private final LocalDateTime modifyDate;
private final String subject;
private final String content;
}
Java
복사
상-3
할 일을 작성하고 조회하고 삭제할 수 있습니다.
•
조건: 삭제가 된 할 일의 번호는 할 일 생성 시에 다시 사용하지 않습니다.
•
스프링부트를 이용해서 할 일을 작성하고, 작성된 할 일들을 조회하는 API를 구현해주세요.
•
작성된 할 일을 삭제하는 API도 구현해주세요.
•
할 일 작성 API : POST /todos
•
할 일 삭제 API : DELETE /todos/{글번호}
•
할 일들 조회 API : GET /todos
상세 설명 영상
할 일 작성
요청
•
METHOD : POST
•
URL : /todos
•
Header
◦
Accept: application/json
◦
Content-Type: application/json
•
BODY : {"content": "할일 내용", "performDate": "2022-12-18 12:00:00"}
◦
content : 할일내용
◦
performDate : 할일을 언제 해야 하는지(날짜 yyyy-MM-dd HH:mm:ss)
응답
{
"resultCode": "S-1",
"msg": "성공",
"data": {
"id": 1 /* 서버에서 입력받은 데이터로 글 객체를 만들 때, id 도 생성하여 추가한다, id는 1씩 증가한다. */
}
}
Java
복사
할 일들 조회
[요청]
•
METHOD : GET
•
URL : /todos
•
Header
◦
Accept: application/json
[응답]
{
"resultCode": "S-1",
"msg": "성공",
"data": {
"todos": [
{
"id": 1,
"createDate": "2022-12-14 14:32:20",
"performDate": "2022-12-18 12:12:12",
"content": "할일 1"
},
{
"id": 2,
"createDate": "2022-12-14 14:32:31",
"performDate": "2022-12-18 12:12:12",
"content": "할일 2"
},
{
"id": 3,
"createDate": "2022-12-14 14:32:36",
"performDate": "2022-12-18 12:12:12",
"content": "할일 3"
},
{
"id": 4,
"createDate": "2022-12-14 14:32:38",
"performDate": "2022-12-18 12:12:12",
"content": "할일 4"
},
{
"id": 5,
"createDate": "2022-12-14 14:33:02",
"performDate": "2022-12-18 12:12:12",
"content": "할일 5"
},
{
"id": 6,
"createDate": "2022-12-14 14:36:10",
"performDate": "2022-12-18 12:12:12",
"content": "할일 6"
},
{
"id": 7,
"createDate": "2022-12-14 15:03:17",
"performDate": "2022-12-18 12:12:12",
"content": "할일 7"
}
]
}
}
Java
복사
할 일 삭제
[요청]
•
METHOD : DELETE
•
URL : /todos/{글번호}
•
Header
◦
Accept: application/json
◦
Content-Type: application/json
•
BODY : none
[응답]
{
"resultCode": "S-1",
"msg": "성공",
"data": null
}
Java
복사
Todo.java
// Todo.java
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;
import java.time.LocalDateTime;
@AllArgsConstructor
@Getter
@ToString
public class Todo {
private final Long id;
private final LocalDateTime createDate;
private final LocalDateTime performDate;
private final String content;
}
Java
복사