- 원의 크기 n을 입력한다.
- n X n 크기의 배열을 생성한다.
- 배열을 1, 2, 3, 4사분면으로 쪼개서 기능을 만든다.
- y가 0 ~ 반지름, x가 0 ~ 반지름인 범위를 2사분면으로 한다.
- y가 0 ~ 반지름, x가 반지름 ~ n인 범위를 1사분면으로 한다.
- y가 반지름 ~ n, x가 0 ~ 반지름인 범위를 3사분면으로 한다.
- y가 반지름 ~ n, x가 반지름 ~ n인 범위를 4사분면으로 한다.
- 각 사분면에 반복문을 돌려 모든 좌표를 확인한다.
- 좌표가 원의 둘레에 해당하면 '-'을 배열에 넣어준다.
- 좌표가 원의 둘레에 해당하지 않으면 ' '을 배열에 넣어준다.
- 배열을 출력한다.
입력
4
결과
--
- -
- -
--
- 프로그램이 실행될 때 태양, 지구, 달을 만든다.
- 태양의 크기 = 5, 지구의 크기 = 3, 달의 크기 = 1
- 각 행성은 '*'로 꽉 차게 만든다.
- 1,2,3,4 사분면으로 나눠서 원을 구하는 1단계 로직을 이용한다.
- 태양은 만들면 바로 태양계 배열에 넣는다.
- 태양계 배열은 지구와 달도 넣어줘야 하므로 static으로 선언한다.
- 지구의 공전 궤도의 지름은 183으로 한다.
- 태양을 한바퀴 돌면 365이므로 365 / 2 한 것을 반올림한 것을 지름으로 한다.
- 달의 공전 주기는 28로 한다.
- 달의 공전 주기는 27.3일이나 계산의 단순화를 위해 올림한다.
- 달의 공전 궤도 지름은 14이다.
- 태양계 배열의 크기는 198(183 + 14 + 1)으로 한다.
- '지구 공전 궤도 지름 + 달의 공전 궤도 지름 + 1(1부터 계산하기 때문)' 이다.
- 날짜를 입력받는다.
- String으로 받아서 숫자가 있으면 숫자를 정수형으로 변환하여 month와 date를 구한다.
- 1월 1일부터 입력받은 날짜까지의 일수를 구한다.
- 월 배열을 만든다.
- 배열은 0부터 시작하기 때문에 처음에는 0을 넣어주고 이후 월별 날짜 수를 넣는다.
- 입력받은 month 전까지 반복문을 이용해 일수를 구한다.
- 구한 일수에 date를 더해 최종 일수를 구한다.
- 월 배열을 만든다.
- 최종 일수(day)와 태양의 원점(solarXY)를 파라미터로 하여 지구가 공전한 위치(Point)를 구한다.
- 지구의 초기 위치(1월 1일)는 y가 solarXY와 같고, x가 지구 공전 궤도의 지름 + 달의 공전 궤도의 반지름과 같다.
- 365를 4등분 해서 day만큼 x, y의 위치를 이동시킨다.
- 태양계 배열에 지구의 위치를 찾아 넣는다.
- 최종 위치를 반환한다.
- 반환받은 지구의 위치와 day를 파라미터로 하여 달을 공전시킨다.
- 달의 초기 위치는 x가 지구위치.x + 달의 반지름과 같고, y가 지구위치.y와 같다.
- 28을 4등분 해서 day만큼 x, y의 위치를 이동시킨다.
- 태양계 배열에 달의 위치를 찾아 넣는다.
- 태양계 배열을 출력한다.
- 배열에 null이 있으면 공백(' ')으로 바꿔 넣는다.
입력
1월 1일
출력
*
*** *
***** *** *
*** *
*
- 프로그램을 실행시키면 태양, 태양계의 행성, 행성의 위성에 대한 enum 을 먼저 생성한다.
- 수성과 금성의 위성은 없고, 나머지 행성들에는 위성이 1개씩 있으며 radius는 2로 한다.
- 구현의 단순화를 위해 각 행성들의 공전 궤도의 반지름을 6의 배수로 정비례하도록 한다.
- 위성의 공전 주기는 '일'로 통일한다.(실제 공전 주기가 '시간'단위라면 '일'로 변환하고 올림한다.)
- 가상의 공전 궤도 둘레(round)는 radius * 4로 한다.
- 가상의 공전 궤도 반지름(radius), 실제 공전 주기(date), 이름(name), 유형(type)에 대해 정의한다.
- 태양 : 0, 0, "태양", "항성"
- 수성 : 6, 88, "수성", "행성"
- 금성 : 12, 225, "금성", "행성"
- 지구 : 18, 365, "지구", "행성"
- 화성 : 24, 687, "화성", "행성"
- 목성 : 30, 9380, "목성", "행성"
- 토성 : 36, 10585, "토성", "행성"
- 천왕성 : 42, 30660, "천왕성", "행성"
- 해왕성 : 48, 60225, "해왕성", "행성"
- 달 : 2, 27, "달", "위성"
- 포보스 : 2, 8 / 24 + 1, "포보스", "위성"
- 유로파 : 2, 85 / 24 + 1, "유로파", "위성"
- 타이탄 : 2, 16, "타이탄", "위성"
- 미란다 : 2, 34 / 24 + 1, "미란다", "위성"
- 트리톤 : 2, 141 / 24 + 1, "트리톤", "위성"
- 프로그램을 실행시키면 모든 항성, 행성, 위성의 객체를 생성한다.
- 날짜 계산을 위해 월 배열을 생성한다.
- 월 배열에 처음은 0을 넣고, 이후 1월부터 일수를 넣는다.
- 태양계 배열을 103의 크기로 생성한다.(천왕성의 radius를 48이라 하고, 트리톤의 radius가 2이므로 48 * 2 + 2 * 2 + 2보다 커야한다.)
- 태양을 태양계 배열의 중앙에 넣고 좌표를 반환한다.
- 태양은 "*", 행성은 "+", 위성은 "·" 모양으로 한다.
- 임의의 날짜(연, 월, 일)를 입력받는다.
- 연, 월, 일을 숫자로 변환한다.
- 1년 1월 1일부터 입력받은 임의의 날짜까지의 일수를 구한다.
- 일수를 구할 때 연도에서 -1을 하고 date에서 -1을 해야한다.(1년 1월 1일이 기준이기 때문이다.)
- 구한 일수를 파라미터로 하여 각 행성과 위성을 공전시킨다.
- 행성을 공전시켜 최종 좌표를 반환한다.
- enum에서 해당 생성의 radius와 round를 가져온다.
- 초기 좌표는 y가 태양의 y좌표와 같고, x가 태양의 x좌표 + radius와 같다.
- 가상의 공전 주기와 실제 공전 주기의 비율을 구해 day를 계산한다.
- ratio = round / dates;
- day = radio * day % round
- day, radius, y, x를 파라미터로 하여 행성을 공전시킨다.
- 나머지연산을 하여 구한 day는 radius * 4보다 작다.
- radius * 4 까지의 범위를 4등분 해서 x, y의 좌표가 시계방향으로 움직이도록 한다.
- 최종 좌표를 태양계 배열에 넣는다.(행성이 지구라면 지구 위쪽에 HERE! 이라는 메세지를 넣는다.)
- 최종 좌표를 반환한다.
- 받은 행성의 최종 좌표로 위성을 공전시킨다.
- enum에서 해당 생성의 radius와 round를 가져온다.
- 초기 좌표는 y가 행성의 y좌표와 같고, x가 행성의 x좌표 + radius와 같다.
- 가상의 공전 주기와 실제 공전 주기의 비율을 구해 day를 계산한다.
- ratio = round / dates;
- day = radio * day % round
- day, radius, y, x를 파라미터로 하여 위성을 공전시킨다.
- 나머지연산을 하여 구한 day는 radius * 4보다 작다.
- radius * 4 까지의 범위를 4등분 해서 x, y의 좌표가 시계방향으로 움직이도록 한다.
- 최종 좌표를 태양계 배열에 넣는다.
- 행성을 공전시켜 최종 좌표를 반환한다.
- 태양계 배열을 출력한다.
- 배열에 null이 있으면 공백(' ')으로 바꿔 넣는다.
입력
2년 3월 4일
결과
+ ·
+
+
* + ·
+
·
·
+ · +
HERE!
|
·V
+