꾸물꾸물 졔의 개발공부

정올 1856 - 사각형 (JAVA) 본문

알고리즘/정올

정올 1856 - 사각형 (JAVA)

체제 2022. 1. 23. 14:25

출처: 정보올림피아드 알고리즘

힌트를 본 문제, 힌트보기전에는 배열에 넣을 생각을 0.1초 했다가 바로 포기했다 . 

 

[ 첫번째 문제해결 방법 ]

각 행에 대하여,  홀수행과 짝수행의 출력방식이 달라지는 걸 알 수 있다 .

짝수행 -> 제대로 출력 / 홀수행 -> 반대로 출력 

조건제어문을 활용하여, 각각의 경우를 나누었다.

- - -  구구절절 풀이법 - - -

int index =1 ; int indexd; // ++ 과 -- 연산을 위해서, 값이 중구난방 되지 않게 하기 위해 변수 2개 설정 

if(짝수행) { 열 길이만큼 반복하며 index++ 출력}

else ( 홀수행 ) { 짝수행에서 끝난 index ++ 값 에다가, m-1 만큼 더해서 새로운 변수 indexd 에 추가.  ex) 첫번째 줄이 index ++ = 6 인채로 끝났으니, m-1 더해주면 10 ..... 1차원사고 헷 

indexd는 다음줄을 위해 +1 해서, index에 넣어두고, indexd -- 하며 출력 } 

 

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
package jungol;
 
import java.util.Scanner;
 
public class jg_1856 {
    public static void main(String args[]) {
        Scanner sc= new Scanner(System.in);
        int n=sc.nextInt();
        int m=sc.nextInt();
        int index=1;
        int indexd;;
        for(int i=1; i<=n; i++) {
            if(i%2==1) {
                for(int j=0; j<m; j++) {
                    System.out.print(index++ + " ");
                }
                System.out.println();
            }
            else {
                 indexd=index+m-1;
                 index=indexd+1;
                for(int j=0; j<m; j++) {
                    System.out.print(indexd-- + " ");
                }
                System.out.println();
            }
            
        }
    }
}
 
cs

 


자바나 모든 언어는 위에서 순서대로, 왼쪽부터 순서대로 출력이 되기 때문에, 그냥 바로 출력하려면 위와 같이 복잡해짐

그래서,

[ 두번째 문제해결 방법 ]

우선, 출력하고자 하는 순서대로 2차원 배열에 미리 넣어둔다. 

{ { 1 , 2 , 3 , 4 , 5 }

 , { 10 , 9 , 8 , 7 , 6 }

, { 11 , .... } ← 바로 출력하면 됨 . 

배열에 숫자들을 출력순서대로 넣을 함수를 별도로 만들어서, 똑같이 짝수행과 홀수행을 구분하여 저장 .

짝수행일때에는 , arr[행][열 증가순] 대로 값 저장

홀수행일때에는, arr[행][열 감소순] 대로 값 저장 

 

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
32
33
34
35
package jungol;
 
import java.util.Scanner;
 
public class jg_1856_2 {
    
    static int[][] fill(int n, int m) {
        int arr[][]= new int [n][m];
        int num=1;
        for(int i=0; i<n; i++) {
            if(i%2==0) { // 앞에서 부터 배열
            for(int j=0; j<m; j++)
                arr[i][j]=num++;
            }
            
            else { // 뒤에서 부터 배열 
                for(int j=m-1; j>=0; j--)
                    arr[i][j]=num++;
            }
        }
        return arr;
    }
    public static void main(String args[]) {
        Scanner sc= new Scanner(System.in);
        int n= sc.nextInt();
        int m=sc.nextInt();
        int get[][]=fill(n,m);
        for(int i=0; i<n; i++) {
            for(int j=0; j<m; j++)
                System.out.print(get[i][j]+" ");
        System.out.println();
        }
    }
}
 
cs

 

→ fill() 함수로 배열에 값을 저장하고 배열을 리턴한다 .

main 함수에서 위의 배열을 받아서, 출력 하면 끝 ~