yunyj99
라둥이
yunyj99
GitHub
전체 방문자
오늘
어제
  • 분류 전체보기 (309)
    • 1. 프로그래밍 (50)
      • 1-1. Git (17)
      • 1-2. Java (13)
      • 1-2-1. Java GUI (1)
      • 오류 (12)
      • 기타 (7)
    • 2. Front-end (57)
      • 2-1. HTML (5)
      • 2-2. CSS (19)
      • 2-3. Java Script (33)
      • 2-4. React (0)
    • 3. Back-end (47)
      • 3-1. Spring MVC - 국비 (15)
      • 3-2. Spring MVC - 남궁성 (30)
      • 3-3. Spring - 김영한 (2)
    • 4. Android (1)
    • 5. DB (20)
      • 4-1. MySQL DBMS (20)
    • 6. 자료구조 & 알고리즘 (44)
      • 6-1. 자료구조 (14)
      • 6-2. 백준 (30)
    • 7. 웹 디자인 (7)
      • 7-1. UX 디자인 (7)
    • 8. 자격증 (35)
      • 8-1. 정보처리기사 (35)
    • 프로젝트 (3)
      • 프로젝트 기록 (3)
    • etc... (43)
      • 패스트캠퍼스 챌린지 (39)
      • 잡담 (4)

블로그 메뉴

  • 홈
  • 태그

최근 글

티스토리

hELLO · Designed By 정상우.
yunyj99

라둥이

쓰기
백준 - [ 2477번: 참외밭 ]
6. 자료구조 & 알고리즘/6-2. 백준

백준 - [ 2477번: 참외밭 ]

2022. 8. 4. 20:07

참외밭

 

문제

시골에 있는 태양이의 삼촌 댁에는 커다란 참외밭이 있다. 문득 태양이는 이 밭에서 자라는 참외가 도대체 몇 개나 되는지 궁금해졌다. 어떻게 알아낼 수 있는지 골똘히 생각하다가 드디어 좋은 아이디어가 떠올랐다. 유레카! 1m2의 넓이에 자라는 참외 개수를 헤아린 다음, 참외밭의 넓이를 구하면 비례식을 이용하여 참외의 총개수를 구할 수 있다.

1m2의 넓이에 자라는 참외의 개수는 헤아렸고, 이제 참외밭의 넓이만 구하면 된다. 참외밭은 ㄱ-자 모양이거나 ㄱ-자를 90도, 180도, 270도 회전한 모양(┏, ┗, ┛ 모양)의 육각형이다. 다행히도 밭의 경계(육각형의 변)는 모두 동서 방향이거나 남북 방향이었다. 밭의 한 모퉁이에서 출발하여 밭의 둘레를 돌면서 밭경계 길이를 모두 측정하였다.

예를 들어 참외밭이 위 그림과 같은 모양이라고 하자. 그림에서 오른쪽은 동쪽, 왼쪽은 서쪽, 아래쪽은 남쪽, 위쪽은 북쪽이다. 이 그림의 왼쪽위 꼭짓점에서 출발하여, 반시계방향으로 남쪽으로 30m, 동쪽으로 60m, 남쪽으로 20m, 동쪽으로 100m, 북쪽으로 50m, 서쪽으로 160m 이동하면 다시 출발점으로 되돌아가게 된다.

위 그림의 참외밭  면적은 6800m2이다. 만약 1m2의 넓이에 자라는 참외의 개수가 7이라면, 이 밭에서 자라는 참외의 개수는 47600으로 계산된다.

1m2의 넓이에 자라는 참외의 개수와, 참외밭을 이루는 육각형의 임의의 한 꼭짓점에서 출발하여 반시계방향으로 둘레를 돌면서 지나는 변의 방향과 길이가 순서대로 주어진다. 이 참외밭에서 자라는 참외의 수를 구하는 프로그램을 작성하시오.

 

입력

첫 번째 줄에 1m2의 넓이에 자라는 참외의 개수를 나타내는 양의 정수 K (1 ≤ K ≤ 20)가 주어진다. 참외밭을 나타내는 육각형의 임의의 한 꼭짓점에서 출발하여 반시계방향으로 둘레를 돌면서 지나는 변의 방향과 길이 (1 이상 500 이하의 정수) 가 둘째 줄부터 일곱 번째 줄까지 한 줄에 하나씩 순서대로 주어진다. 변의 방향에서 동쪽은 1, 서쪽은 2, 남쪽은 3, 북쪽은 4로 나타낸다.

 

출력

첫째 줄에 입력으로 주어진 밭에서 자라는 참외의 수를 출력한다.

 

예제 입력 1 

7
4 50
2 160
3 30
1 60
3 20
1 100

예제 출력 1 

47600

 


내가 푼 풀이.

 

ㄱ, ┏, ┗, ┛  이렇게 4 가지 모양이 있다. 여기서 반시계 방향으로 값을 입력받는다는 조건이 있었다.

여기서 ㄱ, ┗ 모양이면 max세로길이 다음에 max가로길이가 오고,  ┏, ┛모양이면 max가로길이 다음에 max세로길이가 온다는 점을 이용했다.

그리고 전체 사각형의 너비, 즉 가로 max * 세로 max 값에 작은 사각형의 너비값을 빼서 넓이를 구했다.

 

  1. 우선 가로, 세로 길이를 담을 arrayList인 width와 height를 생성했다.
  2. 반복문을 통해 방향과 값을 입력받아, 0 2 4번째 입력은 width에, 1 3 5번째 입력은 height에 넣었다. 방향은 신경쓰지 않고, 처음 입력받는 값을 가로 값이라고 가정했다!
  3. 가로 세로에서 각각 max인 값과, 해당 값의 index를 찾았다.
  4. 입력받을 때 가로값, 세로값, 가로값, .. 이런 식으로 입력받았다. 그래서 전체 입력받은 6개 값에서 -> 가로 세로에서 각각 max인 값의 index를 계산했다. 가로값을 먼저 입력받았으니 idxAW(전체 값에서 max 가로값의 인덱스)는 width 리스트에서 max값*2, idxAH는 height 리스트에서 max값 *2+1이 된다.
  5. 그리고 작은 사각형의 가로와 세로, calcW, calcH 값을 계산했다. ㄱ, ┗ 모양이면 if문에서 idxAW - idxAH == 1 || idxAW - idxAH == -5 조건을 만족할 것이고, ┏, ┛모양이면 else문의 코드가 실행될 것이다.
    ㄱ,ㄴ 모양이면 calcW는 max값 다음에 있는 값이고, calcH는 max값 이전에 있는 값이다. ┏, ┛모양이면 그 반대이다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;

public class Main {

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

		int cnt = Integer.parseInt(br.readLine());

        // 1.
		ArrayList<Integer> width = new ArrayList<>();
		ArrayList<Integer> height = new ArrayList<>();


        // 2.
		StringTokenizer st;
		int num;
		for (int i = 0; i < 6; i++) {
			st = new StringTokenizer(br.readLine());
			st.nextToken();
			num = Integer.parseInt(st.nextToken());

			if (i % 2 == 0) {
				width.add(num);
			} else {
				height.add(num);
			}
		}

        // 3.
		int maxW = Collections.max(width);
		int maxH = Collections.max(height);
		int idxW = width.indexOf(maxW);
		int idxH = height.indexOf(maxH);
		
        // 4.
		int idxAW = idxW * 2;
		int idxAH = idxH * 2 + 1;

		
        // 5.
		int calcW = 0, calcH = 0;
		if (idxAW - idxAH == 1 || idxAW - idxAH == -5) {
			calcW = idxW == 2 ? 0 : idxW + 1;
			calcH = idxH == 0 ? 2 : idxH - 1;
		} else {
			calcW = idxW == 0 ? 2 : idxW - 1;
			calcH = idxH == 2 ? 0 : idxH + 1;
		}

		calcW = width.get(calcW);
		calcH = height.get(calcH);

		bw.write((maxW * maxH - calcW * calcH) * cnt + "");

		bw.flush();
		bw.close();
		br.close();
	}
}

 

 


참조한 다른 분 풀이.

https://kau-algorithm.tistory.com/11

 

간단한 규칙이 있었다. 가로 값 max, 세로 값 max 다다음에 입력받은 가로 세로값이 전체 사각형에서 빼야하는 작은 사각형의 가로 세로값이 된다!!

'6. 자료구조 & 알고리즘 > 6-2. 백준' 카테고리의 다른 글

백준 - [ 1003번: 피보나치 함수 ]  (0) 2023.07.15
백준 - [ 11051번: 이항 계수2 ]  (0) 2022.08.16
백준 - [1181번: 단어 정렬 ]  (0) 2022.07.30
백준 - [1436번: 영화감독 숌]  (0) 2022.07.29
2751번: 수 정렬하기 2  (0) 2022.07.01
    '6. 자료구조 & 알고리즘/6-2. 백준' 카테고리의 다른 글
    • 백준 - [ 1003번: 피보나치 함수 ]
    • 백준 - [ 11051번: 이항 계수2 ]
    • 백준 - [1181번: 단어 정렬 ]
    • 백준 - [1436번: 영화감독 숌]
    yunyj99
    yunyj99
    개발자를 목표로 하는, 새싹처럼 성장하고 싶은 사람의 학습 공간 ^v^

    티스토리툴바