알고리즘(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
반응형