티스토리 뷰
728x90
문제
https://www.acmicpc.net/problem/2447
풀이
고려해야할 점
- *를 어떤 방법으로 찍을 것인가
- 결과 출력
알고리즘
- 재귀
풀이 설명
1. * 찍기
먼저 n*n 크기의 2차원 배열을 선언하고 여기에 출력 값을 저장한다. 재귀함수를 통해 *을 찍어야 하는 곳의 위치를 구한 뒤 해당 위치에 *을 할당하고 배열을 출력한다.
재귀함수는 f(x,y,d)의 형식으로 호출한다. x, y는 x, y 좌표이며 d는 처음에는 입력 값의 지수(입력 = 3^m에서 m의 값)를 할당해 준 다음 재귀 호출시마다 값을 1씩 감소한다.
x,y | x+3^m,y | x+2*3^m ,y |
x, y+ 3^m | x+2*3^m ,y+ 3^m | |
x, y+2* 3^m | x+3^m, y+2*3^m | x+2*3^m , y+2* 3^m |
함수 호출 시 d의 값이 0이 될 경우 해당 좌표애 *을 찍는다.
2. 출력
출력 때문에 시간 초과가 되었다. 2차원 배열의 최대 크기가 (3^8)^2이며 이때 실행시간이 오래 걸리는 print 함수를 사용하며 시간 초과로 실패한다. 그러므로 StringBuilder로 출력 값을 저장한 다음 마지막에 한 번에 출력하는 방식으로 바꾸었다.
코드
import java.util.Scanner;
import java.util.Arrays;
import java.lang.Math;
class Main {
public static void main(String []args) {
//입력
Scanner sc = new Scanner(System.in);
StringBuilder sb = new StringBuilder();
int n = sc.nextInt();
int m = 0, temp = n;
//3^m, 지수 구하기
while(temp!=1) {
temp = temp/3;
m++;
}
// n*n 2차원 배열의 값을 " "로 초기화
String[][] arr = new String[n][n];
for(int i = 0; i<n;i++) Arrays.fill(arr[i], " ");
// 재귀 함수
star(0,0, m, arr);
//출력
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++ ) {
sb.append(arr[i][j]);
}
sb.append("\n");
}
System.out.print(sb);
}
// 재귀 함수
public static void star(int x, int y,int d, String[][] arr) {
//d==0일 때 별표 찍기
if(d==0) {
arr[x][y] = "*";
return;
}
//재귀 호출
int a = (int)Math.pow(3, d-1);
star(x,y,d-1,arr);
star(x+a,y,d-1,arr);
star(x+2*a,y,d-1,arr);
star(x,y+a,d-1,arr);
star(x,y+2*a,d-1,arr);
star(x+a,y+2*a,d-1,arr);
star(x+2*a,y+a,d-1,arr);
star(x+2*a,y+2*a,d-1,arr);
}
}
728x90
'알고리즘 > 코딩테스트' 카테고리의 다른 글
[백준]2568번 전깃줄-2 문제 풀이 (0) | 2024.10.29 |
---|---|
[백준] 7578번 공장 문제 풀이 (0) | 2024.10.28 |
[프로그래머스]요격시스템 (1) | 2024.04.05 |
[프로그래머스]아날로그 시계 (0) | 2024.04.02 |
[프로그래머스] 도넛과 막대 그래프 (0) | 2024.03.28 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- 코딩테스트
- 백준
- dataframe
- 인프런강의
- it도서큐레이션
- 알고리즘
- 더오름
- 티스토리챌린지
- Python
- 백준알고리즘
- django
- numpy
- 프로그래머스
- ssafy기자단
- 인프런
- 위니브
- 알고리즘이론
- 위니브엠베서더
- 파이썬
- SSAFY
- 웹프로그래밍
- 오블완
- 웹개발
- 인프런강의후기
- 전자회로
- 웹
- 생성형 AI
- SSAFYcial
- 제주코딩베이스캠프
- PANDAS
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
글 보관함
250x250