일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 막내의막무가내
- 막내의막무가내 코볼 COBOL
- flutter network call
- 막내의막무가내 알고리즘
- 막내의막무가내 안드로이드 코틀린
- 막내의막무가내 안드로이드
- 막내의 막무가내
- 막내의막무가내 SQL
- 주택가 잠실새내
- 막내의막무가내 목표 및 회고
- 프래그먼트
- 안드로이드 sunflower
- 막내의막무가내 플러터
- 부스트코스
- Fragment
- 주엽역 생활맥주
- 부스트코스에이스
- 안드로이드
- 안드로이드 Sunflower 스터디
- 막내의막무가내 rxjava
- 막내의 막무가내 알고리즘
- 2022년 6월 일상
- 막내의막무가내 프로그래밍
- 막무가내
- 프로그래머스 알고리즘
- 막내의막무가내 플러터 flutter
- 막내의막무가내 코틀린
- 막내의막무가내 코틀린 안드로이드
- 막내의막무가내 안드로이드 에러 해결
- 막내의막무가내 일상
- Today
- Total
막내의 막무가내 프로그래밍 & 일상
[알고리즘] 프로그래머스 삼각 달팽이 -월간 코드 챌린지 시즌1- 자바 코틀린 본문
programmers.co.kr/learn/courses/30/lessons/68645
프로그래머스 월간 코드 챌린지 시즌1 에 나온 삼각달팽이 문제를 풀어봤습니다. ㅎㅎ
삼각형에서 하단 -> 우측 -> 상단 방향으로 달팽이모양처럼 순서대로 반복해서 값을 넣어주는 문제입니다.
1. 먼저 4개의 인덱스 top(상단), left(좌측), bottom(하단), right(우측) 을 세팅합니다.
2. 최대크기만큼 value를 채웠다면 break합니다.
3. 가장 상단에 있는 가장 짧은 상태입니다. 하단이동 탐색을 합니다. top인덱스 -> bottom인덱스 까지 value 를 넣어줍니다. 다 넣어준 후 해당 top은 다 탐색한게 되므로 top++ 해주고 첫번째 인덱스도 다 탐색한게 되므로 left++ 해줍니다.
4. 가장 밑바닥에 있는 가장 긴 상태입니다. 우측이동 탐색을 합니다. left인덱스 -> right 인덱스까지 value를 넣어줍니다. 다 넣어준 후 해당 bottom은 다 탐색한게 되므로 bottom-- 해주고 가장 마지막 right 인덱스도 다 탐색한게 되므로 right-- 해줍니다.
5. 상단 이동 탐색을 합니다. bottom 인덱스 -> top 인덱스까지 value를 넣어줍니다. 다 넣어준 후 가장 상단까지 탐색한 이후이므로 top++ 해주고 가장 큰 right도 탐색한게 되므로 right--를 해줍니다.
이것들을 2의 조건이 될때까지 반복합니다.
풀이는 다음과 같습니다.
[Java]
class Solution {
public static void main(String[] args) {
Solution solution = new Solution();
solution.solution(6);
}
public int[] solution(int n) {
int[] answer = {};
int[][] arr = new int[n][n];
int max = n * (n + 1) / 2; // 총 개수
int top = 0; //상단
int left = 0; //좌측
int bottom = n - 1; //하단
int right = n - 1; //우측
int value = 1;
while (max >= value) {
for (int i = top; i <= bottom; i++) { // 하단이동
if (max < value) break;
arr[i][left] = value++;
}
if (max < value) break;
top++;
left++;
for (int j = left; j <= right; j++) { // 우측이동
if (max < value) break;
arr[bottom][j] = value++;
}
if (max < value) break;
bottom--;
right--;
int index = right;
for (int i = bottom; i >= top; i--) { //상단 이동
if (max < value) {
break;
}
arr[i][index--] = value++;
}
top++;
right--;
}
answer = new int[max];
int index = 0;
for (int i=0; i<n; i++){
for (int j=0; j<=i; j++){
answer[index++] = arr[i][j];
}
}
return answer;
}
}
[Kotlin]
class Solution {
fun solution(n: Int): IntArray {
var answer: IntArray
val arr = Array(n) { IntArray(n) }
val max = n * (n + 1) / 2 // 총 개수
var top = 0 //상단
var left = 0 //좌측
var bottom = n - 1 //하단
var right = n - 1 //우측
var value = 1
while (max >= value) {
for (i in top..bottom) { // 하단이동
if (max < value) break
arr[i][left] = value++
}
if (max < value) break
top++
left++
for (j in left..right) { // 우측이동
if (max < value) break
arr[bottom][j] = value++
}
if (max < value) break
bottom--
right--
var index = right
for (i in bottom downTo top) { //상단 이동
if (max < value) {
break
}
arr[i][index--] = value++
}
top++
right--
}
answer = IntArray(max)
var index = 0
for (i in 0 until n) {
for (j in 0..i) {
answer[index++] = arr[i][j]
}
}
return answer
}
}
댓글과 공감은 큰 힘이 됩니다. :)
'알고리즘 > 일반(단순구현)' 카테고리의 다른 글
[알고리즘] 백준 14719 빗물 자바 (0) | 2020.10.24 |
---|---|
[알고리즘] 프로그래머스 124 나라의 숫자 자바 (0) | 2020.10.18 |
[알고리즘] 릿코드(leetcode) Weekly Contest 193 (0) | 2020.06.14 |
[알고리즘] 프로그래머스 소수 만들기 -Summer/Winter Coding(~2018)- (0) | 2020.05.07 |
[알고리즘] 프로그래머스 예산 -Summer/Winter Coding(~2018)- (0) | 2020.05.05 |