## 과제_1 : 제네릭 리스트 구현
목표 : 제네릭을 사용하여 다양한 데이터 타입을 저장할 수 있는 배열 리스트와 연결 리스트를 구현한다.
요구사항 :
다음 코드를 참고하여, 제네릭을 사용하여 다양한 데이터 타입을 저장할 수 있는 배열 리스트와 연결 리스트를 구현한다.
```java
public class MyArrayList {
private int[] array;
private int size;
public MyArrayList() {
array = new int[10];
size = 0;
}
public void add(int value) {
if (size >= array.length) {
int[] newArray = new int[array.length * 2];
System.arraycopy(array, 0, newArray, 0, array.length);
array = newArray;
}
array[size++] = value;
}
public int get(int index) {
return array[index];
}
public int size() {
return size;
}
public void remove(int index) {
System.arraycopy(array, index + 1, array, index, size - index - 1);
size--;
}
}
```
```java
public class MyLinkedList {
public class Node {
int data;
Node next;
public Node(int data) {
this.data = data;
}
}
private Node head;
private int size;
public void add(int value) {
Node newNode = new Node(value);
if (head == null) {
head = newNode;
} else {
Node last = head;
while (last.next != null) {
last = last.next;
}
last.next = newNode;
}
size++;
}
public int get(int index) {
Node node = head;
for (int i = 0; i < index; i++) {
node = node.next;
}
return node.data;
}
public int size() {
return size;
}
public void remove(int index) {
if (index == 0) {
head = head.next;
} else {
Node node = head;
for (int i = 0; i < index - 1; i++) {
node = node.next;
}
node.next = node.next.next;
}
size--;
}
}
```
## 과제_2 : WORDLE 게임 구현
목표 : 단어 맞추기 게임을 구현해본다.
요구사항 : 다음 조건을 만족하는 단어 맞추기 게임을 구현한다.
1. 프로그램은 5자리 단어 목록에서 무작위로 단어 하나를 선택해야 한다.
- 단어 목록은 원하는 대로 설정한다.
- ex) `SHAKE`, `SHARE`, `PANIC`, `AMUSE`, `SHADE`, ...
2. 사용자는 총 6번의 기회로 단어를 추측할 수 있다.
3. 각 추측 후, 프로그램은 다음과 같이 피드백을 제공해야 한다:
- 정확한 위치에 있는 글자는 녹색 배경으로 표시한다.
- 단어에 포함되나 위치가 틀린 글자는 노란색 배경으로 표시한다.
- 단어에 포함되지 않은 글자는 아무런 색상 변화 없이 표시한다.
- 색상 표현 방법은 ANSI 색상 코드를 사용한다.
4. 사용자가 정답을 맞히면, `Correct! You win!`을 출력하고 게임을 종료한다.
5. 6번의 시도 후에도 정답을 맞히지 못하면, `Wrong! The correct word is [정답].`을 출력하고 게임을 종료한다.
6. 입력받은 추측 단어는 대문자로 변환되어 처리해야 한다.
### ANSI 색상 코드 사용법
ANSI 색상 코드 : 터미널이나 콘솔에서 문자의 색상과 스타일을 제어하는 데 사용되는 특별한 코드
이 코드는 ANSI(Escape Sequence) 이스케이프 시퀀스라는 표준에 기반하여, 텍스트의 색상, 밝기, 스타일 등을 변경할 수 있다.
ANSI 색상 코드란 텍스트 색상을 변경하기 위한 특수한 문자열이다.
ANSI 색상 코드를 사용하여 Java 콘솔 응용 프로그램에서 텍스트 색상을 변경할 수 있다.
| 색상 | 코드 |
| --- | --- |
| 녹색 | `\u001b[42m` |
| 노란색 | `\u001b[43m` |
| 리셋 | `\u001b[0m` |
배경을 `녹색` -> `노란색` -> `리셋`하는 예시 코드
```java
System.out.print("\u001b[42m" + "이 텍스트는 녹색 배경을 가지고 있다." + "\u001b[43m" + "이 텍스트는 노란색 배경을 가지고 있다." + "\u001b[0m" + "이 텍스트는 기본색상이다.");
```
> ANSI는 위의 내용보다 훨씬 더 많은 기능을 제공하므로, 더 많은 정보를 원한다면 구글링을 통해 찾아보자.
---
## 과제_1 : 제네릭 리스트 구현 모범답안
```java
public class MyArrayList<T> {
private T[] array;
private int size;
public MyArrayList() {
array = (T[]) new Object[10];
size = 0;
}
public void add(T value) {
if (size >= array.length) {
T[] newArray = (T[]) new Object[array.length * 2];
System.arraycopy(array, 0, newArray, 0, array.length);
array = newArray;
}
array[size++] = value;
}
public T get(int index) {
return array[index];
}
public int size() {
return size;
}
public void remove(int index) {
System.arraycopy(array, index + 1, array, index, size - index - 1);
size--;
}
}
```
```java
public class MyLinkedList<T> {
public class Node {
T data;
Node next;
public Node(T data) {
this.data = data;
}
}
private Node head;
private int size;
public void add(T value) {
Node newNode = new Node(value);
if (head == null) {
head = newNode;
} else {
Node last = head;
while (last.next != null) {
last = last.next;
}
last.next = newNode;
}
size++;
}
public T get(int index) {
Node node = head;
for (int i = 0; i < index; i++) {
node = node.next;
}
return node.data;
}
public int size() {
return size;
}
public void remove(int index) {
if (index == 0) {
head = head.next;
} else {
Node node = head;
for (int i = 0; i < index - 1; i++) {
node = node.next;
}
node.next = node.next.next;
}
size--;
}
}
```
---
## 과제_2 : WORDLE 게임 구현 모범 답안
```java
import java.util.Scanner;
class Wordle
{
public static void main(String[] args)
{
final String BG_GREEN = "\u001b[42m";
final String BG_YELLOW = "\u001b[43m";
final String RESET = "\u001b[0m";
System.out.println("WORDLE!");
String[] words = {"SHAKE", "SHARE", "PANIC", "AMUSE", "SHADE"};
int wIndex = (int)(Math.random() * words.length);
String correct = words[wIndex];
Scanner sc = new Scanner(System.in);
String guess = "";
// Loop for six guesses
for(int round=0;round<6;round++)
{
System.out.print("Please guess. > ");
guess = sc.nextLine().toUpperCase();
// Create a loop to iterate through each letter
for(int i=0;i<5;i++)
{
if(guess.substring(i, i+1).equals(correct.substring(i, i+1)))
{
// Letter matches
System.out.print(BG_GREEN + guess.substring(i, i+1) + RESET);
}
else if(correct.indexOf(guess.substring(i, i+1)) > -1)
{
// Letter is in word, but different location
System.out.print(BG_YELLOW + guess.substring(i, i+1) + RESET);
}
else
{
// Letter not in word
System.out.print(guess.substring(i, i+1));
}
}
System.out.println("");
// If the guess is correct
if(guess.equals(correct))
{
System.out.println("Correct! You win!");
break;
}
}
// Print correct answer if player loses
if(!guess.equals(correct))
{
System.out.println("Wrong! The correct word is " + correct + ".");
}
}
}
```