728x90
https://www.acmicpc.net/problem/2477
풀이 방법
최대 세로길이와 가로길이를 구하고 나서 모든 방향에서 그림을 그려보면,
1. 최대 가로길이 양옆 길이 중 작은 길이가 파란사각형의 세로길이
2. 최대 세로길이 양옆 길이 중 작은 길이가 노란사각형의 가로길이
-> 구해진 길이를 이용해 넓이 구함
JAVA 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class BOJ_2477_참외밭 {
static StringTokenizer st;
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
int N=Integer.parseInt(br.readLine()); //참외 개수
int[] input=new int[6];
int maxR=0,maxC=0; // 최대 세로길이, 최대 가로길이
int indexR=0,indexC=0;
for (int i = 0; i < 6; i++) {
st=new StringTokenizer(br.readLine());
int dir=Integer.parseInt(st.nextToken());
int distance=Integer.parseInt(st.nextToken());
if(dir==3 || dir==4) {// r
maxR=maxR<distance?distance:maxR;
if (maxR==distance) indexR=i;
}else { // c
maxC=maxC<distance?distance:maxC;
if (maxC==distance) indexC=i;
}
input[i]=distance;
}
int nextR1=input[5],nextC1=input[5]; // nextR1,R2 => 세로길이 후보
int nextR2=input[0],nextC2=input[0]; // nextC1,C2 => 가로길이 후보
if (indexC-1>-1) nextR1=input[indexC-1];
if (indexC+1<6) nextR2=input[indexC+1];
if (indexR-1>-1) nextC1=input[indexR-1];
if (indexR+1<6) nextC2=input[indexR+1];
// 최대 가로길이*세로길이후보 중 작은 길이 + 가로길이후보 중 작은 길이*(최대 세로길이-세로길이후보 중 작은 길이)
int area=maxC*Math.min(nextR1, nextR2)+Math.min(nextC1, nextC2)*(maxR-(Math.min(nextR1, nextR2)));
System.out.println(area*N);
}
}
처음엔 반례를 못찾아서 뭐가 틀렸는지 몰랐었는데, 직접 반례를 만들어보면서 코드를 보니 ㄱ의 반대방향을 고려해주지 못해 틀린거였다. 그부분을 수정하고나니 맞았다!
내가 틀렸던 반례는
1
1 20
4 160
2 50
3 100
1 30
4 60
답 : 6200
728x90
'알고리즘 > 백준 BOJ' 카테고리의 다른 글
[JAVA] 백준 17413 단어 뒤집기 2 (0) | 2021.08.30 |
---|---|
[JAVA] 백준 2567 색종이-2 (0) | 2021.08.30 |
[JAVA] 백준 13300 방배정 (0) | 2021.08.28 |
[JAVA] 백준 16236 아기상어 (0) | 2021.08.25 |
[JAVA] 백준 10026 적록색약 (0) | 2021.08.23 |