Ex ) 3이상 80이하 값을 입력 받아서 입력값을 지름으로 하는 원을 출력한다.
Sol)
<hide/>
/**
* 1단계 콘솔로 원 그리기
*/
public class Circle {
static char[][] graph = new char[100][100];
public static int inputDiameter() {
System.out.println("원의 크기는?");
Scanner scanner = new Scanner(System.in);
int r;
try {
r = scanner.nextInt();
} catch (InputMismatchException e) {
throw new RuntimeException("[ERROR] 숫자만 입력 가능합니다.");
}
if (r < 1 || r > 80) {
throw new RuntimeException("[ERROR] 1이상 80 이하의 정수만 입력 가능합니다.");
}
return r;
}
public static char[][] drawTopCircle(int diameter) {
char[][] circle = new char[diameter][diameter];
int radiusIdx = diameter / 2;
for (int i = 0; i < radiusIdx; ++i) {
int tmpIdx = i + radiusIdx;
int min = Math.min(tmpIdx, diameter - 1 - tmpIdx);
int max = Math.max(tmpIdx, diameter - 1 - tmpIdx);
for (int j = min; j <= max; ++j) {
if (j == min || j == max) {
circle[i][j] = '-';
continue;
}
circle[i][j] = ' ';
}
}
return circle;
}
public static char[][] drawBottomCircle(char[][] circle, int diameter) {
int radiusIdx = diameter / 2;
for (int i = radiusIdx; i < diameter; ++i) {
int tmpIdx = i - radiusIdx;
int min = Math.min(tmpIdx, diameter - 1 - tmpIdx);
int max = Math.max(tmpIdx, diameter - 1 - tmpIdx);
for (int j = min; j <= max; ++j) {
if (j == min || j == max) {
circle[i][j] = '-';
continue;
}
circle[i][j] = ' ';
}
}
return circle;
}
public static void printCircle(char[][] circle) {
for (char[] row : circle) {
for (char c : row) {
if (c == '-' || c == '*') {
System.out.print(c);
continue;
}
System.out.print(" ");
}
System.out.println();
}
}
public static char[][] drawStar(int diameter) {
char[][] circle = new char[diameter][diameter];
int radiusIdx = diameter / 2;
for (int i = 0; i < radiusIdx; ++i) {
int tmpIdx = i + radiusIdx;
int min = Math.min(tmpIdx, diameter - 1 - tmpIdx);
int max = Math.max(tmpIdx, diameter - 1 - tmpIdx);
for (int j = min; j <= max; ++j) {
circle[i][j] = '*';
}
}
for (int i = radiusIdx; i < diameter; ++i) {
int tmpIdx = i - radiusIdx;
int min = Math.min(tmpIdx, diameter - 1 - tmpIdx);
int max = Math.max(tmpIdx, diameter - 1 - tmpIdx);
for (int j = min; j <= max; ++j) {
circle[i][j] = '*';
}
}
return circle;
}
public static void printCircle(char[][] circle) {
for (char[] row : circle) {
for (char c : row) {
if (c == '-' || c == '*') {
System.out.print(c);
continue;
}
System.out.print(" ");
}
System.out.println();
}
}
public static char[][] fillGraphWithCircle(int[] center, int diameter) {
int centerRow = center[0];
int centerCol = center[1];
char[][] circle = drawStar(diameter);
int radius = diameter / 2;
for (int i = centerRow - radius; i < centerRow - radius + diameter; ++i) {
for (int j = centerCol - radius; j < centerCol - radius + diameter; ++j) {
if (i < 0 || i >= graph.length || j < 0 || j >= graph[0].length) {
continue;
}
if (i - centerRow + radius < 0 || i - centerRow + radius >= circle.length
|| j - centerCol + radius < 0 || j - centerCol + radius >= circle[0].length) {
continue;
}
graph[i][j] = circle[i - centerRow + radius][j - centerCol + radius];
}
}
return graph;
}
public static void main(String[] args) {
int diameter = inputDiameter();
char[][] topCircle = drawTopCircle(diameter);
char[][] fullCircle = drawBottomCircle(topCircle, diameter);
printCircle(fullCircle);
}
}
- 메서드 라인 조건이 20라인 미만이라는 조건이 있어서 원의 윗부분 그리는 메서드와 아랫 부분 그리는 메서드를 나눴다.
- 배열을 출력하는 메서드 printCircle() 클래스도 따로 만들어준다.
- 3 ~ 80 이라는 조건에 대한 예외처리도 추가했다.
- 입력값이 숫자가 아닐 때, 3 ~ 80 사이를 벗어날 때 두 가지 모두 예외처리한다.
- 1단계에서는 drawStar(), fillGraphWithCircle() 메서드는 쓰지 않았다. 다른 단계에서 필요한 메서드
Note) 입출력 예시
<hide/>
원의 크기는?
10
--
- -
- -
- -
- -
- -
- -
- -
- -
--
1단계 회고
- 여기까지는 재밌고 여유로웠다.
- 원 그리기가 처음에 어떤 값을 넣어야할지 많이 헷갈렸는데 오른쪽 윗부분, 왼쪽 아랫부분의 열번호를 구하고 나니까 다음 부터는 쉬웠다.
- 그래프에 '-'또는 ' ' 넣는 부분을 메서드로 빼서 처리했으면 들여쓰기 조건(3 미만)을 만족했을텐데 급히 하다보니까 맞추지 못해서 아쉬웠다.
'Boot Camp > [코드스쿼드] Java 백엔드 테스트' 카테고리의 다른 글
[4단계] 태양계 애니메이션 - 미완성 (0) | 2022.12.08 |
---|---|
[3단계] 콘솔 태양계 출력 프로그램 완성 (0) | 2022.12.08 |
[2단계] 지구 태양 달의 위치 표시하기 (0) | 2022.12.08 |