❓
정말 풀어보려고 시도는 했는데... 너무 안 돼서 나와 같은 풀이(전체 넓이에서 오목한 부분의 넓이 빼기)를 이용한 다른 사람의 코드를 확인했다.
사실 내 코드 중 어느 부분이 틀린 지 아직 모르겠어서 일단 올려두고 나중에 좀 더 보려 한다.
✨ 참고
https://velog.io/@jihun333/%EB%B0%B1%EC%A4%802477-%EC%B0%B8%EC%99%B8%EB%B0%AD-%EC%9E%90%EB%B0%94
풀이 1
더보기
- 틀린 답안
- 밭의 경계선이 꺾여들어가는 경우 기존에 나왔던 방향의 중복이 연속으로 나옴
- 밭 경계선의 방향과 크기를 받을 때마다 해당 경계선의 앞뒤 경계선 방향 확인
- 앞뒤 경계선의 방향이 서로 같다면 해당 경계선은 꺾여들어간 부분
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
/*
* 오른쪽 위 꼭지점에서 시작하는 경우 기본 방향 4 2 3 1
* 꺾여들어가는 경우 기존에 나왔던 방향의 중복이 연속으로 나옴
* 특정 인덱스 위치에서 앞뒤 순서의 방향이 맞는지 확인 (ex. 방향이 4인 경우를 확인할 때 앞은 1, 뒤는 2여야 함)
*/
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int k = Integer.parseInt(br.readLine());
int width = 0;
int height = 0;
// 밭에서 없앨 넓이
int delWidth = 0;
int delHeight = 0;
int[][] field = new int[6][2];
for (int i = 0; i < 6; i++) {
st = new StringTokenizer(br.readLine());
field[i][0] = Integer.parseInt(st.nextToken()); // 방향
field[i][1] = Integer.parseInt(st.nextToken()); // 길이
}
int index = -1;
for (int i = 1; i < 5; i++) {
switch (field[i][0]) {
case 1:
if (field[i-1][0] == 3 && field[i+1][0] == 4)
break;
case 2:
if (field[i-1][0] == 4 && field[i+1][0] == 3)
break;
case 3:
if (field[i-1][0] == 2 && field[i+1][0] == 1)
break;
case 4:
if (field[i-1][0] == 1 && field[i+1][0] == 2)
break;
default:
if (field[i-1][0] == field[i+1][0]) {
index = i;
if (field[i][0] == 1 || field[i][0] == 2) {
delHeight = field[i][1];
height = (field[i][0] == 1) ? 2 : 1;
} else {
delWidth = field[i][1];
width = (field[i][0] == 3) ? 4 : 3;
}
}
break;
}
}
if (delWidth == 0 && delHeight == 0) {
delWidth = field[0][1];
delHeight = field[5][1];
}
else if (delWidth == 0 || delHeight == 0) {
if (index == 1) {
if (delWidth == 0)
delWidth = field[index-1][1];
else
delHeight = field[index-1][1];
}
else {
if (delWidth == 0)
delWidth = field[index+1][1];
else
delHeight = field[index+1][1];
}
}
for (int[] dir : field) {
if (dir[0] == width)
width = dir[1];
else if (dir[0] == height)
height = dir[1];
}
System.out.println((width*height - delWidth*delHeight) * k);
}
}
풀이2
- 각 변의 방향과 길이를 입력 받을 때마다 가장 긴 가로/세로 길이와 비교
- 가장 긴 가로와 세로의 위치를 구함
- 가장 긴 가로/세로 변의 좌우 길이를 각각 확인한 후 해당 변끼리의 차를 구함
- = 빼야할 사각형의 한 변의 길이와 같음
- 가로와 세로의 위치 인덱스가 0 또는 5인 경우 따로 확인 필요
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int k = Integer.parseInt(br.readLine());
int[] field = new int[6];
int width = 0;
int height = 0;
int widthIndex = -1;
int heightIndex = -1;
for (int i = 0; i < 6; i++) {
st = new StringTokenizer(br.readLine());
int direction = Integer.parseInt(st.nextToken());
field[i] = Integer.parseInt(st.nextToken());
if ((direction == 1 || direction == 2) && field[i] > height) {
height = field[i];
heightIndex = i;
}
else if ((direction == 3 || direction == 4) && field[i] > width) {
width = field[i];
widthIndex = i;
}
}
int right, left;
int minWidth, minHeight;
// 가로
if (widthIndex == 0) right = 5;
else right = widthIndex - 1;
if (widthIndex == 5) left = 0;
else left = widthIndex + 1;
minWidth = Math.abs(field[right] - field[left]);
// 세로
if (heightIndex == 0) right = 5;
else right = heightIndex - 1;
if (heightIndex == 5) left = 0;
else left = heightIndex + 1;
minHeight = Math.abs(field[right] - field[left]);
System.out.println((width*height - minWidth*minHeight) * k);
}
}
'코딩테스트 > 백준' 카테고리의 다른 글
[백준 7785/Java] 회사에 있는 사람 (0) | 2023.10.09 |
---|---|
[백준 24267/Java] 알고리즘 수업 - 알고리즘의 수행 시간 6 (1) | 2023.09.26 |
[백준 1620/Java] 나는야 포켓몬 마스터 이다솜 (0) | 2023.02.06 |
[백준 11729/Java] 하노이 탑 이동 순서 (0) | 2023.01.21 |
[백준 2447/Java] 별 찍기 - 10 (0) | 2023.01.19 |
댓글