JAVA - 피라미드 만들기.
문제)
주어진 문자열을 이용해 피라미드를 건설하고자 합니다.
아래 메서드의 구현부를 완성하면 됩니다.
public static String watchPyramidFromTheSide(String characters)
: 이 메서드는 피라미드를 옆에서 보았을때 모습을 출력하면 됩니다.
The first method ("FromTheSide") shows the pyramid as you would see from the side.
public static String watchPyramidFromAbove(String characters)
: 이 메서드는 피라미드를 위에서 내려보았을때의 모습을 출력하면 됩니다.
public static int countVisibleCharactersOfThePyramid(String characters)
: 이 메서드는 위에서 내려보았을때 보이는 블럭(문자)의 수를 계산하면 됩니다.
public static int countAllCharactersOfThePyramid(String characters)
: 이 메서드는 피라미드가 완성되었을때 구성하고 있는 모든 블럭(문자)의 수를 계산하면 됩니다.
주어진 문자열에서 각 문자는 피라미드의 한 층(floor)을 구성하게 됩니다.
따라서 주어진 문자열의 길이가 피라미드의 총 층수(floor)가 됩니다.
각 층은 주어진 문자열에 맞게끔 지어져야 합니다. 피라미드의 각 층은 정사각형으로 구성됩니다.
Example
- Given string: "abc"
피라미드를 옆에서 보았을 때:
c
bbb
aaaaa
피라미드를 위에서 내려다 보았을 때:
aaaaa
abbba
abcba
abbba
aaaaa
위에서 내려다 보았을때 보이는 블럭(문자)의 수 : 25
피라미드를 구성하는 모든 블럭(문자)의 수 : 35
주어진 문자열은 연속된 문자/숫자가 아니고 문자열의 길이 제한은 없습니다. 또한 공백일 수 없습니다. [aaaaa(x) abcde(o), 11111(x) 12345(o)]
피라미드를 옆에서 보았을 때의 모습을 출력할 땐, 직 사각형안에 블럭(문자)가 출력되어야 합니다. 그러므로 줄 끝의 공백을 잘 생각해야 합니다.
만약 문자열이 null이거나 비어있다면 watch-메서드는 빈 문자열을,
count-메서드는 -1을 반환합니다.
소스코드 및 주석)
public class Pyramid {
public static String watchPyramidFromTheSide(String characters) {//옆에서 본 피라미드
String result = "";
if(characters!=null && characters!="") { //인풋값이 빈값이 아닌 경우.
int input_leng = characters.length(); //인풋 문자열의 길이 저장.(편의위해)
int i=0, j=0;
for(i =0; i< input_leng; i++) { //문자열 길이만큼 첫번째 반복문.
for(j =input_leng-(i+1) ; j>0; j--) {//이중반복문: 문자열갯수 ~ 0 까지 공백출력 .
result = result+" ";
}
for(j =0; j<(i*2)+1; j++) {// 홀수갯수(1,3,5,7...)만큼 늘여가며 각 문자열 하나씩 출력.
result = result+characters.charAt((input_leng-1)-i);//charAt으로 문자열하나씩 추출.
}
for(j =input_leng-(i+1) ; j>0; j--) {//공백 한번더 출력
result = result+" ";
}
if(i<input_leng-1) {//for문이 다시 돌아갈때만
result = result+"\n"; //3번의 2중 반복 끝나면 줄바꿈.
} //즉,모든반복이 끝나면 줄바꿈 찍지 않는다.
}return result;
}else return characters;//인풋값이 빈값(null or "")일 경우 들어온 인풋값 그대로 리턴한다.
}
public static String watchPyramidFromAbove(String characters) {
String result = "";
if(characters!=null && characters!="") { //인풋값이 빈값이 아닌 경우.
int input_leng = characters.length(); //인풋 문자열의 길이 저장.(편의위해)
int i=0, j=0;
//내가찾은규칙: 총 6등분 하여 각 구역의 규칙으로 2번의 2중반복 사용..
for(i =0; i<input_leng; i++) { // 0~ 문자열 길이 까지.
for(j=0; j<i+1; j++) { //문자열 차례로 갯수늘여가며 출력.
result = result+characters.charAt(j);
}for(j=0; j<(input_leng-(i+1))*2; j++) { // 한문자만 규칙에 따라 출력.
result = result+characters.charAt(i);
}for(j=i-1; j>=0; j--) { //문자열 거꾸로 갯수 늘여가며 출력.
result = result+characters.charAt(j);
}
result = result+"\n";
} // 규칙은 같으나 반대로 시작됨. 문자열 길이 ~ 0 까지.
for(i =input_leng-1; i>0; i--) {
for(j=0; j<i; j++) {
result = result+characters.charAt(j);
}for(j=0; j<(input_leng-i)*2; j++) {
result = result+characters.charAt(i-1);
}for(j=i-1; j>0; j--) {
result = result+characters.charAt(j-1);
}
if(i>1) { //for문 끝나면 줄바꿈 찍기 않기 위한 조건.
result = result+"\n";
}
}
return result;
}else return characters;
}
public static int countVisibleCharactersOfThePyramid(String characters) {
if(characters!=null && characters!="") {//인풋값이 빈값이 아닌 경우.
int result= (characters.length()*2-1)*(characters.length()*2-1); //(인풋길이*2-1)의 제곱.
return result;
}else return -1;
}
public static int countAllCharactersOfThePyramid(String characters) {
if(characters!=null && characters!="") {
int result =0;
int temp = (characters.length()*2-1);////(인풋길이*2-1)값 구하기.
for(int i=0; i<characters.length(); i++) {
result = result+(temp*temp); //(인풋길이*2-1)의 제곱근의 합..
temp = temp-2; //(인풋길이*2-1) 에서 0 까지 반복하며 -2씩감소한 값의 제곱근을 더한다.
}
return result;
}else return -1;
}
}
출력결과)
************** basicTest5DescendingOrderedCharacters ************
From side correct:
1
222
33333
4444444
555555555
From side yours:
1
222
33333
4444444
555555555
-------------------------------------------------
From above correct:
555555555
544444445
543333345
543222345
543212345
543222345
543333345
544444445
555555555
From above yours:
555555555
544444445
543333345
543222345
543212345
543222345
543333345
544444445
555555555
***************** pyramidTest1 *****************
From side correct:
#
***
From side yours:
#
***
-------------------------------------------------
From above correct:
***
*#*
***
From above yours:
***
*#*
***
***************** pyramidTest2 *****************
From side correct:
c
bbb
aaaaa
From side yours:
c
bbb
aaaaa
-------------------------------------------------
From above correct:
aaaaa
abbba
abcba
abbba
aaaaa
From above yours:
aaaaa
abbba
abcba
abbba
aaaaa
***************** pyramidTest3 *****************
From side correct:
e
ddd
ccccc
bbbbbbb
aaaaaaaaa
From side yours:
e
ddd
ccccc
bbbbbbb
aaaaaaaaa
-------------------------------------------------
From above correct:
aaaaaaaaa
abbbbbbba
abcccccba
abcdddcba
abcdedcba
abcdddcba
abcccccba
abbbbbbba
aaaaaaaaa
From above yours:
aaaaaaaaa
abbbbbbba
abcccccba
abcdddcba
abcdedcba
abcdddcba
abcccccba
abbbbbbba
aaaaaaaaa