From 2803607d5f778d8d139b419fb197fd16a282bcb3 Mon Sep 17 00:00:00 2001 From: ralph Date: Fri, 7 Mar 2025 00:34:22 +0900 Subject: [PATCH 1/4] made by Joshua --- src/main/java/Application.java | 11 ++++++ src/main/java/model/Ladder.java | 30 ++++++++++++++ src/main/java/model/Line.java | 55 ++++++++++++++++++++++++++ src/main/java/model/LineGenerator.java | 18 +++++++++ src/main/java/model/Lines.java | 42 ++++++++++++++++++++ 5 files changed, 156 insertions(+) create mode 100644 src/main/java/Application.java create mode 100644 src/main/java/model/Ladder.java create mode 100644 src/main/java/model/Line.java create mode 100644 src/main/java/model/LineGenerator.java create mode 100644 src/main/java/model/Lines.java diff --git a/src/main/java/Application.java b/src/main/java/Application.java new file mode 100644 index 0000000..94e89b2 --- /dev/null +++ b/src/main/java/Application.java @@ -0,0 +1,11 @@ +import model.Ladder; + +public class Application { + public static void main(String[] args) { + int width = 4; + int height = 4; + + Ladder ladder = Ladder.of(height, width); + ladder.print(); + } +} \ No newline at end of file diff --git a/src/main/java/model/Ladder.java b/src/main/java/model/Ladder.java new file mode 100644 index 0000000..62714e4 --- /dev/null +++ b/src/main/java/model/Ladder.java @@ -0,0 +1,30 @@ +package model; + +import java.util.ArrayList; +import java.util.List; + +public class Ladder { + private final Lines lines; + + public Ladder(List lines) { + this.lines = new Lines(lines); + } + + public static Ladder of(int height, int width) { + LineGenerator lineGenerator = new LineGenerator(); + List lines = new ArrayList<>(); + + for (int i = 0; i < height; i++) { + lines.add(new Line(lineGenerator.createRandomBoolean(width))); + } + + return new Ladder(lines); + } + + public void print() { + for (Line line : lines.getLines()) { + line.print(); + } + + } +} \ No newline at end of file diff --git a/src/main/java/model/Line.java b/src/main/java/model/Line.java new file mode 100644 index 0000000..a55cb41 --- /dev/null +++ b/src/main/java/model/Line.java @@ -0,0 +1,55 @@ +package model; + +import java.util.List; +import java.util.stream.IntStream; + +public class Line { + private static final String SPACE = " |"; + private static final String BRIDGE = "-----|"; + private static final String BAR = "|"; + + //TODO: first-class collection + private final List points; + + public Line(List points) { + validatePoints(points); + this.points = List.copyOf(points); + + } + + private void validatePoints(List points){ + if (!(isTrueSequence(points) && isIncludeTrue(points))) { + throw new IllegalArgumentException("points는 True가 없거나 연속된 True를 가지고 있습니다."); + } + } + + private Boolean isTrueSequence(List points){ + + return IntStream.range(1, points.size()) + .noneMatch(i -> points.get(i) && points.get(i-1)); + } + + public Boolean isIncludeTrue(List points){ + + return points.stream().anyMatch(Boolean::booleanValue); + } + + public Boolean getValue(int index) { + return points.get(index); + } + + public void print() { + System.out.print(BAR); + for (Boolean point : points) { + System.out.print(getSymbol(point)); + }System.out.println(); + } + + + private String getSymbol(Boolean point) { + if (point) { + return BRIDGE; + } + return SPACE; + } +} diff --git a/src/main/java/model/LineGenerator.java b/src/main/java/model/LineGenerator.java new file mode 100644 index 0000000..2540a6d --- /dev/null +++ b/src/main/java/model/LineGenerator.java @@ -0,0 +1,18 @@ +package model; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class LineGenerator { + public List createRandomBoolean(int width) { + Random random = new Random(); + List booleans= new ArrayList<>(); + + for (int i = 0; i < width-1; i++) { + booleans.add(random.nextBoolean()); + } + + return booleans; + } +} diff --git a/src/main/java/model/Lines.java b/src/main/java/model/Lines.java new file mode 100644 index 0000000..f110949 --- /dev/null +++ b/src/main/java/model/Lines.java @@ -0,0 +1,42 @@ +package model; + +import java.util.ArrayList; +import java.util.List; + +public class Lines { + private final List lines; + + public Lines(List lines) { + isNotIncludeTrueLine(lines); + this.lines = lines; + } + + private Boolean isNotIncludeTrueLine(List lines){ + for (int i = 0; i < lines.size(); i++) { + List seperatedLine = seperateLines(lines, i); + + return isIncludeTrue(seperatedLine); + } + + return false; + } + + private List seperateLines(List lines, int number){ + List seperatedLine = new ArrayList<>(); + for (Line line : lines) { + seperatedLine.add(line.getValue(number)); + } + + return seperatedLine; + } + + private Boolean isIncludeTrue(List points){ + + return points.stream().anyMatch(Boolean::booleanValue); + } + + public List getLines() { + return lines; // 저장된 Line 객체 리스트를 반환 + } + +} From 0fd7cbe5e77a977c8642a8b50a2bc9ea2bb24556 Mon Sep 17 00:00:00 2001 From: ralph Date: Fri, 7 Mar 2025 23:41:07 +0900 Subject: [PATCH 2/4] Pair.add(Joshua) --- build.gradle | 3 ++ src/main/java/Application.java | 13 +++-- src/main/java/model/Ladder.java | 27 +++------- src/main/java/model/LadderGenerator.java | 7 +++ src/main/java/model/LadderValidator.java | 32 ++++++++++++ src/main/java/model/Line.java | 46 +++-------------- src/main/java/model/LineGenerator.java | 19 +++---- src/main/java/model/Lines.java | 29 +---------- .../java/model/ReservedPositionGenerator.java | 50 +++++++++++++++++++ src/main/java/model/SingleLineGenerator.java | 28 +++++++++++ src/main/java/utils/ExceptionHandler.java | 12 +++++ src/main/java/view/LadderView.java | 31 ++++++++++++ 12 files changed, 196 insertions(+), 101 deletions(-) create mode 100644 src/main/java/model/LadderGenerator.java create mode 100644 src/main/java/model/LadderValidator.java create mode 100644 src/main/java/model/ReservedPositionGenerator.java create mode 100644 src/main/java/model/SingleLineGenerator.java create mode 100644 src/main/java/utils/ExceptionHandler.java create mode 100644 src/main/java/view/LadderView.java diff --git a/build.gradle b/build.gradle index 239f9e7..6302621 100644 --- a/build.gradle +++ b/build.gradle @@ -14,6 +14,9 @@ dependencies { testImplementation platform('org.assertj:assertj-bom:3.25.1') testImplementation('org.junit.jupiter:junit-jupiter') testImplementation('org.assertj:assertj-core') + implementation 'ch.qos.logback:logback-classic:1.5.6' + implementation 'ch.qos.logback:logback-core:1.5.6' + implementation 'org.slf4j:slf4j-api:2.1.0-alpha1' } test { diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 94e89b2..22e760f 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -1,11 +1,14 @@ import model.Ladder; +import utils.ExceptionHandler; +import view.LadderView; public class Application { public static void main(String[] args) { - int width = 4; - int height = 4; - - Ladder ladder = Ladder.of(height, width); - ladder.print(); + try { + Ladder ladder = Ladder.of(4, 4); + LadderView.printLadder(ladder); + } catch (Exception e) { + ExceptionHandler.handleException(e); + } } } \ No newline at end of file diff --git a/src/main/java/model/Ladder.java b/src/main/java/model/Ladder.java index 62714e4..e6fee46 100644 --- a/src/main/java/model/Ladder.java +++ b/src/main/java/model/Ladder.java @@ -1,30 +1,17 @@ package model; -import java.util.ArrayList; -import java.util.List; - public class Ladder { private final Lines lines; - public Ladder(List lines) { - this.lines = new Lines(lines); + public Ladder(Lines lines) { + this.lines = lines; } - public static Ladder of(int height, int width) { - LineGenerator lineGenerator = new LineGenerator(); - List lines = new ArrayList<>(); - - for (int i = 0; i < height; i++) { - lines.add(new Line(lineGenerator.createRandomBoolean(width))); - } - - return new Ladder(lines); + public static Ladder of(int width, int height) { + return new Ladder(LadderGenerator.generate(width, height)); } - public void print() { - for (Line line : lines.getLines()) { - line.print(); - } - + public Lines getLines() { + return lines; } -} \ No newline at end of file +} diff --git a/src/main/java/model/LadderGenerator.java b/src/main/java/model/LadderGenerator.java new file mode 100644 index 0000000..7fe2252 --- /dev/null +++ b/src/main/java/model/LadderGenerator.java @@ -0,0 +1,7 @@ +package model; + +public class LadderGenerator { + public static Lines generate(int width, int height) { + return LineGenerator.generate(width, height); + } +} diff --git a/src/main/java/model/LadderValidator.java b/src/main/java/model/LadderValidator.java new file mode 100644 index 0000000..8211983 --- /dev/null +++ b/src/main/java/model/LadderValidator.java @@ -0,0 +1,32 @@ +package model; + +import java.util.*; +import java.util.stream.*; + +public class LadderValidator { + private static final Random RANDOM = new Random(); + + public static void validate(List lines, int width) { + IntStream.rangeClosed(0, width) + .forEach(i -> validateColumn(lines, i, width)); + } + + private static void validateColumn(List lines, int col, int width) { + boolean emptyColumn = lines.stream().noneMatch(line -> hasBridgeAt(line, col, width)); + if (emptyColumn) { + connect(lines.get(RANDOM.nextInt(lines.size())), col, width); + } + } + + private static boolean hasBridgeAt(Line line, int col, int width) { + if (col == 0) return line.hasBridgeAt(col); + if (col == width) return line.hasBridgeAt(col - 1); + return line.hasBridgeAt(col - 1) || line.hasBridgeAt(col); + } + + + private static void connect(Line line, int col, int width) { + if (col == width) line.setBridgeAt(col - 1); + else line.setBridgeAt(col); + } +} diff --git a/src/main/java/model/Line.java b/src/main/java/model/Line.java index a55cb41..46cdef1 100644 --- a/src/main/java/model/Line.java +++ b/src/main/java/model/Line.java @@ -1,55 +1,23 @@ package model; -import java.util.List; -import java.util.stream.IntStream; +import java.util.*; public class Line { - private static final String SPACE = " |"; - private static final String BRIDGE = "-----|"; - private static final String BAR = "|"; - - //TODO: first-class collection private final List points; public Line(List points) { - validatePoints(points); - this.points = List.copyOf(points); - - } - - private void validatePoints(List points){ - if (!(isTrueSequence(points) && isIncludeTrue(points))) { - throw new IllegalArgumentException("points는 True가 없거나 연속된 True를 가지고 있습니다."); - } + this.points = points; } - private Boolean isTrueSequence(List points){ - - return IntStream.range(1, points.size()) - .noneMatch(i -> points.get(i) && points.get(i-1)); + public List getPoints() { + return points; } - public Boolean isIncludeTrue(List points){ - - return points.stream().anyMatch(Boolean::booleanValue); - } - - public Boolean getValue(int index) { + public boolean hasBridgeAt(int index) { return points.get(index); } - public void print() { - System.out.print(BAR); - for (Boolean point : points) { - System.out.print(getSymbol(point)); - }System.out.println(); - } - - - private String getSymbol(Boolean point) { - if (point) { - return BRIDGE; - } - return SPACE; + public void setBridgeAt(int index) { + points.set(index, true); } } diff --git a/src/main/java/model/LineGenerator.java b/src/main/java/model/LineGenerator.java index 2540a6d..e666dce 100644 --- a/src/main/java/model/LineGenerator.java +++ b/src/main/java/model/LineGenerator.java @@ -1,18 +1,19 @@ package model; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; +import java.util.*; public class LineGenerator { - public List createRandomBoolean(int width) { - Random random = new Random(); - List booleans= new ArrayList<>(); - for (int i = 0; i < width-1; i++) { - booleans.add(random.nextBoolean()); + public static Lines generate(int width, int height) { + List> reserved = ReservedPositionGenerator.generate(width - 1, height); + List lines = new ArrayList<>(); + + for (int row = 0; row < height; row++) { + Line line = SingleLineGenerator.generate(width - 1, reserved.get(row)); + lines.add(line); } - return booleans; + LadderValidator.validate(lines, width - 1); + return new Lines(lines); } } diff --git a/src/main/java/model/Lines.java b/src/main/java/model/Lines.java index f110949..287fb87 100644 --- a/src/main/java/model/Lines.java +++ b/src/main/java/model/Lines.java @@ -1,42 +1,15 @@ package model; -import java.util.ArrayList; import java.util.List; public class Lines { private final List lines; public Lines(List lines) { - isNotIncludeTrueLine(lines); this.lines = lines; } - private Boolean isNotIncludeTrueLine(List lines){ - for (int i = 0; i < lines.size(); i++) { - List seperatedLine = seperateLines(lines, i); - - return isIncludeTrue(seperatedLine); - } - - return false; - } - - private List seperateLines(List lines, int number){ - List seperatedLine = new ArrayList<>(); - for (Line line : lines) { - seperatedLine.add(line.getValue(number)); - } - - return seperatedLine; - } - - private Boolean isIncludeTrue(List points){ - - return points.stream().anyMatch(Boolean::booleanValue); - } - public List getLines() { - return lines; // 저장된 Line 객체 리스트를 반환 + return lines; } - } diff --git a/src/main/java/model/ReservedPositionGenerator.java b/src/main/java/model/ReservedPositionGenerator.java new file mode 100644 index 0000000..b8440bc --- /dev/null +++ b/src/main/java/model/ReservedPositionGenerator.java @@ -0,0 +1,50 @@ +package model; + +import java.util.*; +import java.util.stream.*; + +public class ReservedPositionGenerator { + private static final Random random = new Random(); + + public static List> generate(int width, int height) { + List> reserved = initializeReservedList(height); + List positions = createShuffledPositions(width); + + assignPositions(reserved, positions); + System.out.println(reserved); + return reserved; + } + + private static List> initializeReservedList(int height) { + return IntStream.range(0, height) + .mapToObj(i -> new HashSet()) + .collect(Collectors.toList()); + } + + private static List createShuffledPositions(int width) { + List positions = IntStream.range(0, width) + .boxed() + .collect(Collectors.toList()); + + positions.add(random.nextInt(width)); + + do { + Collections.shuffle(positions, random); + } while (isSequence(positions)); + + return positions; + } + + private static boolean isSequence(List numbers) { + return IntStream.range(0, numbers.size() - 1) + .anyMatch(i -> numbers.get(i).equals(numbers.get(i + 1))); + } + + + + private static void assignPositions(List> reserved, List positions) { + for (int i = 0; i < reserved.size(); i++) { + reserved.get(i).add(positions.get(i)); + } + } +} diff --git a/src/main/java/model/SingleLineGenerator.java b/src/main/java/model/SingleLineGenerator.java new file mode 100644 index 0000000..b158a62 --- /dev/null +++ b/src/main/java/model/SingleLineGenerator.java @@ -0,0 +1,28 @@ +package model; + +import java.util.*; +import java.util.stream.*; + +public class SingleLineGenerator { + private static final Random RANDOM = new Random(); + + public static Line generate(int width, Set reserved) { + List points = new ArrayList<>(Collections.nCopies(width, false)); + + reserved.forEach(i -> points.set(i, true)); + System.out.println(points); + IntStream.range(0, width).forEach(i -> { + if (!points.get(i) && isNotOverlap(points, i)) { + points.set(i, RANDOM.nextBoolean()); + } + }); + + return new Line(points); + } + + private static boolean isNotOverlap(List points, int i) { + if (i < points.size() -1 && points.get(i+1)) return false; + if (i > 0 && points.get(i - 1)) return false; + return true; + } +} diff --git a/src/main/java/utils/ExceptionHandler.java b/src/main/java/utils/ExceptionHandler.java new file mode 100644 index 0000000..7156a5e --- /dev/null +++ b/src/main/java/utils/ExceptionHandler.java @@ -0,0 +1,12 @@ +package utils; + +import org.slf4j.*; + +public class ExceptionHandler { + private static final Logger logger = LoggerFactory.getLogger(ExceptionHandler.class); + + public static void handleException(Exception e) { + System.err.println("시스템 오류 : " + e.getMessage()); + logger.error("시스템 오류 : ", e); + } +} diff --git a/src/main/java/view/LadderView.java b/src/main/java/view/LadderView.java new file mode 100644 index 0000000..08d760a --- /dev/null +++ b/src/main/java/view/LadderView.java @@ -0,0 +1,31 @@ +package view; + +import model.*; + +public class LadderView { + private static final String BRIDGE = "-----|"; + private static final String SPACE = " |"; + private static final String BAR = "|"; + + public static void printLadder(Ladder ladder) { + printLines(ladder.getLines()); + } + + private static void printLines(Lines lines) { + lines.getLines().forEach(LadderView::printLine); + } + + private static void printLine(Line line) { + System.out.print(BAR); + line.getPoints().forEach(LadderView::printPoint); + System.out.println(); + } + + private static void printPoint(Boolean point) { + if (point) { + System.out.print(BRIDGE); + return; + } + System.out.print(SPACE); + } +} From 12055bd2aff93131c0fee1a248f48bec9f8e914a Mon Sep 17 00:00:00 2001 From: ralph Date: Fri, 7 Mar 2025 23:45:04 +0900 Subject: [PATCH 3/4] [edit] space convention --- src/main/java/Application.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 22e760f..2efec5d 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -11,4 +11,4 @@ public static void main(String[] args) { ExceptionHandler.handleException(e); } } -} \ No newline at end of file +} From 2157ad187945ae3d988726367571c50dcfcaee05 Mon Sep 17 00:00:00 2001 From: ralph Date: Sat, 8 Mar 2025 00:25:54 +0900 Subject: [PATCH 4/4] =?UTF-8?q?[edit]=20=EC=A3=BC=EC=84=9D=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/ReservedPositionGenerator.java | 2 +- src/main/java/model/SingleLineGenerator.java | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/model/ReservedPositionGenerator.java b/src/main/java/model/ReservedPositionGenerator.java index b8440bc..7772094 100644 --- a/src/main/java/model/ReservedPositionGenerator.java +++ b/src/main/java/model/ReservedPositionGenerator.java @@ -11,7 +11,7 @@ public static List> generate(int width, int height) { List positions = createShuffledPositions(width); assignPositions(reserved, positions); - System.out.println(reserved); + return reserved; } diff --git a/src/main/java/model/SingleLineGenerator.java b/src/main/java/model/SingleLineGenerator.java index b158a62..bbdfbe2 100644 --- a/src/main/java/model/SingleLineGenerator.java +++ b/src/main/java/model/SingleLineGenerator.java @@ -10,7 +10,7 @@ public static Line generate(int width, Set reserved) { List points = new ArrayList<>(Collections.nCopies(width, false)); reserved.forEach(i -> points.set(i, true)); - System.out.println(points); + IntStream.range(0, width).forEach(i -> { if (!points.get(i) && isNotOverlap(points, i)) { points.set(i, RANDOM.nextBoolean()); @@ -21,8 +21,9 @@ public static Line generate(int width, Set reserved) { } private static boolean isNotOverlap(List points, int i) { - if (i < points.size() -1 && points.get(i+1)) return false; + if (i < points.size() - 1 && points.get(i + 1)) return false; if (i > 0 && points.get(i - 1)) return false; + return true; } }