본문 바로가기

프로그래밍/코드분석

[KATA] Triangular Treasure(삼각수)


1. triangular numbers 가 삼각형의 갯수를 의미하는 건가? 라고 생각했는데  


  삼각수라고 해서 삼각형 처럼 원 모양을 쌓아가다보면 공식처럼 놓여진 원의 개수를 구할 수 있게 된다.

 


2. 나는 저렇게 별 모양의 순서대로 표시하면 되는 줄 알았다. 

   그런데 그게 아니라 괄호안에 숫자만 출력하면 된다.

    ( ※ 단, 범위값을 벗어났을 경우 0을 출력해야 한다. )


   코드는 이렇게 간단하게 주어진다.


3. 정답은 사실 되게 간단하다

return (n <= 0) ? 0 : n * (n + 1) / 2;

정답은 삼항연산자를 이용해 한 줄로 쓸 수 있다.

n이 0과 같거나 0미만이라면 return값은 0이고, 0보다 크다면 n*(n+1)/2 공식으로 값을 되돌려주면 된다.


하지만 이렇게 푸는 건 간단하니 좀 더 심화해서 코드를 풀어보도록 하자.


이 문제를 좀 변형해서 위에 그림처럼 출력해보도록 하자. 사실 코드가 더럽고 복잡하다.

고려해야 할 사항은 

 첫번째 : 1st, 2nd, 3rd를 고려할 것( 4번째 숫자부터는 O nd 가 나오도록 )

 두번째 : 그리고 위 그림처럼 별(*)이 위 문제처럼 나와야 한다.


정답은 아래와 같다.

사실 triangular 메서드가 int값을 반환한다는 점에서 문제의 의도와는 거리가 멀지만 

내가 고민하면서 풀어봤기 때문에 도움이 된 문제다.



public class TriangularTreasure {

public static void main(String[] args) {
// TODO Auto-generated method stub
TriangularTreasure.triangular(5);
}
public static int triangular(int n) {

if(n==1)
System.out.println(n + "st " + "(" + n*(n+1)/2 + ")");
else{
if(n==2)
System.out.println(n + "nd " + "(" + n*(n+1)/2 + ")");
else{
if(n==3)
System.out.println(n + "rd " + "(" + n*(n+1)/2 + ")");
else{
if(n>4)
System.out.println(n + "nd " + "(" + n*(n+1)/2 + ")");
}
}
}


for(int i=n; i>0; i--){
System.out.print("*");
for(int j=0; j<i-1; j++){
System.out.print("*");
}
System.out.println("");
}
return n*(n+1)/2;
}
}



 이중 for 문을 생각해야 되는게 가장 어려운 듯 하다.


  첫 번째 for문의 기능은 "별(*) 생성" 기능이다.

  맨 처음에는 전달받은 5만큼 별을 생성해줘야 하므로 int i = n (문제에서는 5) 으로 설정해주고 

  여기서 하나씩 깎아나간다( i-- ) 이렇게 별 5개를 생성하면 아래에 있는 for 문이 돌기 시작한다.


두 번째 for 문의 기능은 "enter"다. 

그림에서 보다시피 엔터의 갯수는 n-1번만 해주면 되니까 int j는 i-1번만큼 해주면 된다!


시행착오를 겪어가며 이중 for문을 만들어보도록 하자!


 

두번째로 어려운 점은 return에 들어가는 원의 개수를 구하는 공식이다. 

나는 일일이 구해가면서 위 공식을 도출했다.

그런데 초등학교 때 가우스가 풀었다고 해서 유명한 공식(?)이기도 하다.





'프로그래밍 > 코드분석' 카테고리의 다른 글

소수(Prime Number) 판단 문제  (0) 2017.01.29
continue와 break문의 활용  (0) 2017.01.28
자바의 정석 연습문제 7-22  (0) 2016.08.21
자바의 정석 연습문제 6-23  (0) 2016.08.17
자바의 정석 연습문제 6-4  (0) 2016.08.16