일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- SpringBoot
- 데이터베이스
- 프로그래밍
- 코딩
- 프로그래머
- 코드업
- 자바알고리즘
- 스프링부트
- 소셜로그인구현
- 자바
- React
- 프로그래머스
- 리액트
- 백엔드
- 프로세스
- 혼공컴운
- 자바의정석
- 개발자
- Java
- 자바스크립트
- 개발자일기
- 백엔드개발자
- 국비지원
- 자바개발자
- db
- 알고리즘
- Codeup
- 국비지원코딩
- 운영체제
- 미라클모닝
- Today
- Total
초코딩(chocoding)
[CodeUp / java] [기초-배열연습] 2차원 배열 달팽이 채우기 4-1 본문
난이도 급상승.................
처음에 접근할 때, 어쨋든 컴퓨터는 왼쪽에서 오른쪽으로, 위에서 아래로 출력하기 때문에
숫자간의 관계를 생각해봤다.
뭐... 관계성이 있기는 했는데 내가 억지로 끼워맞춘 감이 없지 않아 있었다.
근데 숫자의 관계성으로만 접근하기에는 너무 한계가 많다고 느꼈고
이 방법이 아닌 .. 느낌이 들어서 chatGPT한테 힌트 좀 달라고 했다.
지피티가 준 힌트는 바로 바로
고로쿠만.... 고로케였구만..... (🥯 고로케 임티 없네)
숫자의 연관성을 고려해서 왼쪽에서 오른쪽으로, 위에서 아래로 출력하는 것이 아니라
진짜 숫자 순서대로 (달팽이 모양으로) 찍는 것이었어!!!!!!!!!!
힌트를 보고 나서
힌트를 보지 않았으면 평생 문제를 풀 수 없었겠다... 라는 생각이 들었다
(언젠가... 풀 수 있었을까? 접근법 자체부터가 달랐는데.........)
.
.
.
힌트를 얻고 작성한 코드는 아래와 같다.
package example01;
import java.util.Scanner;
public class Ex04_Chapter6 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); // 2차원 배열의 행
int m = sc.nextInt(); // 2차원 배열의 열
int[][] arr = new int[n][m]; // 입력받은 n, m의 크기만큼 배열 정의
int value = 1; // 출력될 숫자
int row = 0, col = 0; // 2차원 배열의 행과 열 설정을 위한 변수
int direction = 0; // 방향을 설정하기 위한 변수
// 오른쪽: 0, 아래: 1, 왼쪽: 2, 위: 3
sc.close();
while (value <= n * m) {
arr[row][col] = value++;
switch (direction) {
case 0: // 오른쪽
if (col + 1 < m && arr[row][col + 1] == 0) {
//
col++;
} else {
direction = 1;
row++;
}
break;
case 1: // 아래
if (row + 1 < n && arr[row + 1][col] == 0) {
row++;
} else {
direction = 2;
col--;
}
break;
case 2: // 왼쪽
if (col - 1 >= 0 && arr[row][col - 1] == 0) {
col--;
} else {
direction = 3;
row--;
}
break;
case 3: // 위
if (row - 1 >= 0 && arr[row - 1][col] == 0) {
row--;
} else {
direction = 0;
col++;
}
break;
} // switch
} // while
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
System.out.printf("%s%d ", arr[i][j]/10 >= 1 ? "" : " ",arr[i][j]);
}
System.out.println();
}
}
}
달팽이 모양은 "오른쪽으로 이동 -> 아래로 이동 -> 왼쪽으로 이동 -> 위로 이동"을 계속해서 반복하기 때문에
switch문을 통해서 네가지의 상황을 만들어주었다.
그리고 마지막 for문을 통해서 2차원 배열을 출력해주었는데
코드업에서는 자릿수 상관없이 무조건 숫자를 출력했다.
하지만 나는 가독성을 더 좋게 하기 위해 두자리 숫자까지만 정렬해서 출력할 수 있도록
삼항식을 써서 자릿수에 따른 공백을 설정해주었다.
출력된 형태는 다음과 같다.
이러한 접근법을 바로 생각해낸 사람이 있다면.....
진짜 리스펙이다
사람들은 왤케 똑똑할까?
그리고 똑똑한 사람은 왤케 많을까?
근데 그 많고 많은 사람들 중에
왜 난 포함되지 않을까..................ㅋ
참 슬프군....
자아성찰까지 하게 해준 코드업...문제였다..
끝
'[Java] 알고리즘 문제풀이' 카테고리의 다른 글
[CodeUp / java] 1180 : 만능 휴지통 (0) | 2023.09.24 |
---|---|
[CodeUp / java] 1371 : 마름모 출력하기 (0) | 2023.09.21 |
[CodeUp / java] 1409 : 기억력 테스트 1 (0) | 2023.09.06 |
[CodeUp / java] 1093 : [기초-1차원배열] 이상한 출석 번호 부르기1 (0) | 2023.09.05 |
[CodeUp / java] 1082 : [기초-종합] 16진수 구구단? (0) | 2023.09.03 |