[JAVA] 백준 2477 : 참외밭
https://www.acmicpc.net/problem/2477
2477번: 참외밭
첫 번째 줄에 1m2의 넓이에 자라는 참외의 개수를 나타내는 양의 정수 K (1 ≤ K ≤ 20)가 주어진다. 참외밭을 나타내는 육각형의 임의의 한 꼭짓점에서 출발하여 반시계방향으로 둘레를 돌면서 지
www.acmicpc.net
문제 설계
1. ⓐ : 반시계방향으로 돌아갈 때 나오게 되는 default배열 만들기 -> {4, 2, 3, 1} 만듦
2. ⓑ : 회전 방향을 담은 배열, ⓒ : 길이를 담을 배열 을 만듦
3. 인덱스를 적절히 부여해서, ⓐ ⓒ 사이에 핀트가 나가는 곳에서 값을 가져와서 "가로 * 세로 = 작은 직사각형" 크기구하기
4. (1,2)(가로), (3,4)(세로)로 짝을 짓고, ⓑ 에서 하나 있는 애의 인덱스를 통해 배열 ⓒ의 길이정보를 따로 가져와서, "가로 * 세로 = 큰직사각형" 구하기
//예를 들어, {4,2,3,1,3,1}에서 (1,2)관점으로 볼때, 2는 1개 1은 2개니까, 배열 ⓑ의 2의 인덱스를 가져와서, ⓒ 에서 길이 찾기
5. (과정4결과 - 과정3결과) * (1m^2당 참외 개수)
import java.util.*;
import java.util.stream.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int K = sc.nextInt(); //평당 과일 개수
int[] rectArr = {4, 2, 3, 1}; //반시계방향 defaul root
int[] pathArr = new int[6]; //농장 구성 방향 배열
int[] lgtArr = new int[6]; //방향별 변의 길이
//input
for (int i = 0; i<pathArr.length; i++) {
pathArr[i] = sc.nextInt();
lgtArr[i] = sc.nextInt();
}
int chkVertex = pathArr[0]; //농장 시작점
int currVertex = 0; //돌리기 //농장 시작vertex기준으로 반시계 돌면서 확인용
int minRect, maxRect = 0; //작은 직사각형, 큰 직사각형
chkVertex = search(rectArr, chkVertex); //default로 준 배열에서 시작하는 위치 찾기
//search scale
while(true) {
if(chkVertex == 4) { //배열의 크기 넘어가지 않게 조절
chkVertex = 0;
}
if(currVertex == 6) { //위랑 마찬가지
currVertex = 0;
}
//핀트가 나가면 -> 아 여기에서 작은 직사각형이 생기는구나~
if(pathArr[currVertex] != rectArr[chkVertex]) {
int aa = currVertex-1;
if (currVertex-1 <0) { //음수제어
aa = 5;
}
if(currVertex<0) { aa = 3;} //배열범위 안넘어가게 조절
minRect = lgtArr[aa] * lgtArr[currVertex]; //작은 직사각형넓이
int[] a = {pathArr[aa], pathArr[currVertex]}; //작은 직사각형 가로세로나오는 방향
for(int j = 0; j<2; j++) { //방향의 짝꿍찾아주기
if (a[j]%2==0) {
a[j]--;
}else {
a[j]++;
}
}
int width = lgtArr[search(pathArr,a[0])]; //찾은 방향정보에 해당하는 인덱스를 찾아 해당 인덱스의 길이 정보 가져오기
int height = lgtArr[search(pathArr,a[1])];//위랑 마찬가지
maxRect = width * height; //큰 직사각형
break;
}
chkVertex++;
currVertex++;
}
System.out.println((maxRect-minRect)*K);//결과
}
//todo : 배열에서 찾는 정보의 index가져오기
//기존 indexOf는 객체정보로 찾아야해서, 불편해서 만듦
public static int search (int[] arr, int vtx) {
for (int i = 0; i < arr.length; i++) {
if (arr[i] == vtx) {
return i;
}
}
return -1;
}
}
주석에 설명을 달아놨다.
여기에서 내가 search라는 함수를 만들어놨는데, 이건 배열에서 원하는 정보가 있는 index를 반환한다.
원래는 indexOf함수를 쓰려고 피똥싸는 과정을 거쳤는데, 진짜 배열을 리스트를 바꾸는 캐스트를 거치고 함수를 적용하면, 값을 찾지 못해 -1를 반환하는 그지같은..게
그래서 binearySearch였나..? 아 함수 이름은 기억이 안나는데, 이진탐색 제공하는 함수를 쓰니까 -5를 반환한다.
근데 이건 이진탐색이 배열된 정렬에서 할 수 있다는 사실을 간과했기 때문에 일어난 일이라ㅠㅠ
내가 멍청한 탓이지 뭐..
여튼 좀 병신같이 풀었다.
배열 index조절하는 것도 조건문으로 하나하나 맞춰주고,, 다른 사람들은 어케 풀었나 궁금하다.