[코드트리 챌린지] 트로미노

Lee-MyungMo·2023년 9월 13일
0

CodeTree

목록 보기
6/8

2주차 실력진단


2주차 실력진단은 697점이 나왔다! 문제는 1주차와 비슷하게 풀은 것 같은데 점수가 다른 것을 보니 문제를 얼마나 빨리 풀었는지도 점수에 포함이 되는 것 같다. 푼 문제 난이도가 살짝 달랐을 수도 있지만..

문제


https://www.codetree.ai/missions/13/problems/tromino?&utm_source=clipboard&utm_medium=text

풀이 방법

  • 나올 수 있는 모든 모양들을 체크했다.
  • 총 6가지로 한 점을 잡아 (0,0)으로 설정한 뒤 격자 탐색을 진행하였다.

코드

import java.util.*;
import java.io.*;

public class Main {
    static int n, m;
    static int[][] grid;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer stk = new StringTokenizer(br.readLine(), " ");

        n = Integer.parseInt(stk.nextToken());
        m = Integer.parseInt(stk.nextToken());

        grid = new int[n][m];
        for (int i = 0; i < n; i++) {
            stk = new StringTokenizer(br.readLine(), " ");
            for (int j = 0; j < m; j++) {
                grid[i][j] = Integer.parseInt(stk.nextToken());
            }
        }

        int ans = 0;

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) { // 일자 블록 가로
                if (i + 2 >= n) {
                    continue;
                }
                ans = Math.max(ans, grid[i][j] + grid[i + 1][j] + grid[i + 2][j]);
            }

            for (int j = 0; j < m; j++) { // 일자 블록 세로
                if (j + 2 >= m) {
                    continue;
                }
                ans = Math.max(ans, grid[i][j] + grid[i][j + 1] + grid[i][j + 2]);
            }

            for (int j = 0; j < m; j++) { // ㄴ자 모양
                if (i + 1 >= n || j + 1 >= m) {
                    continue;
                }
                ans = Math.max(ans, grid[i][j] + grid[i + 1][j] + grid[i + 1][j + 1]);
            }

            for (int j = 0; j < m; j++) { // ㄴ자 모양 뒤집은 것
                if (i - 1 < 0 || j + 1 >= m) {
                    continue;
                }
                ans = Math.max(ans, grid[i][j] + grid[i][j + 1] + grid[i - 1][j + 1]);
            }

            for (int j = 0; j < m; j++) { // ㄱ자 모양
                if (i + 1 >= n || j + 1 >= m) {
                    continue;
                }
                ans = Math.max(ans, grid[i][j] + grid[i][j + 1] + grid[i + 1][j + 1]);
            }

            for (int j = 0; j < m; j++) { // ㄱ자 모양 뒤집은 것
                if (i + 1 >= n || j + 1 >= m) {
                    continue;
                }
                ans = Math.max(ans, grid[i][j] + grid[i + 1][j] + grid[i][j + 1]);
            }
        }

        System.out.println(ans);
    }
}

느낀점

솔직히 요즘 코딩테스트도 보고 문제도 푸는데 알고리즘보다 완전탐색 및 구현(시뮬레이션) 부분이 생각보다 약하다고 생각한다. 좀 더 많은 유형을 접하면서 익숙해지도록 노력해야할 것 같다.

profile
취준생

0개의 댓글