Boot Camp/[코드스쿼드] Java 백엔드 테스트

[1단계] 콘솔로 원 출력하기

계란💕 2022. 12. 8. 19:09

  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 미만)을 만족했을텐데 급히 하다보니까 맞추지 못해서 아쉬웠다.