[SWEA][JAVA] 농작물 수확하기

Boknami·2023년 10월 24일

SWEA

목록 보기
8/14

💡 아이디어

마름모 모형에 공간을 어떻게 구할지에 대해서 생각해야했다.
마름모 모형에 공간이 어떤 식으로 이루어지는 직접 적어보며 규칙을 파악했다.

  • 첫 공간은 size/2
  • 개수는 1개에서 시작해서 +2씩
    2개의 규칙이 보였고 이를 위해서 반복문을 2개로 구성해서
    맨 위~ 중간, 중간+1~끝 이렇게 돌리려고 생각했다.

🚨 오류

주어지는 입력이 어떤 형태인지 확인하고 입력 받자

코드들 다 작성하고 돌리는데 계속 오류가 났다. 인덱스를 초과할 일이 없을텐데..하고 싶어서 보니까 값을

1 2 3
4 5 6
7 8 9

이렇게 주어진 게 아니고 123 456 789 이렇게 주어져서 내가 직접 나누어야했다. 그래서 nextInt로 값을 받고 그 다음에 직접 /10, %10을 이용해서 하나씩 배열에 배정을 했는데 이 방법에서도 오류가 났다.

주어지는 입력의 공간까지 고려해서 받자. Int,Long..

농장이 최대 49*49니까 최대 49길이에 숫자가 주어지고 이를 나눠야하기 때문에 int를 사용해서 직접 자리수를 나누는 행위는 옳지 않아보였다. 이를 위해서 String형태를 사용하고 charAt을 사용하니 쉽게 해결!

💻 성공코드

import java.util.*;
import java.io.*;
class Solution
{
    public static void main(String args[]) throws Exception
    {
        Scanner sc = new Scanner(System.in);
        int T=sc.nextInt();

        for(int test_case = 1; test_case <= T; test_case++)
        {
            System.out.print("#" + test_case + " ");
            int size = sc.nextInt();
            int[][] farm = new int[size][size];

            //입력받아서 INT배열에 담기
            for(int i = 0 ; i < size; i++){
                String temp = sc.next();
                for(int j = 0 ; j < temp.length(); j++){
                    farm[i][j] = temp.charAt(j)-'0';
                }
            }


            int sum = 0;
            int start = size/2;
            int cnt = 1;
            //중앙까지 진행
            for(int i = 0 ; i <= size/2; i++){
                int saveStart = start;
                for(int j= 0 ; j<cnt; j++){
                    sum += farm[i][saveStart];
                    saveStart++;
                }
                start--;
                cnt+=2;
            }
            //중앙보다 한 칸 밑에서 끝까지.
            start = 1;
            cnt = size-2;
            for(int i = size/2+1; i < size; i++){
                int saveStart = start;
                for(int j= 0 ; j<cnt; j++){
                    sum += farm[i][saveStart];
                    saveStart++;
                }
                start++;
                cnt-=2;
            }
            System.out.println(sum);
        }
    }
}

😎 코드 개선

내가 쓴 코드는 전체를 기준으로 2번을 나누어 반복문이 수행되는데 이를 하나의 반복문 안에서 빠르게 처리하는 게 당연 더 좋을 것이다!

이를 위해서 현재 i가 어디를 지나고 있는지만 파악하면 쉽게 해결할 수 있다.

즉 i가 중앙을 기준으로 초과인지 이하인지 판단하면 된다!

import java.util.*;
import java.io.*;
class Solution
{
    public static void main(String args[]) throws Exception
    {
        Scanner sc = new Scanner(System.in);
        int T=sc.nextInt();

        for(int test_case = 1; test_case <= T; test_case++)
        {
            System.out.print("#" + test_case + " ");
            int size = sc.nextInt();
            int[][] farm = new int[size][size];

            //입력받아서 INT배열에 담기
            for(int i = 0 ; i < size; i++){
                String temp = sc.next();
                for(int j = 0 ; j < temp.length(); j++){
                    farm[i][j] = temp.charAt(j)-'0';
                }
            }


            int sum = 0;
            int start = size/2;
            int cnt = 1;
            //중앙까지 진행
            for(int i = 0 ; i < size; i++){
                int saveStart = start;
                for(int j= 0 ; j<cnt; j++){
                    sum += farm[i][saveStart];
                    saveStart++;
                }
                
                if(i < size/2){
                    start--;
                	cnt+=2;
                }
                else if(i >= size/2){
                    start++;
                    cnt -=2;
                }
            }
           
            System.out.println(sum);
        }
    }
}

0개의 댓글