Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .idea/encodings.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions .idea/gradle.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions .idea/runConfigurations/Application.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 6 additions & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,14 @@ repositories {

dependencies {
testImplementation(platform("org.junit:junit-bom:5.10.0"))
testImplementation("org.junit.jupiter:junit-jupiter:5.10.0")
testImplementation("org.junit.jupiter:junit-jupiter")
}

tasks.test {
useJUnitPlatform()
}
}

tasks.withType<JavaCompile> {
options.encoding = "UTF-8"
}
16 changes: 16 additions & 0 deletions src/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
//TIP 코드를 <b>실행</b>하려면 <shortcut actionId="Run"/>을(를) 누르거나
// 에디터 여백에 있는 <icon src="AllIcons.Actions.Execute"/> 아이콘을 클릭하세요.
public class Main {

public static void main(String[] args) {
//TIP 캐럿을 강조 표시된 텍스트에 놓고 <shortcut actionId="ShowIntentionActions"/>을(를) 누르면
// IntelliJ IDEA이(가) 수정을 제안하는 것을 확인할 수 있습니다.
System.out.printf("Hello and welcome!");

for (int i = 1; i <= 5; i++) {
//TIP <shortcut actionId="Debug"/>을(를) 눌러 코드 디버그를 시작하세요. 1개의 <icon src="AllIcons.Debugger.Db_set_breakpoint"/> 중단점을 설정해 드렸습니다
// 언제든 <shortcut actionId="ToggleLineBreakpoint"/>을(를) 눌러 중단점을 더 추가할 수 있습니다.
System.out.println("i = " + i);
}
}
}
8 changes: 5 additions & 3 deletions src/main/java/mission/Application.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package mission;

public class Application {
public static void main(String[] args) {
//Todo: 프로그램 구현
}
public static void main(String[] args) {
Controller controller = new Controller();
controller.run();
}
}

20 changes: 20 additions & 0 deletions src/main/java/mission/AsciiDigit.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package mission;

public class AsciiDigit {
public static String[] get(char c){
// 각 숫자 문자에 대한 ASCII 아트 정의 (한 줄씩 개행 없이 표현)
return switch (c) {
case '0' -> new String[]{"◼◼◼", "◼ ◼", "◼ ◼", "◼ ◼", "◼◼◼"};
case '1' -> new String[]{"◼", "◼", "◼", "◼", "◼"};
case '2' -> new String[]{"◼◼◼", " ◼", "◼◼◼", "◼ ", "◼◼◼"};
case '3' -> new String[]{"◼◼◼", "◼ ", "◼◼◼", "◼ ", "◼◼◼"};
case '4' -> new String[]{"◼ ◼", "◼ ◼", "◼◼◼", " ◼", " ◼"};
case '5' -> new String[]{"◼◼◼", "◼ ", "◼◼◼", " ◼", "◼◼◼"};
case '6' -> new String[]{"◼ ", "◼ ", "◼◼◼", "◼ ◼", "◼◼◼"};
case '7' -> new String[]{"◼◼◼", " ◼", " ◼", " ◼", " ◼"};
case '8' -> new String[]{"◼◼◼", "◼ ◼", "◼◼◼", "◼ ◼", "◼◼◼"};
case '9' -> new String[]{"◼◼◼", "◼ ◼", "◼◼◼", " ◼", " ◼"};
default -> new String[]{" ", " ", " ", " ", " "};
};
}
}
35 changes: 35 additions & 0 deletions src/main/java/mission/Controller.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package mission;
import java.util.Scanner;
public class Controller {
private final Scanner scanner = new Scanner(System.in);
private final Model model = new Model();

public void run() {
System.out.println("프린터를 실행합니다.");
while (true) {
View.printMenu();
int option = View.inputInt(scanner);
if (option == 1) print();
if (option == 2) View.printInk(model.getInk());
if (option == 3) {
model.replaceInk();
System.out.println("잉크를 교체하였습니다.");
}
if (option == 4) break;
}
}

private void print() {
String digits = View.inputDigits(scanner);
int width = View.inputWidth(scanner);
String[] output = model.printDigits(digits, width);
for (String line : output) {
if (!model.useInk(line)) {
System.out.println("잉크가 부족해 출력이 중단되었습니다.");
return;
}
System.out.println(line);
}
System.out.println("출력이 완료되었습니다.");
}
}
54 changes: 54 additions & 0 deletions src/main/java/mission/Model.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package mission;

public class Model {
private static final int MAX_INK = 1000;
private int ink = MAX_INK;

public String[] printDigits(String input, int width) {
StringBuilder[] result = new StringBuilder[0];

int numChunks = (int) Math.ceil((double) input.length() / width);
result = new StringBuilder[numChunks * 5];
for (int i = 0; i < result.length; i++) {
result[i] = new StringBuilder();
}

for (int chunkIdx = 0; chunkIdx < numChunks; chunkIdx++) {
int start = chunkIdx * width;
int end = Math.min(start + width, input.length());
String chunk = input.substring(start, end);

for (int row = 0; row < 5; row++) {
for (int j = 0; j < chunk.length(); j++) {
char digit = chunk.charAt(j);
String[] art = AsciiDigit.get(digit);
result[chunkIdx * 5 + row].append(art[row]).append(" ");
}
}
}

String[] output = new String[result.length];
for (int i = 0; i < result.length; i++) {
output[i] = result[i].toString();
}
return output;
}

public boolean useInk(String line) {
int count = (int) line.codePoints()
.mapToObj(cp -> String.valueOf((char) cp))
.filter(s -> s.equals("◼"))
.count();
if (ink < count) return false;
ink -= count;
return true;
}

public int getInk() {
return ink;
}

public void replaceInk() {
ink = MAX_INK;
}
}
26 changes: 26 additions & 0 deletions src/main/java/mission/View.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package mission;
import java.util.Scanner;

public class View {
public static void printMenu() {
System.out.println("사용할 기능을 입력해주세요. 1) 출력, 2) 잉크 잔량 확인, 3) 잉크 교체, 4) 프로그램 종료");
}

public static int inputInt(Scanner scanner) {
return Integer.parseInt(scanner.nextLine());
}

public static String inputDigits(Scanner scanner) {
System.out.println("출력할 문자를 입력해주세요.");
return scanner.nextLine();
}

public static int inputWidth(Scanner scanner) {
System.out.println("용지 크기를 입력해주세요.");
return Integer.parseInt(scanner.nextLine());
}

public static void printInk(int ink) {
System.out.println("잉크 잔량 : " + ink + "/1000");
}
}
40 changes: 0 additions & 40 deletions src/test/java/mission/AsciiGeneratorTest.java

This file was deleted.

60 changes: 60 additions & 0 deletions src/test/java/mission/PrinterServiceTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package mission;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

public class PrinterServiceTest {

private Model model;

@BeforeEach
void setup() {
model = new Model();
}

@Test
public void inkStartsAtMaximum() {
assertEquals(1000, model.getInk());
}

@Test
public void inkDecreasesOnPrint() {
String[] lines = model.printDigits("0", 1);
for (String line : lines) {
model.useInk(line);
}
assertTrue(model.getInk() < 1000);
}

@Test
public void canReplaceInk() {
String[] lines = model.printDigits("88888888", 8);
for (String line : lines) {
model.useInk(line);
}
assertTrue(model.getInk() < 1000);
model.replaceInk();
assertEquals(1000, model.getInk());
}

@Test
public void preventPrintWhenInkIsLow() {
for (int i = 0; i < 100; i++) {
String[] lines = model.printDigits("8", 1);
for (String line : lines) {
model.useInk(line);
}
}
String[] lines = model.printDigits("8", 1);
boolean result = model.useInk(lines[0]);
assertFalse(result); // 잉크가 부족하므로 false 반환해야 함
}

@Test
public void printDigitsGeneratesFiveLines() {
String[] output = model.printDigits("123", 3);
assertEquals(5, output.length);
}

}