전체 글 (19)
방명록
- [BOJ] 3019 : 테트리스 - java2024년 06월 21일 17시 29분 27초에 업로드 된 글입니다.작성자: hwangmono__o
문제
https://www.acmicpc.net/problem/3019
문제풀이
7가지 모양의 블록이 주어지고 입력한 블록이 90도, 180도, 270도 회전하여 모양을 변경하는 경우를 생각한다.
1,3,4 블록 : 2가지 / 2블록 : 1가지 / 5,6,7블록 : 4가지의 모양으로 변경할 수 있다.
문제에서 언급된 대로 행은 고려하지 않고 블록이 떨어질 바닥면 높낮이만 생각한다.
블록의 아랫면만 체크하면 되기에 String[][] blocks에 각 회전하여 닿는 부분을 "0", "1"로 표현하였다.
ex) ㄴ: 000, ㄱ: 110, ㅜ: 101, ㅓ: 10
블록의 모양별로 전체 열에 대해 순회를 하며 블록의 아래모양과 바닥이 같은지 비교(빈칸 발생)하며 카운트한다.
소스코드
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class _3019 { static int C, P; // 열, 블록 static int[] arr; static int cnt = 0; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); C = Integer.parseInt(st.nextToken()); P = Integer.parseInt(st.nextToken()); arr = new int[C]; st = new StringTokenizer(br.readLine()); for (int i = 0; i < C; i++) { arr[i] = Integer.parseInt(st.nextToken()); } String[][] blocks = { {"0", "0000"}, // | {"00"}, // ㅁ {"001", "10"}, // \Z {"100", "01"}, // Z {"000", "01", "101", "10"}, // ㅗ {"000", "00", "011", "20"}, // \ㄴ {"000", "02", "110", "00"} // ㄴ }; for (String block : blocks[P - 1]) { int len = block.length(); // 블럭이 닿는 면적에 따라 열을 순회할 수 있는 횟수가 다르다 for (int i = 0; i <= C - len; i++) { boolean check = true; for (int j = 0; j < len - 1; j++) { // 블록과 닿는 모양 비교 if (block.charAt(j) - block.charAt(j + 1) != arr[i + j] - arr[i + j + 1]) { check = false; break; } } if (check) cnt++; } } System.out.println(cnt); br.close(); } }
etc
처음 풀이할 때 입력받은 블록번호를 switch~case문으로 정리하고 이중 for문으로 체크하며 카운트를 증가시키는 메서드를 따로 작성하여 블록의 변화하는 모양별로 메서드를 호출하는 형식으로 코드를 작성하였다.
풀이를 완료하고 chatGPT를 통해 블록 패턴을 2차원 배열로 정의하여 switch 문을 제거하였고 불필요한 변수 사용 내부 루프 단순화 등 간결한 코드 및 메모리 사용량을 줄여보았다.
chatGPT 성능이 점점 좋아져 편리하지만... 평소 개발 시에도 간결한 클린코드를 할 수 있는 습관을 들이도록 해야겠다.
알고리즘 분류 : 브루트포스 알고리즘
브루트포스 탐색 알고리즘
브루트포스 알고리즘이란?브루트포스 알고리즘은 가능한 모든 경우를 탐색하여 문제를 해결하는 방법입니다. "완전 탐색"이라고도 불리며, 무차별 대입 방식으로 모든 후보를 검사합니다. 이
djun95.tistory.com
'Algorithm > 백준' 카테고리의 다른 글
[BOJ] 1912 : 연속합 - java (0) 2024.07.16 [BOJ] 1254 : 팰린드롬 만들기 - java (0) 2024.07.04 [BOJ] 28702 : FizzBuzz - java (0) 2024.06.05 [BOJ] 30802 : 웰컴 키트 - java (0) 2024.06.05 [BOJ] 2659 : 십자카드 문제 - java (0) 2024.06.04 다음글이 없습니다.이전글이 없습니다.댓글