일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- CSS
- React 공식문서
- next13 head
- react-helmet
- Programmers
- React 18 Nextjs
- notFound()
- React 고급안내서
- background setInterval
- React 고급 안내서
- Render Props
- Nextjs
- react hook
- React API 참고서
- 고급안내서
- React 18
- background: url
- React18
- background tab
- codingtest
- Nextjs React 18
- background setttimeout
- Next13
- RTK Query
- hook
- context
- getUTCDate
- react
- Babel
- Javascript
Archives
- Today
- Total
akjfal
프로그래머스 68645번 java 본문
Programmers 코딩테스트 level 2 - 68645번 삼각달팽이
java로 작성했습니다.
생각한 점
- 코드를 작성할때 2차원 배열을 그린다고하면 좌표처럼 생각해 x변수는 넓이, y변수는 높이를 나타냅니다.
- 피라미드를 한쪽으로 몰았을 때 직각 삼각형과 같은 모양을 지니고 있어 2차원 배열의 절반과 가운데줄을 사용한것과 같은 배열을 보인다
- 1부터 진행시 n -> n -1 -> ... 1로 진행되어 전체 수를 n * (n - 1) / 2로 계산했다.
- 코딩 방식
- 1부터 n번 1자로 내려가면서 채우기
- 배열의 끝(처음에만 적용)이나 0이 아닌 숫자를 만나면 멈춤
- ㅡ자로 n-1번 채우기
- 배열의 끝(처음에만 적용)이나 0이 아닌 숫자를 만나면 멈춤
- 대각선 방향으로 n-2번 채우기
- 0이 아닌 숫자를 만나면 멈춤(배열의 끝은 만날일이 없으므로 고려 x)
- 1번으로 돌아간후 반복
- n * (n - 1) /2 번째 숫자가 채워지면 종료
- 배열을 재조합해서 1차원 배열로 변환
import java.util.*;
class Solution {
public int[] solution(int n) {
int[] answer;
int[][] array = new int[n][n];
int num = 2;
int x = 0;
int y = 0;
// 0 - l, 1 - -, 2 - \
int direction = 0;
for (int i = 0; i < n; i++) {
Arrays.fill(array[i], 0);
}
int max = (n * (n + 1)) / 2;
array[0][0] = 1;
while (num <= max) {
// case 0 : 세로 방향
// case 1 : 가로 방향
// case 2 : 대각선 방향
switch (direction % 3) {
case 0: {
for (int i = y; i < n; i++) {
y++;
// 배열의 끝이나 가장자리 만나면 멈춤
if (y >= n || array[y][x] != 0) {
y--;
break;
} else {
array[y][x] = num;
num++;
}
}
break;
}
case 1: {
for (int i = x; i < n; i++) {
x++;
if (x >= n || array[y][x] != 0) {
x--;
break;
} else {
array[y][x] = num;
num++;
}
}
break;
}
case 2: {
for (int i = 0; i < n; i--) {
x--;
y--;
if (x < 0 || y < 0 || array[y][x] != 0) {
x++;
y++;
break;
} else {
array[y][x] = num;
num++;
}
}
break;
}
}
direction++;
}
int k = 0;
answer = new int[max];
// 정답 계산
for (int i = 0; i < n; i++) {
for (int j = 0; j <= i; j++) {
answer[k] = array[i][j];
k++;
}
}
return answer;
}
}
'알고리즘 > programmers' 카테고리의 다른 글
[Programmers] 괄호 회전하기 (0) | 2021.06.17 |
---|---|
[Programmers] 예상 대진표도움말 (0) | 2021.06.16 |
[Programmers] 게임 맵 최단거리 (0) | 2021.06.16 |
프로그래머스 42583번 java (0) | 2021.01.15 |
프로그래머스 1829번 java (0) | 2021.01.14 |
Comments