여러 그림을 보아도 이렇다할 규칙을 찾기 어려웠다.
그래서 그냥 원의 방정식을 사용해서 내부에 있는 점들만 *로 나올 수 있도록 했다
1. 입력값 = 반지름
입력값은 정수로 받는다
입력값이 커질수록 반지름이 커져 원의 범위가 넓어지는 형태
2. 일단 사각형을 작성하였다.
for (int i = -r; i <=r ; i++) {
for (int j = -r; j <=r ; j++) {
System.out.print("*");
}
System.out.println();
3
*******
*******
*******
*******
*******
*******
*******
3. 예를 들어, 입력값이 3인 경우에는|
점이 내부에 있으려면 다음식을 만족해야 한다.
x^2 + y^2 <= 9
y ^2 <= 9-x^2을 만족해야 한다.
-√ 9-x^2 <= y <= +√ 9-x^2
제곱근 자바에서 쓰는법 : Math.sqrt( )
double a = 16;
double b = 121;
double c = 10;
System.out.println(Math.sqrt(a)); //출력 4.0
System.out.println(Math.sqrt(b)); // 11.0
System.out.println(Math.sqrt(c)); // 3.1622776601683795
그 다음 if문을 사용해서, x좌표와 같은 역할을 하는 j의 범위를 한정시켰다
이렇게 하면 가로로 별을 찍을때, 이런 범위인 j만 "*"를 찍을 수 있다.
범위에 속하지 않으면, " " 공백이 찍힌다.
for (int i = -r; i <=r ; i++) {
for (int j = -r; j <=r ; j++) {
double squareRoot = Math.sqrt(r *r- i*i);
if(- squareRoot<= j && j <= squareRoot){
System.out.print("*");
}else{
System.out.print(" ");
}
}
System.out.println();
}
탐색 : 원과 최대한 가까운 점의 모임이 되려면?
1. 점과 공백들에게 공백을 넣어주기
for (int i = -r; i <=r ; i++) {
for (int j = -r; j <=r ; j++) {
double squareRoot = Math.sqrt(r *r- i*i);
if(- squareRoot<= j && j <= squareRoot){
System.out.print(" * "); //양쪽에 공백 빵빵이
}else{
System.out.print(" "); //양쪽에 공백 빵빵이
}
}
System.out.println();
어쨌든 내가 사용하고 있는 반복문은 j++이고, 정수형태로 점을 찍는 것이기 때문에
정말 촘촘하고 완전하게,
원 내부에 들어오는 점을 모아서
정말 원처럼 만드는 것은 쉽지 않다
하지만, 각 점과 점 사이에 간격을 만들어 주는 것은 어떨까?
=> 이유: 그냥 * 를 찍으면 세로줄 기준으로 기본적으로 생기는 간격때문에 찌그러진 타원 같이 보인다
=> 변화된 결과 : 좀 원형스러워졌다(?)
2. Scan 값에 * 20 정도를 해주어서, 좀더 큰 수가 들어갈 수 있도록 설정하여
원내부를 촘촘하게 만들어주기
Scanner scan = new Scanner(System.in);
int r = scan.nextInt() * 20;
최종코드
import java.util.Scanner;
public class 원 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int r = scan.nextInt() * 20;
//어쨋든 코드는 위에서 아래로 내려가니까
// y좌표는 사각형(높이가 2r인) 정도의 범위로만 한정하고
// x좌표는 실제 가로로 한줄씩 코드가 쓰일때마다 각 점이 공백이냐 *이냐에 따라 모양이 달라질것
for (int i = -r; i <=r ; i++) { //y좌표
for (int j = -r; j <=r ; j++) { //x좌표
double squareRoot = Math.sqrt(r *r- i*i);
if(- squareRoot<= j && j <= squareRoot){
System.out.print(" * ");
}else{
System.out.print(" ");
}
}
System.out.println();
}
}
}
//for (int i = -r; i <=r ; i++) {
// for (int j = -r; j <=r ; j++) {
// System.out.print("*");
// }
// System.out.println();
//3
// *******
// *******
// *******
// *******
// *******
// *******
// *******
'Java' 카테고리의 다른 글
enum 클래스 vs List 클래스 vs Map 클래스 (0) | 2023.08.30 |
---|---|
자바 - 객체참조 (0) | 2023.08.27 |
자바 별찍기 - 마름모 만들기 (0) | 2023.08.18 |
스캐너(Scanner) : java의 입력기능 (0) | 2023.08.13 |
Java 형변환 - 자동 형변환 vs 명시적 형변환 (0) | 2023.08.11 |