Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- 다이나믹 프로그래밍
- 2638
- 스프링 MVC
- 문자열 압축
- HTTP API
- 백준
- 설탕 배달
- 쓰레드 풀
- 투어
- 맛집
- 완도산회
- 2020 KAKAO BLIND
- 알고리즘
- BFS
- 동적 프로그래밍
- dp
- 포두부 보쌈
- 서블릿
- 1로 만들기
- 고모네 콩탕
- 스프링
- mvc
- 맛집 투어
- 2839
- 양꼬치
- Spring
- 2589
- 프로그래머스
- Servlet
- 호유동
Archives
- Today
- Total
프로그래밍 공방
[백준] 3019번 : 테트리스 본문
문제 |
테트리스는 C열 필드위에서 플레이하는 유명한 게임이다. 필드의 행의 수는 무한하다.
한 번 움직일 때, 아래와 같은 일곱가지 블록 중 하나를 필드에 떨어뜨릴 수 있다.
블록을 떨어뜨리기 전에, 플레이어는 블록을 90, 180, 270도 회전시키거나 좌우로 움직일 수 있다.
이때, 블록이 필드를 벗어나지 않으면 된다. 블록을 필드의 바닥이나 이미 채워져있는 칸의 위에 놓여지게 된다.
창영이가 하고있는 테트리스는 일반적인 테트리스와 약간 규칙이 다르다.
블록이 떨어졌을 때, 블록과 블록 또는 블록과 바닥 사이에 채워져있지 않은 칸이 생기면 안 된다.
예를 들어, 아래와 같이 각 칸의 높이가 2, 1, 1, 1, 0, 1인 경우를 생각해보자.
블록 5번을 떨어뜨리는 방법의 수는 아래와 같이 다섯가지이다.
테트리스 필드의 각 칸의 높이와 떨어뜨려야 하는 블록의 번호가 주어진다.
이때, 블록을 놓는 서로 다른 방법의 수를 구하는 프로그램을 작성하시오.
입력 |
첫째 줄에 C와 떨어뜨리는 블록의 번호 P가 주어진다. (1 ≤ C ≤ 100, 1 ≤ P ≤ 7)
둘째 줄에는 각 칸의 높이가 주어진다. 높이는 0보다 크거나 같고, 100보다 작거나 같은 자연수이다.
출력 |
첫째 줄에 블록을 떨어뜨리는 방법의 수를 출력한다.
문제해결방법 |
블록마다 생길 수 있는 모양에 대해서 높이의 차이를 기록해둔다.
테트리스 필드의 높이와 블록 모양 높이 차이를 비교해가면서 블록을 놓을 수 있는 경우를 세준다.
코드 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | package baekjoon; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; class Module { private int[] field; private List<List<Integer>> list = new ArrayList<>(); Module(String s, int[] field) { setList(s.split(",")); this.field = field.clone(); } private void setList(String[] str) { for(String s : str) { ArrayList<Integer> temp = new ArrayList<>(); for(int i=0; i<s.length(); i++) { temp.add(s.charAt(i)-'0'); } this.list.add(temp); } } public int check() { int count = 0; for(List<Integer> l : list) { int size = l.size(); loop:for(int i=0; i<=field.length-size; i++) { int value = field[i]-l.get(0); for(int j=1; j<size; j++) { if(value!=field[i+j]-l.get(j)) continue loop; } count++; } } return count; } } public class Main3019_테트리스 { public static String[] block = {"0,0000", "00", "001,10", "100,01", "000,01,10,101", "000,20,011,00", "000,02,110,00"}; public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); int n = Integer.parseInt(st.nextToken()); int blockNum = Integer.parseInt(st.nextToken()); int[] field = new int[n]; st = new StringTokenizer(br.readLine()); for(int i=0; i<field.length; i++) field[i] = Integer.parseInt(st.nextToken()); Module module = new Module(block[blockNum-1], field); System.out.println(module.check()); } } | cs |
코드에 대한 피드백이나 더 좋은 아이디어는 언제나 환영입니다.
'개발 > 문제해결' 카테고리의 다른 글
[프로그래머스] 스킬트리 (0) | 2020.11.13 |
---|---|
[백준] 11726번 : 2xn 타일링 (0) | 2020.11.13 |
[백준] 2644번 : 촌수계산 (0) | 2020.11.12 |
[백준] 11725번 : 트리의 부모 찾기 (0) | 2020.11.12 |
[백준] 1051번 : 숫자 정사각형 (0) | 2020.11.11 |