From f4231064e76e1803d51b6c9e669f0e016ab55af8 Mon Sep 17 00:00:00 2001 From: TwooTwoo Date: Tue, 4 Mar 2025 17:01:05 +0900 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20=EC=82=AC=EB=8B=A4=EB=A6=AC=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5=201=EB=8B=A8=EA=B3=84=20=EA=B5=AC=ED=98=84-?= =?UTF-8?q?=20=EB=A7=A8=20=EC=99=BC=EC=AA=BD=EC=9D=B4=20=EB=A7=81=ED=81=AC?= =?UTF-8?q?=EA=B0=80=20=EC=9E=98=20=EB=B0=9C=EC=83=9D=ED=95=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/LadderApplication.java | 10 +++++ .../java/controller/LadderController.java | 21 +++++++++ src/main/java/model/Ladder.java | 22 +++++++++ src/main/java/model/Line.java | 45 +++++++++++++++++++ src/main/java/view/LadderOutputView.java | 31 +++++++++++++ 5 files changed, 129 insertions(+) create mode 100644 src/main/java/LadderApplication.java create mode 100644 src/main/java/controller/LadderController.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/view/LadderOutputView.java diff --git a/src/main/java/LadderApplication.java b/src/main/java/LadderApplication.java new file mode 100644 index 0000000..4930d1e --- /dev/null +++ b/src/main/java/LadderApplication.java @@ -0,0 +1,10 @@ +import controller.LadderController; + +public class LadderApplication { + public static void main(String[] args) { + LadderController ladderController = new LadderController(); + + ladderController.run(); + } + +} diff --git a/src/main/java/controller/LadderController.java b/src/main/java/controller/LadderController.java new file mode 100644 index 0000000..20fd532 --- /dev/null +++ b/src/main/java/controller/LadderController.java @@ -0,0 +1,21 @@ +package controller; + +import model.Ladder; +import model.Line; +import view.LadderOutputView; + +import java.util.List; + +public class LadderController { + LadderOutputView ladderOutputView = new LadderOutputView(); + + public void run() { + Ladder ladder = new Ladder(4, 4); + List lines = ladder.getLines(); + + for(Line line : lines) { + ladderOutputView.printLine(line.getLinks()); + } + } + +} diff --git a/src/main/java/model/Ladder.java b/src/main/java/model/Ladder.java new file mode 100644 index 0000000..f3677f6 --- /dev/null +++ b/src/main/java/model/Ladder.java @@ -0,0 +1,22 @@ +package model; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class Ladder { + private List lines; + + public Ladder(int width, int height) { + List lines = new ArrayList<>(); + for(int i = 0; i < height; i++) { + lines.add(new Line(width)); + } + + this.lines = Collections.unmodifiableList(lines); + } + + public List getLines() { + return List.copyOf(lines); + } +} diff --git a/src/main/java/model/Line.java b/src/main/java/model/Line.java new file mode 100644 index 0000000..f82beea --- /dev/null +++ b/src/main/java/model/Line.java @@ -0,0 +1,45 @@ +package model; + +import java.sql.Array; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Random; + +public class Line { + private static final Random random = new Random(); + + private final List links; + + public Line(int width) { + List links = new ArrayList<>(); + for (int i = 0; i < width-1; i++) { + links.add(getConnectDecider(i, links)); + } + + this.links = Collections.unmodifiableList(links); + } + + // 메서드명 미정 + private boolean getConnectDecider (int index, List links) { + if(!isConnectable(index, links)) { + return false; + } + // 랜덤 돌리고 + return random.nextBoolean(); + } + + // 연결 가능한지 검사 + private boolean isConnectable(int index, List links) { + return isFirstIndex(index) || !(links.get(index-1)); + } + + // 첫번째 인덱스인지 확인 + private boolean isFirstIndex(int index) { + return index == 0; + } + + public List getLinks() { + return List.copyOf(links); + } +} diff --git a/src/main/java/view/LadderOutputView.java b/src/main/java/view/LadderOutputView.java new file mode 100644 index 0000000..a182852 --- /dev/null +++ b/src/main/java/view/LadderOutputView.java @@ -0,0 +1,31 @@ +package view; + +import java.util.List; + +public class LadderOutputView { + + private static String DASH_COUPLER = "-----"; + private static String BLANK_COUPLER = " "; + + public void printLine(List line) { + StringBuilder output = new StringBuilder(); + output.append("|"); + + for(boolean isConnected : line) { + output.append(getJoiner(isConnected)); + output.append("|"); + } + + System.out.println(output); + } + + private String getJoiner(boolean isConnected) { + if(isConnected) { + return DASH_COUPLER; + } + return BLANK_COUPLER; + } + + + +} From 158b0ee73203966f1f0b5e5bb2b399a448788091 Mon Sep 17 00:00:00 2001 From: TwooTwoo Date: Sat, 8 Mar 2025 00:03:06 +0900 Subject: [PATCH 2/3] =?UTF-8?q?refactor=20:=20=EA=B3=B5=EC=A0=95=EC=84=B1?= =?UTF-8?q?=20=ED=96=A5=EC=83=81=20=EB=B0=8F=20=EC=9A=94=EA=B5=AC=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EA=B8=B0=EB=B0=98=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/LadderApplication.java | 2 +- .../java/controller/LadderController.java | 18 +++- src/main/java/dto/LineDto.java | 29 ++++++ src/main/java/model/Ladder.java | 5 +- src/main/java/model/Line.java | 90 +++++++++++++++---- src/main/java/model/Link.java | 39 ++++++++ src/main/java/model/LinkStatus.java | 10 +++ src/main/java/view/LadderOutputView.java | 42 ++++++--- 8 files changed, 198 insertions(+), 37 deletions(-) create mode 100644 src/main/java/dto/LineDto.java create mode 100644 src/main/java/model/Link.java create mode 100644 src/main/java/model/LinkStatus.java diff --git a/src/main/java/LadderApplication.java b/src/main/java/LadderApplication.java index 4930d1e..67f73e9 100644 --- a/src/main/java/LadderApplication.java +++ b/src/main/java/LadderApplication.java @@ -2,7 +2,7 @@ public class LadderApplication { public static void main(String[] args) { - LadderController ladderController = new LadderController(); + LadderController ladderController = LadderController.getInstance(); ladderController.run(); } diff --git a/src/main/java/controller/LadderController.java b/src/main/java/controller/LadderController.java index 20fd532..856f460 100644 --- a/src/main/java/controller/LadderController.java +++ b/src/main/java/controller/LadderController.java @@ -1,5 +1,6 @@ package controller; +import dto.LineDto; import model.Ladder; import model.Line; import view.LadderOutputView; @@ -7,14 +8,25 @@ import java.util.List; public class LadderController { - LadderOutputView ladderOutputView = new LadderOutputView(); + private static final LadderController ladderController = new LadderController(); + + private final LadderOutputView ladderOutputView = LadderOutputView.getInstance(); + + private LadderController() { + } + + public static LadderController getInstance() { + return ladderController; + } public void run() { Ladder ladder = new Ladder(4, 4); List lines = ladder.getLines(); - for(Line line : lines) { - ladderOutputView.printLine(line.getLinks()); + ladderOutputView.printResultHeader(); + for (Line line : lines) { + LineDto lineDto = LineDto.from(line); + ladderOutputView.printLine(lineDto); } } diff --git a/src/main/java/dto/LineDto.java b/src/main/java/dto/LineDto.java new file mode 100644 index 0000000..bcb17b2 --- /dev/null +++ b/src/main/java/dto/LineDto.java @@ -0,0 +1,29 @@ +package dto; + +import model.Line; +import model.Link; +import model.LinkStatus; + +import java.util.List; + +public class LineDto { + private final List linkExistCollection; + + private LineDto(List linkExistCollection) { + this.linkExistCollection = linkExistCollection; + } + + public static LineDto from(Line line) { + List linkExistCollection = line.getLinks().stream() + .map(Link::getLinkstatus) + .map(LinkStatus::isPresent) + .toList(); + + return new LineDto(linkExistCollection); + } + + public List getLinkExistCollection() { + return List.copyOf(linkExistCollection); + } + +} diff --git a/src/main/java/model/Ladder.java b/src/main/java/model/Ladder.java index f3677f6..c0df4f6 100644 --- a/src/main/java/model/Ladder.java +++ b/src/main/java/model/Ladder.java @@ -5,11 +5,11 @@ import java.util.List; public class Ladder { - private List lines; + private final List lines; public Ladder(int width, int height) { List lines = new ArrayList<>(); - for(int i = 0; i < height; i++) { + for (int i = 0; i < height; i++) { lines.add(new Line(width)); } @@ -19,4 +19,5 @@ public Ladder(int width, int height) { public List getLines() { return List.copyOf(lines); } + } diff --git a/src/main/java/model/Line.java b/src/main/java/model/Line.java index f82beea..126ecc5 100644 --- a/src/main/java/model/Line.java +++ b/src/main/java/model/Line.java @@ -1,45 +1,99 @@ package model; -import java.sql.Array; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Random; +import static model.LinkStatus.PRESENT; +import static model.LinkStatus.UNDEFINED; + public class Line { private static final Random random = new Random(); - private final List links; + private final List links; public Line(int width) { - List links = new ArrayList<>(); - for (int i = 0; i < width-1; i++) { - links.add(getConnectDecider(i, links)); + int size = width - 1; + List links = initializeLinks(size); + + setupLinks(links); + + this.links = List.copyOf(links); + } + + public List getLinks() { + return List.copyOf(links); + } + + private List initializeLinks(int size) { + List links = new ArrayList<>(); + for (int i = 0; i < size; i++) { + links.add(Link.getUndefinedLink()); } - this.links = Collections.unmodifiableList(links); + return List.copyOf(links); } - // 메서드명 미정 - private boolean getConnectDecider (int index, List links) { - if(!isConnectable(index, links)) { - return false; + private void setupLinks(List links) { + int index = getRandomStartIndex(links); + + while (containsUndefined(links)) { + boolean connectDecider = getConnectDecider(); + boolean connectable = isConnectable(index, links); + + Link link = links.get(index); + link.setLinkStatus(connectDecider, connectable); + + index = getNextIndex(index, links); } - // 랜덤 돌리고 + } + + private int getRandomStartIndex(List links) { + return random.nextInt(links.size()); + } + + private boolean containsUndefined(List links) { + return links.stream() + .anyMatch(link -> link.getLinkstatus() == UNDEFINED); + } + + private boolean getConnectDecider() { return random.nextBoolean(); } - // 연결 가능한지 검사 - private boolean isConnectable(int index, List links) { - return isFirstIndex(index) || !(links.get(index-1)); + private boolean isConnectable(int index, List links) { + if (isFirstIndex(index)) { + return isRightNotPresent(index, links); + } + if (isLastIndex(index, links)) { + return isLeftNotPresent(index, links); + } + + return isRightNotPresent(index, links) && isLeftNotPresent(index, links); } - // 첫번째 인덱스인지 확인 private boolean isFirstIndex(int index) { return index == 0; } - public List getLinks() { - return List.copyOf(links); + private boolean isLastIndex(int index, List links) { + return index == links.size() - 1; } + + private boolean isRightNotPresent(int index, List links) { + Link rightLink = links.get(index + 1); + + return rightLink.getLinkstatus() != PRESENT; + } + + private boolean isLeftNotPresent(int index, List links) { + Link leftLink = links.get(index - 1); + + return leftLink.getLinkstatus() != PRESENT; + } + + private int getNextIndex(int index, List linkStatuses) { + return ++index % linkStatuses.size(); + } + } diff --git a/src/main/java/model/Link.java b/src/main/java/model/Link.java new file mode 100644 index 0000000..cc007b2 --- /dev/null +++ b/src/main/java/model/Link.java @@ -0,0 +1,39 @@ +package model; + +public class Link { + private LinkStatus linkstatus; + + private Link(LinkStatus linkstatus) { + this.linkstatus = linkstatus; + } + + public static Link getUndefinedLink() { + return new Link(LinkStatus.UNDEFINED); + } + + public void setLinkStatus(boolean connectDecider, boolean connectable) { + validateUpdateStatus(); + + if (connectDecider && connectable) { + this.linkstatus = LinkStatus.PRESENT; + return; + } + + this.linkstatus = LinkStatus.ABSENT; + } + + public LinkStatus getLinkstatus() { + return linkstatus; + } + + private void validateUpdateStatus() { + if (isAlreadyFixed()) { + throw new UnsupportedOperationException("이미 값이 결정된 링크입니다"); + } + } + + private boolean isAlreadyFixed() { + return this.linkstatus != LinkStatus.UNDEFINED; + } + +} diff --git a/src/main/java/model/LinkStatus.java b/src/main/java/model/LinkStatus.java new file mode 100644 index 0000000..449209d --- /dev/null +++ b/src/main/java/model/LinkStatus.java @@ -0,0 +1,10 @@ +package model; + +public enum LinkStatus { + UNDEFINED, ABSENT, PRESENT; + + public boolean isPresent() { + return this == present; + } + +} diff --git a/src/main/java/view/LadderOutputView.java b/src/main/java/view/LadderOutputView.java index a182852..1463885 100644 --- a/src/main/java/view/LadderOutputView.java +++ b/src/main/java/view/LadderOutputView.java @@ -1,31 +1,47 @@ package view; -import java.util.List; +import dto.LineDto; public class LadderOutputView { - private static String DASH_COUPLER = "-----"; - private static String BLANK_COUPLER = " "; + private static final String INDENTATION = " "; + private static final String DASH_COUPLER = "-----"; + private static final String BLANK_COUPLER = " "; + private static final String PILLAR = "|"; - public void printLine(List line) { - StringBuilder output = new StringBuilder(); - output.append("|"); + private LadderOutputView() { + } + + private static final LadderOutputView ladderOutputView = new LadderOutputView(); - for(boolean isConnected : line) { - output.append(getJoiner(isConnected)); - output.append("|"); + public static LadderOutputView getInstance() { + return ladderOutputView; + } + + public void printResultHeader() { + System.out.println("실행결과"); + System.out.println(); + } + + public void printLine(LineDto lineDto) { + StringBuilder output = new StringBuilder() + .append(INDENTATION) + .append(PILLAR); + + for (boolean isExist : lineDto.getLinkExistCollection()) { + String coupler = getCoupler(isExist); + output.append(coupler) + .append(PILLAR); } System.out.println(output); } - private String getJoiner(boolean isConnected) { - if(isConnected) { + private String getCoupler(boolean isLinkExist) { + if (isLinkExist) { return DASH_COUPLER; } return BLANK_COUPLER; } - - } From fa2f63d2f6fbc92fc642f67ee7e58272eb5a0c1c Mon Sep 17 00:00:00 2001 From: TwooTwoo Date: Sat, 8 Mar 2025 00:21:54 +0900 Subject: [PATCH 3/3] =?UTF-8?q?fix=20:=20=EC=98=A4=ED=83=80=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/LinkStatus.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/model/LinkStatus.java b/src/main/java/model/LinkStatus.java index 449209d..479bf2f 100644 --- a/src/main/java/model/LinkStatus.java +++ b/src/main/java/model/LinkStatus.java @@ -4,7 +4,7 @@ public enum LinkStatus { UNDEFINED, ABSENT, PRESENT; public boolean isPresent() { - return this == present; + return this == PRESENT; } }