100세까지 코딩
[SWEA] 1206. View (JAVA) 본문
문제 설명
※ SW Expert 아카데미의 문제를 무단 복제하는 것을 금지합니다.
https://swexpertacademy.com/main/solvingProblem/solvingProblem.do
풀기 전 생각
- 슬라이딩 윈도우와 비슷한 느낌
- 배열을 미리 1001로 초기화하고 입력받은 빌딩 수만큼 빌딩 높이 저장
- 5개를 한 묶음으로 생각하며 i = 2부터 시작하여 (i = 빌딩 수 - 2)만큼 반복
- i-2, i-1, i+1, i+2 중에 가장 높은 건물 높이를 구하여 현재 빌딩이 더 크면 (현재 빌딩 - 가장 높은 건물 높이)
- 더해나가면서 총세대수를 구하기
코드
import java.util.Scanner;
import java.io.FileInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
import java.util.StringTokenizer;
class SweaBuilding {
static int[] height = new int[1001];
public static void main(String args[]) throws IOException {
int T = 10;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
for (int test_case = 1; test_case <= T; test_case++) {
int sum = 0;
int cnt = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < cnt; i++) {
height[i] = Integer.parseInt(st.nextToken());
}
for (int i = 2; i < cnt - 2; i++) {
int max = findMax(height[i - 2], height[i - 1], height[i + 1], height[i + 2]);
if (height[i] > max) {
sum += height[i] - max;
}
}
System.out.println("#" + test_case + " " + sum);
}
}
public static int findMax(int a, int b, int c, int d) {
int max = 0;
if (a > b) {
if (a > c) {
if (a > d) {
max = a;
} else {
max = d;
}
} else {
if (c > d) {
max = c;
} else {
max = d;
}
}
} else {
if (b > c) {
if (b > d) {
max = b;
} else {
max = d;
}
} else {
if (c > d) {
max = c;
} else {
max = d;
}
}
}
return max;
}
}
오류 및 개선
- findMax 함수가 너무 길고 가독성이 부족
최종 코드
import java.util.Scanner;
import java.io.FileInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
import java.util.StringTokenizer;
class SweaBuilding {
static int[] height = new int[1001];
public static void main(String args[]) throws IOException {
int T = 10;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
for (int test_case = 1; test_case <= T; test_case++) {
int sum = 0;
int cnt = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < cnt; i++) {
height[i] = Integer.parseInt(st.nextToken());
}
for (int i = 2; i < cnt - 2; i++) {
int max = findMax(height[i - 2], height[i - 1], height[i + 1], height[i + 2]);
if (height[i] > max) {
sum += height[i] - max;
}
}
System.out.println("#" + test_case + " " + sum);
}
}
public static int findMax(int a, int b, int c, int d) {
int max = a;
if(b > max) max = b;
if(c > max) max = c;
if(d > max) max = d;
return max;
}
}
'코딩테스트 > 자바' 카테고리의 다른 글
[SWEA] 18662. 등차수열 (JAVA) (0) | 2023.11.06 |
---|---|
[SWEA] 1859. 백만 장자 프로젝트 (JAVA) (1) | 2023.10.28 |
[do it 알고리즘] 백준 11726 (동적 계획법) (1) | 2023.10.24 |
[do it 알고리즘] 백준11050 (조합) (0) | 2023.10.24 |
[do it 알고리즘] 백준1707 (그래프의 표현) (1) | 2023.10.22 |