알고리즘(Algorithm)

[CodeWars] Give me a Diamond [JS / 6kyu] 다이아 찍기

Hun-bot 2023. 2. 16. 16:54
728x90
반응형

다이아 찍기

최대한 for문을 하나만 쓰려고 고민했다

function diamond(n){
  if(n===1) return '*\n'
  if(n<3||n%2===0) return null
  let ans=''
  let temp=''
  let half=Math.floor(n/2)+1
  for (let i = 1; i <= n; i++) {
    temp = i <= half ? i : n-i+1
    ans+=' '.repeat(half-temp)+'*'.repeat(2*temp-1)+'\n'
  }
  return ans;
}

우선 n이 짝수거나 3보다 작은 경우 다이아몬드를 만들수 없으므로 예외처리를 해주고 시작한다 (1은 제외)

다이아를 찍으려면 아래와 같이 공백을 넣어주는 부분이 필요하고 앞쪽 네모에만 공백을 넣어주면 되기에 뒤쪽

공백은 생각할 필요가 없다

□□*□□
□***□
*****
□***□
□□*□□

n=5일경우 첫줄에 필요한 공백은 2개고 별은 1개다

half는 3이 되고, for문을 들어가보면 i<=half일 경우 temp가 i가 되거나, 조건을 만족하지 않으면 n-i+1이 되는 코드가 있다.

i=1일경우 half보다 작으므로 temp에는 1이 들어가고

ans부분에 ' '.repeat 에는 공백이 3-1 = 2 가 들어가게 되고, ' * ' 부분에는 2*1-1이므로 1 즉 별 한개가 찍히고 다음라인으로 넘어간다

i=3일 경우 조건에 일치 temp=3, 공백은 0, 별은 6-1해서 5개 찍히고

i=4일 경우 n-i+1 -> 5-4+1 = 2 ... 

 let half=Math.floor(n/2)+1
  for (let i = 1; i <= n; i++) {
    temp = i <= half ? i : n-i+1
    ans+=' '.repeat(half-temp)+'*'.repeat(2*temp-1)+'\n'
  }

시간복잡도나 공간복잡도는 나중에 측정해서 올려야겠다

 

728x90
반응형