https://programmers.co.kr/learn/courses/30/lessons/77485

 

코딩테스트 연습 - 행렬 테두리 회전하기

6 6 [[2,2,5,4],[3,3,6,6],[5,1,6,3]] [8, 10, 25] 3 3 [[1,1,2,2],[1,2,2,3],[2,1,3,2],[2,2,3,3]] [1, 1, 5, 3]

programmers.co.kr

 

 

 

 

1. 초기 셋팅

import java.util.*;


public class 메뉴리뉴얼 {
	public static void main(String[] args) {

		System.out.println(solution(
				6,
				6,
				new int[][] {{2,2,5,4},{3,3,6,6},{5,1,6,3}}
				));
	}
	
	// 1. 코스요리 메뉴는 최소 2가지 이상의 단품메뉴 구성
	// 2. 최소 2명 이상의 손님으로부터 주문된 단품메뉴 조합에 대해서만 코스요리 메뉴 후보에 포함하기로 했습니다.
	// 3. 단품메뉴를 4개 이상 주문한 손님은 없다!!!
	
	  public static int[] solution(int rows, int columns, int[][] queries){
	        int[] answer = {};
	        
	        // 초기 셋팅 배열 (1,1)로 시작하기 위해서, 첫번째들은 다 0으로 넣었습니다. 그런데 이러면 안됨(프로그래머스가,, 인식을 못함,,, 그래서  0 빼야됨....)
	        int[][] temp = new int[rows][columns];
	        int num = 1;
	        for(int r = 0;r<rows;r++) {
	        	for(int c = 0;c<columns;c++) {
	        		temp[r][c] = num;
	        		num++;
	        	}
	        }
	        
	       for(int y=0;y<temp.length;y++) {
	    	   for(int x=0;x<temp[y].length;x++) {
	    		   System.out.print(temp[y][x]);
	    	   }
	    	   System.out.println();
	       }
	        
	        
	        
	        return answer;
	    }
}

 

 

2. 위쪽가로, 오른쪽세로, 아랫쪽가로, 왼쪽세로 데이터 이동 하였고, 
firstNumTemp, twoNumTemp, threeNumTemp, forNumTemp 여기에 각각의 끝 값들 저장해 놓은거 까지 구현,,,,,,,,,,이 상태에서 각 위,오른,아랫,왼의 2번째에다가 다시 넣어주는 코드 해줘야함 

import java.util.*;


public class 메뉴리뉴얼 {
	public static void main(String[] args) {

		System.out.println(solution(
				6,
				6,
				new int[][] {{2,2,5,4},{3,3,6,6},{5,1,6,3}}
				));
	}
	
	// 1. 코스요리 메뉴는 최소 2가지 이상의 단품메뉴 구성
	// 2. 최소 2명 이상의 손님으로부터 주문된 단품메뉴 조합에 대해서만 코스요리 메뉴 후보에 포함하기로 했습니다.
	// 3. 단품메뉴를 4개 이상 주문한 손님은 없다!!!
	
	  public static int[] solution(int rows, int columns, int[][] queries){
	        int[] answer = {};
	        
	        // 초기 셋팅 배열 (1,1)로 시작하기 위해서, 첫번째들은 다 0으로 넣었습니다. 그런데 이러면 안됨(프로그래머스가,, 인식을 못함,,, 그래서  0 빼야됨....)
	        int[][] temp = new int[rows][columns];
	        int num = 1;
	        for(int r = 0;r<rows;r++) {
	        	for(int c = 0;c<columns;c++) {
	        		temp[r][c] = num;
	        		num++;
	        	}
	        }
	         
	       // 출력 확인 용도 
	       for(int y=0;y<temp.length;y++) {
	    	   for(int x=0;x<temp[y].length;x++) {
	    		   System.out.print(temp[y][x]);
	    	   }
	    	   System.out.println();
	       }
	       
	       // 그냥 구분
	       // a,b,c,d
	       // f,g,h,i
	       // k,l,m,n
	       
	       // 예제는 값이 1부터 시작이고 위치도 1부터 시작임, 내가 구하는 코드는 배열이라 0부터 시작 !! (주의)
	       for(int a=0;a<queries.length;a++) { // a는 첫번째 행 시작 ㄱㄱ
	    	   // 첫번째 좌표(f,g)
	    	   int f = queries[a][0]-1; // 구현하는 코드에서는 0부터 시작이라 1을 빼줘야함 (-1)!!!★
	    	   int g = queries[a][1]-1;
	    	   // 두번째 좌표(h,i)
	      	   int h = queries[a][2]-1;
	    	   int i = queries[a][3]-1;
	    	   
	    	   // 시계 방향으로 회전
	    	   // 첫번째 - 위에 가로
	    	   for(int k=i;g<=k;k--) {
	    		   // 맨 우측부터 시작 하면 될 듯 한데?? 오!! (빼면서 왼쪽으로 하는 방식으로 구현함)
	    		   int firstNumTemp; // 임시 숫자 저장할 곳
	    		   
	    		   // 가장 오른쪽 끝 일 경우에만,
	    		   if(k==temp[f].length)
	    			   firstNumTemp = temp[f][k];
	    		   
	    		   // 맨왼쪽에 다 왔을 때
	    		   if(k==g) {
	    			   continue; // 그냥 넘겨
	    		   }else {
	    			   temp[f][k] = temp[f][k-1];
	    		   }
	    	   }
	    	   // 두번째 - 세로 오른쪽
	    	   for(int l=h;f<=l;l--) {
	    		   // 맨 아래부터 시작 하면 될 듯 한데?? 오!! (빼면서 위쪽으로 하는 방식으로 구현함)
	    		   int twoNumTemp; // 임시 숫자 저장할 곳
	    		   
	    		   // 가장 아랫쪽 끝 일 경우에만,
	    		   if(l==temp.length)
	    			   twoNumTemp = temp[l][i];
	    		   
	    		   // 맨위쪽에 다 왔을 때
	    		   if(l==f) {
	    			   continue;
	    		   }else {
	    			   temp[l][i] = temp[l-1][i];
	    		   }
	    	   }
	    	   // 셋번째 - 아래 가로
	    	   for(int m=g;m<=i;m++) {
	    		   // 맨 좌측부터 시작 하면 될 듯 한데?? 오!! (빼면서 오른쪽으로 하는 방식으로 구현함)
	    		   int threeNumTemp; // 임시 숫자 저장할 곳
	    		   
	    		   // 가장 좌측 끝 일 경우에만,
//	    		   if(m==temp[h].length)
	    		   if(m==0)
	    			   threeNumTemp = temp[h][g];
	    		   
	    		   // 맨오른쪽에 다 왔을 때
	    		   if(m==i) {
	    			   continue; // 그냥 넘겨
	    		   }else {
	    			   temp[h][m] = temp[h][m+1];
	    		   }
	    	   }
	    	   // 넷번째 - 세로 왼쪽
	    	   for(int n=f;n<=h;n++) {
	    		   
	    		   int forNumTemp;
	    		   
//	    		   if(n==temp.length)
	    		   if(n==0)
	    			   forNumTemp = temp[n][g];
	    		   
	    		   // 맨아래쪽에 다 왔을 때
	    		   if(n==h) {
	    			   continue;
	    		   }else {
	    			   temp[n][g] = temp[n+1][g];
	    		   }
	    	   }
	    	   
	    	   // 각각의 모서리 구현
	    	   
	    	   
	    	   // 그 중에 제일 작은 값을 최종 출력
	    	   
	       }
	        return answer;
	    }
}

 

아아아아아