본문 바로가기
문제풀이/Programmers 문제풀이

[ 알고리즘 ] 코딩 - Programmers - 삼각달팽이.java

by 마늘아빠 2021. 1. 7.
728x90
반응형

문제 링크

programmers.co.kr/learn/courses/30/lessons/68645

 

코딩테스트 연습 - 삼각 달팽이

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]

programmers.co.kr


* 프로그래머스 - Level 2 - (자바)삼각달팽이 - 기본 배열 돌리기

그림 설명
입출력예시

 


< 로직 >

* 2차원 배열을 만들어 순서에 맞게 넣기

그림과 같은 형태로 쌓으면 된다

* 세로 가로 대각선의 3가지 부분으로 나누어 생각

* 인덱스 관리를 잘 하는 것이 관건


class Solution {
    public int[] solution(int n) {
       int max = n*(n+1)/2;
	    	int map[][] = new int[n][n]; // 맵의 절반만 쓰자
	    	int top = 0; // 세로 인덱스
	    	int left = 0; // 가로 인덱스
	    	int tmp = 0;
	    	int idx = 1;
	    	
	    	/*
	    	 * 세로
	    	 * 가로
	    	 * 오른쪽 대각선
	    	 * 3부분으로 나누어 생각
	    	 * */
	    	while(idx != max+1) {
	    		// 세로
		    	for(; top < n - tmp; top++) {
		    		map[top][left] = idx++;
		    	}
		    	top--;
		    	left++;
		    	// 가로
		    	for(; left < n - tmp; left++) {
		    		if(map[top][left] != 0) break;
		    		map[top][left] = idx++;
		    	}
		    	top--;
		    	left -= 2;
		    	// 대각선
		    	for(; top > tmp && left > tmp; top--, left--) {
		    		map[top][left] = idx++;
		    	}
		    	top += 2;
		    	left++;
		    	tmp++;
	    	}
	    	
	        int[] answer = new int[max];
	        int index = 0;
	        for(int i = 0; i < n; i++) {
	        	for(int j = 0; j < n; j++) {
	        		if(map[i][j] == 0) continue;
	        		answer[index++] = map[i][j];
	        	}
	        }
	        return answer;
    }
}
반응형