티스토리 뷰

반응형

 

해커랭크 챌린지 11일차다!!

오늘 문제는 지금까지 풀었던 문제중에

가장 막막하고 재밌었다!!(?)

 

우선 잠깐의 결과 확인부터~

Day 11 결과 확인

 

 

필자의 코딩 문제 풀기 역사 이래로(?)

최초로 부분 테스트 케이스 통과

(즉, 결론적으로 틀린 거임)

근데 확실히 틀린게 아니라 애매하게 틀려서

더 흥미로웠음.(?)

(왜냐면 조금만 수정하면 풀 수 있다는 생각이 드니까 넘 짜릿하고 재밌었다. 😆)

 

처음엔 문제를 이해하는데 한 10분 이상을 소요했다.

번역기를 돌려도 모래시계 라는 말이 무엇을 의미하는지 몰랐고

번역기 + 예제 소스코드 설명 등을 한참 읽어보다 문제를 이해했다.

 

네이버 부스트캠프 코딩테스트를 응시하면서도

경험했었던 문제인데

백지에서 내가 직접 구현하는 것보다

입력받는 값까지 구현해두고 빈칸 채우는 식으로 문제 푸는것이

필자에게는 더 어렵다.

(아직 여러 데이터 타입과 입력 방식이 미숙해서 그런 듯,,)

 

이 문제도 이해하자마자

필자는 이중 배열([][]) 써서 for문 두번 돌려서

문제를 풀고 싶었으나

입력 받는 초기 세팅이 

List<List<Integer>> arr = new ArrayList<>();

이렇게 세팅 되어 있었고for문 반복으로 ArrayList를 채우는 것이 아닌

arr.add(
    Stream.of(bufferedReader.readLine().replaceAll("\\s+$", "").split(" "))
        .map(Integer::parseInt)
        .collect(toList())
);

stream으로 ArrayList를 채우는 방식이었다.

 

그래서 필자가 처음 생각한 for문으로 먼저 백지에 풀어보았다.

코드를 첨부한다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;

/*
 1 1 1 0 0 0
 0 1 0 0 0 0
 1 1 1 0 0 0
 0 0 2 4 4 0
 0 0 0 2 0 0
 0 0 1 2 4 0
  */
public class Test {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int arr[][] = new int[6][6];
        int sum = 0;
        int max = 0;
        for (int i = 0; i < 6; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");
            for (int j = 0; j < 6; j++) {
                arr[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        for (int i = 0; i <= 3; i++) {
            for (int j = 0; j <= 3; j++) {
                sum = arr[i][j] + arr[i][j + 1] + arr[i][j + 2]
                        + arr[i + 1][j + 1] + arr[i + 2][j] + arr[i + 2][j + 1] + arr[i + 2][j + 2];
                if (sum > max) max = sum;
            }
        }
        System.out.println(max);
    }
}

 

이러한 방식을 사용했다는 것만 알아두고

일단 계속 읽어보자!!

(위의 소스코드에서 놓친 부분이 있어

테스트 케이스 실행시 일부 테스트 케이스만 실행되므로

꼭 끝까지 읽길 바란다!! ❗❗)

 

위의 코드를 실행시켜보니

처음 테스트케이스는 통과했어서

 

주어진 조건에 맞추어 다시 실행해보았다.

그렇게 작성한 코드는 다음과 같다.

 

import java.io.*;
import java.math.*;
import java.security.*;
import java.text.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.function.*;
import java.util.regex.*;
import java.util.stream.*;
import static java.util.stream.Collectors.joining;
import static java.util.stream.Collectors.toList;


public class Solution {
    public static void main(String[] args) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        int sum = 0;
        int max = 0;
        List<List<Integer>> arr = new ArrayList<>();
        IntStream.range(0, 6).forEach(i -> {
            try {
                arr.add(
                    Stream.of(bufferedReader.readLine().replaceAll("\\s+$", "").split(" "))
                        .map(Integer::parseInt)
                        .collect(toList())
                );
            } catch (IOException ex) {
                throw new RuntimeException(ex);
            }
        });
        bufferedReader.close();
        
         for (int i = 0; i <= 3; i++) {
            for (int j = 0; j <= 3; j++) {
                sum = arr.get(i).get(j) + arr.get(i).get(j+1) + arr.get(i).get(j+2)
                        + arr.get(i+1).get(j+1) + arr.get(i+2).get(j) + arr.get(i+2).get(j+1) + arr.get(i+2).get(j+2);
                if (sum > max) max = sum;
            }
        }
        System.out.println(max);
    }
}

 

이제 맞겠지,, 하고

테스트 케이스를 실행시키니

다음과 같이 일부 테스트 케이스만 통과했다.

 

일부 테스트 케이스만 통과

 

궁금해서 test 케이스 잠금을 해제하고 확인해보니

음수 arraylist 등장!!

미처 음수는 생각하지 못했고

음수일 때 문제가 발생할 수 있는 부분은

max = 0

밖에 없었다.

 

음수들의 합이 0보다 작으므로

음수arraylist에선 항상 0이 출력되던 것,,,

 

그래서 조건에 맞게

(최소 값이 -9이므로

-9*7(모래시계모양)=-63)

max=-64;로 설정해주었다.

 

 

그렇게 작성한 최종 코드를 다시 첨부한다.

import java.io.*;
import java.math.*;
import java.security.*;
import java.text.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.function.*;
import java.util.regex.*;
import java.util.stream.*;
import static java.util.stream.Collectors.joining;
import static java.util.stream.Collectors.toList;


public class Solution {
    public static void main(String[] args) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        int sum = 0;
        int max = -64;
        List<List<Integer>> arr = new ArrayList<>();
        IntStream.range(0, 6).forEach(i -> {
            try {
                arr.add(
                    Stream.of(bufferedReader.readLine().replaceAll("\\s+$", "").split(" "))
                        .map(Integer::parseInt)
                        .collect(toList())
                );
            } catch (IOException ex) {
                throw new RuntimeException(ex);
            }
        });
        bufferedReader.close();
        
         for (int i = 0; i <= 3; i++) {
            for (int j = 0; j <= 3; j++) {
                sum = arr.get(i).get(j) + arr.get(i).get(j+1) + arr.get(i).get(j+2)
                        + arr.get(i+1).get(j+1) + arr.get(i+2).get(j) + arr.get(i+2).get(j+1) + arr.get(i+2).get(j+2);
                if (sum > max) max = sum;
            }
        }
        System.out.println(max);
    }
}

 

 

 

이제 테스트 케이스 실행 결과를 보자.

 

테스트 케이스 실행 결과

 

 

보다 싶이 통과할 수 있었다.

 

오늘 너무 신나게(?)

설명하다보니 소스코드에 대한 설명도 많이 적혀있었기 때문에

코드를 보면 딱히 이해되지 않는 부분은 없을 것이다!!

 

만약 이해되지 않거나 궁금한 점이 있다면 댓글로 질문해주길 바란다.


 

왠지 모르겠는데 오늘 챌린지가

포스팅도 가장 열심히 썼고

문제도 쫀득쫀득 재밌게 잘 풀렸다.

(문제 이해하는데 적당한 고민 + 문제 풀이에 적당한 고민 +

테스트 케이스 불발 + 금세 예외 캐치 + 그걸 신나게 설명하는 지금의 나,,)

 

최근 슬럼프와 번아웃을 가볍게 잊으라고 준

선물같은 문제가 아닐까 싶다.

 

그럼 내일 Day12의 챌린지로 다시 만나자.

😊

반응형