반응형
은세고화
뚜렷한 기억보단 흐릿한 잉크를
은세고화
전체 방문자
오늘
어제
  • 분류 전체보기 (96)
    • TDD (2)
      • 학점 산출 프로그램 (2)
    • IT (44)
      • 부스트코스 (18)
      • CS50 (3)
      • 도서추천 알고리즘 (2)
      • 스터디 일정 (3)
      • 스프링 (3)
      • 프로젝트 개발 중 발생한 에러 (8)
      • 웹개발 (4)
      • DB (3)
    • 독서 후기 (12)
      • 도서 (12)
    • e북 (3)
    • 알고리즘 (26)
    • 프로젝트 (6)
      • 향수 (6)
    • 회고 (1)

블로그 메뉴

  • 홈

공지사항

인기 글

티스토리

hELLO · Designed By 정상우.
글쓰기 / 관리자
은세고화

뚜렷한 기억보단 흐릿한 잉크를

알고리즘

백준 2470 자바 드래곤 커브

2022. 3. 9. 22:06
반응형

https://www.acmicpc.net/problem/15685

 

15685번: 드래곤 커브

첫째 줄에 드래곤 커브의 개수 N(1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 드래곤 커브의 정보가 주어진다. 드래곤 커브의 정보는 네 정수 x, y, d, g로 이루어져 있다. x와 y는 드래곤 커

www.acmicpc.net

 

접근 방식

풀지 못했다.

기존에 그린 선을 그대로 90도 회전해서 다시 그려야 한다. 처음에는 재귀 문제인 줄 알고 한참을 생각했다. 답이 나오지 않아서 선을 총 몇 번 그려야 하는지 계산 해보니 2의 k승만큼 선을 그어야 하는 사실을 확인했다.

for문으로 Math.pow(2,k)로 접근해봤으나 진척이 나지 않았다. 

 

기존에 그린 선을 90도 회전해서 다시 그려야 하는 규칙을 찾았는데 도통 어떻게 그려야 할지 감이 잡히지 않았다. 

그린 선을 통채로 90도 회전해서 그린다고 생각을 했는데 답안을 보니 그 방법이 아니었다.

 

처음 그린 선을 계속해서 90도 회전하면 사각형 모양에서 무한루프 된다. 선을 그릴 때 맨 앞 선을 회전하고 그리는 방법이 아니고 맨 뒷산을 회전한 뒤 그림을 그리고 그 앞선을 또 회전해서 그리고...

이 방법을 끝날 때 까지 무한반복이었다.

 

통째로 회전한다고 생각하지 말고 문제를 잘게 잘게 쪼개서 접근했어야 답을 찾을 수 있는 문제다.  한 줄 한 줄 회전시키다 보면 규칙을 찾을 수 있는데 너무 큰 그림을 그린 것 같다.

 

 

package backjon;

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

public class Main {

	static int N;
	static boolean[][] arr = new boolean[101][101];
	//우상좌하
	static int[] dy = {0,-1,0,1};
	static int[] dx = {1,0,-1,0};
	
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int T = Integer.parseInt(br.readLine());
		
		for (int i = 0; i < T; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			int x = Integer.parseInt(st.nextToken());
			int y = Integer.parseInt(st.nextToken());
			int d = Integer.parseInt(st.nextToken());
			int g = Integer.parseInt(st.nextToken());
			
			draw(x,y,d,g);
		}
		
		int count = 0;
		for(int i=0; i<100; i++) {
			for(int j=0; j<100; j++) {
				if(arr[i][j] && arr[i+1][j] && arr[i][j+1] && arr[i+1][j+1]) count++;
			}
		}
		
		System.out.println(count);
		
	}

	private static void draw(int x, int y, int d, int g) {
		List<Integer> list = new ArrayList<>();
		
		list.add(d);
		for (int i = 0; i < g; i++) {
			int start = list.size()-1;
			while(start >= 0) {
				int dir = list.get(start);
				list.add((dir+1)%4);
				start--;
			}
		}
		
		arr[y][x] = true;
		for (int i : list) {
			y += dy[i];
			x += dx[i];
			arr[y][x] = true;
		}
		
	}
	
}

 

 

선을 모두 저장하고 한번에 그리므로 선의 위치를 리스트에 저장하지 말고 선의 방향을 저장한다.

그리고 초기 위치부터 방향대로 한 번에 그리는 방식으로 작성했다.

반응형
저작자표시 (새창열림)

'알고리즘' 카테고리의 다른 글

백준 9663 N-Queen 자바  (0) 2022.03.17
프로그래머스 주차요금계산 자바  (0) 2022.03.16
백준 18870 자바  (1) 2022.03.09
백준 2108 자바  (0) 2022.03.08
백준 1436 자바  (0) 2022.03.07
    '알고리즘' 카테고리의 다른 글
    • 백준 9663 N-Queen 자바
    • 프로그래머스 주차요금계산 자바
    • 백준 18870 자바
    • 백준 2108 자바
    은세고화
    은세고화

    티스토리툴바