728x90
반응형
2024.09.08기준 - 골드4
728x90
백준, BEAKJOON, BOJ, JAVA, 자바
풀이
이 문제는 예제를 보고 규칙을 찾아내 수를 입력받으면 규칙에 맞게 출력하는 문제입니다.
1. 우선 재귀할 베이스로 사용할 삼각형을 먼저 만들어 주었습니다.
// 우선 삼각형 모양을 먼저 입력시켜줬습니다.
sb.append(first());
// 기본적으로 삼각형을 만들어줄 함수.
private static String first() {
StringBuilder sub = new StringBuilder();
// \n이 들어가면 그 만큼 길이가 길어져 한 줄의 문자열로 만들어서 계산을 진행합니다.
sub.append(" * ");
sub.append(" * * ");
sub.append("*****");
return sub.toString();
}
2. 입력 받은 수가 3이라면 그대로 출력하고 아니라면 규칙에 맞게 만들어주는 반복문을 호출합니다.
// n이 3일 때에는 그대로 출력만 하면되고, 3보다 높다면 반복문을 통해 원하는 출력을 만들어줍니다.
if (n > 3) {
StringBuilder sub;
// 반복 횟수를 구해줍니다.
int renum = 0;
for (int i = 0; i <= 10; i++) {
if (3 * Math.pow(2, i) == n) {
renum = i;
break;
}
}
// 반복 횟수만큼 모양을 만들어줍니다.
for (int i = 1; i <= renum; i++) {
sub = new StringBuilder();
sub.append(sb.toString());
sb = new StringBuilder();
sb.append(second(sub.toString(), i));
}
}
2-1. 입력받는 값은 3 * 2^n의 값이기 때문에 반복 횟수를 따로 구해주었습니다.
2-2. 반복 횟수만큼 정해진 규칙대로 모양을 만들어 줬습니다.
// 반복 횟수만큼 규칙을 적용해 원하는 모양을 만들어주는 함수.
private static String second(String str, int re) {
StringBuilder sub = new StringBuilder();
int h = 3 * (int) Math.pow(2, re - 1); // 현재 만들어지는 모양의 높이
int rePow = (int) Math.pow(2, re); // 2^반복횟수를 많이 사용하여 변수로 설정.
int index = 0; // 0 ~ h / 2를 만들어 줄 index
int index1 = 0; // h / 2 ~ h까지에서 0 ~ w / 2까지 모양을 만들어 줄 index
int index2 = 0; // h / 2 ~ h까지에서 w / 2 ~ w까지 모양을 만들어 줄 index
for (int i = 0; i < 2 * h; i++) {
for (int j = 1; j <= rePow * 5 + rePow - 1; j++) {
if (i < h) { // 기존의 모양을 중앙에 배치해주는 조건문
if (3 * Math.pow(2, re) / 2 < j && j < rePow * 5 + rePow - 3 * Math.pow(2, re) / 2) {
sub.append(str.charAt(index++));
} else {
sub.append(" ");
}
} else { // 그 이후로 2개의 기존의 모양을 이어 붙이는 조건문
if (j <= str.length() / h) {
sub.append(str.charAt(index1++));
} else if (j == str.length() / h + 1) {
sub.append(" ");
} else {
sub.append(str.charAt(index2++));
}
}
}
}
return sub.toString();
}
2-3. 제가 접근한 방법은 사진과 같이 1과 2를 나누어 모양을 만들어 주었습니다.
2-4. 1번 같은 경우는 기존 모양을 가운데에 배치만 시키면 되기 때문에 규칙에 맞게 양 옆에 빈칸을 주었습니다.
if (i < h) { // 기존의 모양을 중앙에 배치해주는 조건문
if (3 * Math.pow(2, re) / 2 < j && j < rePow * 5 + rePow - 3 * Math.pow(2, re) / 2) {
sub.append(str.charAt(index++));
} else {
sub.append(" ");
}
}
2-5. 2번 같은 경우는 2개의 기존 모양을 연결시키지만 가운데에 빈 칸 한 줄만 추가해주는 방식으로 해 주었습니다.
} else { // 그 이후로 2개의 기존의 모양을 이어 붙이는 조건문
if (j <= str.length() / h) {
sub.append(str.charAt(index1++));
} else if (j == str.length() / h + 1) {
sub.append(" ");
} else {
sub.append(str.charAt(index2++));
}
}
3. 이렇게 만들어진 문자열을 출력 모양에 맞게 만들어서 출력을 해줍니다.
// 하나의 문자열로 되어있는 모양을 출력모양과 같이 만들어서 출력해줍니다.
bw.write(print(sb.toString(), n));
// 한 줄로 되어있는 문자열을 출력 양식에 맞게 만들어주는 함수.
private static String print(String str, int n) {
int h = n;
int w = str.length() / h;
int index = 0;
StringBuilder result = new StringBuilder();
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
result.append(str.charAt(index++));
}
result.append("\n");
}
return result.toString();
}
코드
package Main;
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
int n = Integer.valueOf(br.readLine());
// 우선 삼각형 모양을 먼저 입력시켜줬습니다.
sb.append(first());
// n이 3일 때에는 그대로 출력만 하면되고, 3보다 높다면 반복문을 통해 원하는 출력을 만들어줍니다.
if (n > 3) {
StringBuilder sub;
// 반복 횟수를 구해줍니다.
int renum = 0;
for (int i = 0; i <= 10; i++) {
if (3 * Math.pow(2, i) == n) {
renum = i;
break;
}
}
// 반복 횟수만큼 모양을 만들어줍니다.
for (int i = 1; i <= renum; i++) {
sub = new StringBuilder();
sub.append(sb.toString());
sb = new StringBuilder();
sb.append(second(sub.toString(), i));
}
}
// 하나의 문자열로 되어있는 모양을 출력모양과 같이 만들어서 출력해줍니다.
bw.write(print(sb.toString(), n));
bw.flush();
bw.close();
br.close();
}
// 기본적으로 삼각형을 만들어줄 함수.
private static String first() {
StringBuilder sub = new StringBuilder();
// \n이 들어가면 그 만큼 길이가 길어져 한 줄의 문자열로 만들어서 계산을 진행합니다.
sub.append(" * ");
sub.append(" * * ");
sub.append("*****");
return sub.toString();
}
// 반복 횟수만큼 규칙을 적용해 원하는 모양을 만들어주는 함수.
private static String second(String str, int re) {
StringBuilder sub = new StringBuilder();
int h = 3 * (int) Math.pow(2, re - 1); // 현재 만들어지는 모양의 높이
int rePow = (int) Math.pow(2, re); // 2^반복횟수를 많이 사용하여 변수로 설정.
int index = 0; // 0 ~ h / 2를 만들어 줄 index
int index1 = 0; // h / 2 ~ h까지에서 0 ~ w / 2까지 모양을 만들어 줄 index
int index2 = 0; // h / 2 ~ h까지에서 w / 2 ~ w까지 모양을 만들어 줄 index
for (int i = 0; i < 2 * h; i++) {
for (int j = 1; j <= rePow * 5 + rePow - 1; j++) {
if (i < h) { // 기존의 모양을 중앙에 배치해주는 조건문
if (3 * Math.pow(2, re) / 2 < j && j < rePow * 5 + rePow - 3 * Math.pow(2, re) / 2) {
sub.append(str.charAt(index++));
} else {
sub.append(" ");
}
} else { // 그 이후로 2개의 기존의 모양을 이어 붙이는 조건문
if (j <= str.length() / h) {
sub.append(str.charAt(index1++));
} else if (j == str.length() / h + 1) {
sub.append(" ");
} else {
sub.append(str.charAt(index2++));
}
}
}
}
return sub.toString();
}
// 한 줄로 되어있는 문자열을 출력 양식에 맞게 만들어주는 함수.
private static String print(String str, int n) {
int h = n;
int w = str.length() / h;
int index = 0;
StringBuilder result = new StringBuilder();
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
result.append(str.charAt(index++));
}
result.append("\n");
}
return result.toString();
}
}
728x90
반응형
'코딩테스트 일기 (BAEKJOON)' 카테고리의 다른 글
BEAKJOON / 백준 - JAVA 25593번 근무 지옥에 빠진 푸앙이 (Small) (0) | 2024.09.10 |
---|---|
BEAKJOON / 백준 - JAVA 23885번 비숍 투어 (0) | 2024.09.09 |
BEAKJOON / 백준 - JAVA 2096번 내려가기 (0) | 2024.09.07 |
BEAKJOON / 백준 - JAVA 1916번 최소비용 구하기 (0) | 2024.09.06 |
BEAKJOON / 백준 - JAVA 1449번 수리공 항승 (0) | 2024.09.05 |