Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 스프링 빈
- 연습문제
- Linux
- JavaScript
- 자바스크립트 코딩의 기술
- map
- 프로그래머스
- Java
- 문자열
- 고잉버스
- 월간코드챌린지
- java 백준 1차원 배열
- 리눅스
- 스프링 컨테이너
- 반복문
- 백준 javascript
- 코테
- 리눅스마스터1급
- GoingBus
- 자바
- Kotlin
- 백준 java
- 개발자 회고록
- 명령어
- 리눅스마스터 3과목
- 리눅스마스터 1급 정리
- 코딩테스트
- toCharArray
- 카카오
- Memoir
Archives
- Today
- Total
hoon's bLog
Java 프로그래머스 삼각 달팽이 자바 본문
반응형
문제출처 : https://school.programmers.co.kr/learn/courses/30/lessons/68645
[문제 설명]
정수 n이 매개변수로 주어집니다. 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해 주세요.
[제한사항]
n은 1 이상 1,000 이하입니다.
[입출력 예]
n | result |
4 | [1, 2, 9, 3, 10, 8, 4, 5, 6, 7] |
5 | [1, 2, 12, 3, 13, 11, 4, 14, 15, 10, 5, 6, 7, 8, 9] |
6 | [1, 2, 15, 3, 16, 14, 4, 17, 21, 13, 5, 18, 19, 20, 12, 6, 7, 8, 9, 10, 11] |
[문제 풀기 전 생각/정리]
- n = 4 일 때, 삼각형의 각 칸을 좌표로 표현하면 아래와 같다
[0, 0] | [0, 1] | [0, 2] | [0, 3] |
[1, 0] | [1, 1] | [1, 2] | [1, 3] |
[2, 0] | [2, 1] | [2, 2] | [2, 3] |
[3, 0] | [3, 1] | [3, 2] | [3, 3] |
- 반시계 방향으로 삼각형을 채우는 규칙을 살펴보면 대각선 왼쪽 아래, 가로, 대각선 왼쪽 위 방향으로 반복하며 총 n회 실시
- 삼각형을 채우는 규칙과 각 칸의 좌표들을 함께 살펴보면 다음과 같다
- 대각선 아래로 이동할 때는 x좌표가 증가
- 가로로 이동할 때는 y좌표가 증가
- 대각선 위로 이동할 때는 x, y좌표가 감소
- 결국 실제로 x좌표는 세로 방향, y좌표는 가로 방향으로 숫자가 조절된다고 보면 되겠다!!!
[나의 풀이]
public class Solution {
public int[] solution(int n) {
// 반환할 배열 크기 설정
int[] answer = new int[(n*(n+1))/2];
// 실제 보여질 삼각형모습을 좌표화 시킬 2차원 배열 선언
int[][] tmpArr = new int[n][n];
// 배열에 들어갈 인덱스를 고려하여 x좌표는 -1로 설정
int x = -1, y = 0;
//배열에 들어갈 숫자
int num = 1;
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
if (i%3 == 0) {
//대각선 아랫 방향(2차원 배열로는 세로 아랫 방향)
x++;
}else if (i%3 == 1) {
//가로 방향(2차원 배열로는 가로 오른쪽 방향)
y++;
}else if (i%3 == 2) {
//대각선 윗 방향(2차원 배열로는 세로 윗 방향)
x--;
y--;
}
tmpArr[x][y] = num++;
}
}
int k = 0;
// return할 배열에 값 저장
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if(tmpArr[i][j] == 0)
break;
answer[k++] = tmpArr[i][j];
}
}
//2차원 배열 확인용 함수
print2d(tmpArr);
return answer;
}
public static void print2d(int[][] result) {
int m = result.length;
int n = result[0].length;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
System.out.print(result[i][j] + "\t");
}
System.out.println();
}
System.out.println("----------------------");
}
}
[정리]
개인 피셜 난이도 : ★★☆☆☆
2개라고는 했지만 2.5개 정도 되는 것 같다!
레벨 2부터는 조금씩 생각해야 하는 부분들이 많아지면서 어렵다는 느낌이 든다.
풀면서 종이에 케이스를 직접 그리지 않는 이상, 단순히 눈코딩, 손코딩도 쉽지 않음을 느꼈다.
다른 사람들의 풀이는 모두 비슷하게 2차원 배열을 이용한 풀이로 생략했다.
일하면서 하다 보니 풀이 속도가 잘 나지 않는데,
다음 문제부터는 문제풀이 속도에도 신경 쓰면서 풀어 나가야겠다.
언제나 새로운 정보 공유와 잘못된 정보
비판/지적/태클은 환영입니다!
끝.
728x90
반응형
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
Java 프로그래머스 쿼드압축 후 개수 세기 자바 (0) | 2024.02.26 |
---|---|
프로그래머스 이진 변환 반복하기 자바 (0) | 2023.07.27 |
Java 프로그래머스 체육복 자바 (4) | 2023.03.21 |
Java 프로그래머스 모의고사 자바 (2) | 2023.03.15 |
Java 프로그래머스 K번째 수 자바 (3) | 2023.03.14 |