행렬 뒤집기

재피터노트북·2022년 9월 28일
0

문제


풀이 과정.

첫번째로 생각해야 할것은 뒤집을 원소가 1이면 0으로 만들고 0이면 1로 만듣다는 것이다. 나는 여기서 어떻게 생각했냐면 그러면 1행1열때 한번뒤집고 2행2열때 1행1열의 값들도 포함되어 있으면 그것도 뒤집어 주면 끝난다고 생각했다. 코드를 보면 right down up left가 있는데 그행과 그열의 4가지 방향으로 다 1이면 0으로 바꿔주고 0이면 1로 바꿔줘야 해서 저렇게 코드를 만들었다.

풀이코드

import java.util.Scanner;
public class Main{
    public static void main(String[] args){

       // Please Enter Your Code Here
       Scanner s = new Scanner(System.in);
       int[][] arr = new int[10][10];
       int num = s.nextInt();
       int cnt;
       
       for (int i=0;i<num;i++){
         // right
         cnt = 0;
         for (int j=i;j<10;j++){
           if (arr[i][j] == 0) arr[i][j] = 1;
           else if (arr[i][j] == 1) arr[i][j] = 0;
            // down
           if (i != j){
            if (arr[j][i] == 0) arr[j][i] = 1;
            else if (arr[j][i] == 1) arr[j][i] = 0;
           }
         }
         
         // left
         for (int j=i;j>=0;j--){
           if (i != j){
            if (arr[i][j] == 0) arr[i][j] = 1;
            else if (arr[i][j] == 1) arr[i][j] = 0;
           }
           // up
           if (i != j){
            if (arr[j][i] == 0) arr[j][i] = 1;
             else if (arr[j][i] == 1) arr[j][i] = 0;
           }
         }
       }
       
       // print arr
       for (int i=0;i<10;i++){
         for (int j=0;j<10;j++){
           System.out.print(arr[i][j] + " ");
         }
         System.out.println();
       }
      

    }
}

나의 생각.

위에 나의 코드는 그저 답을 제출해서 맞추기 위한 코드인거 같다. 내가 다시 봤을때도 이해하기가 힘들었고 코드도 너무 길었다. 지금 조금 개선한 코드는 행과 열 딱 2번만 for문을 돌면서 1이면 0으로 0이면 1로 바꿔주었다. 그리고 그렇게 for문을 두번 돌면 i 와 j가 겹치는부분이 두번 있는데 첫번째 겹쳤을때만 바꿔주고 두번째에 i == j가 같을때는 그냥 continue로 넘겨주었다.!
앞으로는 조금더 생각하고 코드를 작성해야겠다. 문제 답을 쫒아가는 코드가 아닌 목적이 있는 코드를 작성하고 싶어졌다!!

개선한 나의 코드

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
       // Please Enter Your Code Here
       Scanner s = new Scanner(System.in);
       int[][] arr = new int[20][20];
       int num = s.nextInt();
       int cnt;
       
       // 2차원 10 * 10 배열에 0값 채워넣기.
       for (int i=1;i<=10;i++) {
         for (int j=1;j<=10;j++){
           arr[i][j] = 0;
         }
       }
       
      // 행일때 열일때 각각 포문을 만들어 1이면 0으로 바꿔주고 0이면 1로 바꿔줌. 
      for (int i=1;i<=num;i++) {
        for (int j=1;j<=10;j++){
          if (arr[i][j] == 1) arr[i][j] = 0;
          else if (arr[i][j] == 0) arr[i][j] = 1;
        }
        for (int j=1;j<=10;j++){
          if (i == j ) continue;
          if (arr[j][i] == 1) arr[j][i] = 0;
          else if (arr[j][i] == 0) arr[j][i] = 1;
        }
      }
      
    }
}
profile
난 이 재 선

0개의 댓글