https://school.programmers.co.kr/learn/courses/30/lessons/68645
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
정답 코드
class Solution {
int[][] tri;
public int[] solution(int n) {
tri = new int[n][n];
int[] answer = new int[n*(n+1)/2];
int y = -1;
int x = 0;
int cnt = 1;
for(int i=0; i<n; i++){
for(int j=i; j<n; j++){
if(i%3==0){
y++;
}else if(i%3==1){
x++;
} else{
x--;
y--;
}
tri[y][x] = cnt++;
}
}
int idx=0;
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
if(tri[i][j]==0){
break;
}
answer[idx++]=tri[i][j];
}
}
return answer;
}
}
문제 해결에 필요한 아이디어
- 삼각형을 이차원 배열에 매핑 시키는 것
- 반시계 방향으로 순환 시 ⬇️, ➡, ↖️ 패턴이 반복된다는 사실 인지 + 한 방향으로의 이동이 끝나면 다음 방향의 이동 칸수는 직전 이동 칸수 -1 즉, \( n, n-1, n-2, ...\) 꼴이 된다.
- n이 주어졌을 때 정답으로 반환할 배열의 칸수는 삼각형 칸 수이다. 이를 구하는 것은 \(1+...+n\)인데 이를 이용해 등차수열의 합 공식 \( S_n = \frac{n(a+l)}{2}\)을 이용해 구한다.
- 이동 방향의 패턴이 세가지이므로 mod연산자를 이용해 루프를 돌 때마다 다른 방향의 패턴을 적용한다. \( i%3==0,1,2\)
'Algorithm' 카테고리의 다른 글
| [Java] 프로그래머스 - N개의 최소공배수 (0) | 2023.11.06 |
|---|---|
| [Java] 프로그래머스 - 최솟값 만들기 (0) | 2023.11.04 |
| [Java] 프로그래머스 - 두 큐 합 같게 만들기(lv.2) (1) | 2023.10.20 |
| [Java] 백준 18870 - 좌표 압축 (0) | 2023.04.21 |
| [Java] 백준 1620 - 나는야 포켓몬 마스터 이다솜 (0) | 2023.04.12 |