https://school.programmers.co.kr/learn/courses/30/lessons/68645
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
조건
1. n
1이상 1000이하
4 → 1 + 2 + 3 + 4 = 10 까지의 수
5 → 1 + 2 + 3 + 4 + 5 = 15 까지의 수
n = 6 일 때, 삼각 달팽이 형태
1,1 → 2,1 → 3,1 → 4,1 → 5,1 → 6,1
6,2 → 6,3 → 6,4 → 6,5 → 6,6
5,5 → 4,4 → 3,3 → 2,2
3,2 → 4,2 → 5,2
5,3 → 5,4
4,3
알고리즘
- while, index 문제
- 이미 채워져 있다면? break
- 아래 → 옆 : y → y+1
- 옆 → 위 : x → x-1, y → y-1
- 위 → 아래 : x → x+1
아래로, 옆으로, 대각선으로 채워넣기
- 최대 숫자 MaxNum 구하기
- 넣을 숫자를 뜻하는 num, 좌표 탐색할 x, y 선언
- 무한 루프 안에서,
- if) maxNum 과 num 이 같으면 break. 숫자를 다 넣었다는 뜻
- while) 아래 좌표(y+1)가 n보다 작을 때 아래 좌표(y+1) 자리가 0이 아니면, 숫자가 채워져 있으면 break
arr[++y][x] = ++num;
- while) 옆 좌표(x+1)가 n보다 작을 때 옆 좌표(x+1) 자리가 0이 아니면, 숫자가 채워져 있으면 break
arr[y][++x] = ++num;
- while) 대각선 좌표(x-1, y-1)가 n보다 작을 때 대각선 좌표(x-1, y-1) 자리가 0이 아니면, 숫자가 채워져 있으면 break
arr[--y][--x] = ++num;
- result 형식으로 arr 배열 값 저장하기
package com.example.javaproject3.psstudy;
public class Solution68645 {
public int[] solution(int n) {
int maxNum = 0;
for (int i = 1; i <= n; i++)
maxNum += i;
int[] answer = new int[maxNum];
int[][] arr = new int[n + 1][n + 1];
int num = 1, x = 0, y = 0;
arr[0][0] = 1;
while (true) {
if (num == maxNum) break;
while (y + 1 < n) {
if (arr[y + 1][x] != 0) break;
arr[++y][x] = ++num;
}
while (x + 1 < n) {
if (arr[y][x + 1] != 0) break;
arr[y][++x] = ++num;
}
while (y - 1 > 0 && x - 1 > 0) {
if (arr[y - 1][x - 1] != 0) break;
arr[--y][--x] = ++num;
}
}
int idx = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j <= i; j++) {
answer[idx] = arr[i][j];
idx++;
}
}
return answer;
}
public static void main(String[] args) {
Solution68645 s = new Solution68645();
int[] arr = s.solution(6);
for (int a : arr) {
System.out.printf("%d ", a);
}
}
}