문제의 저작권은 SW Expert Academy에 있습니다. (출처)
1. 문제
1-1. 문제 설명
1-2. 문제 해석
2. 코드
3. 실행시간
1. 문제
1-1. 문제 설명
1-2. 문제 해석
위 문제에서 요구하는 '조망권이 확보된 세대'란 결국 '나'를 기준으로 왼쪽 두 아파트와 오른쪽 두 아파트가 더 낮아야 한다. 그래야 조망권이 확보될 테니까.
그렇게 주변 아파트보다 현재 기준이 되는 아파트가 더 높다면 이제 고려해야 할 것은 몇 개의 세대가 조망권이 확보되었는가이다. 이는 '나'를 제외하고 가장 높은 아파트의 층수로 구할 수 있다.
예를 들어 B를 기준으로 봤을 때 B를 제외하고 B주변에서 가장 높은 아파트는 C임을 알 수 있다.
B의 층수에서 C의 층수를 빼면 간단하게 조망권 세대수를 구할 수 있다.
특별한 알고리즘 기법을 사용하는 문제는 아니었다. 브루트 포스로 분류해야 하나(?)
2. 코드
public class Day1_1206_View {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int T = 10;
for(int i=0; i<T; i++) {
int arrSize = Integer.parseInt(br.readLine());
String[] apt = br.readLine().split(" ");
int goodViewRoom = 0;;
for(int j=2; j<arrSize-2; j++) {
int mine = Integer.valueOf(apt[j]);
int l2 = Integer.valueOf(apt[j-2]);
int l1 = Integer.valueOf(apt[j-1]);
int r1 = Integer.valueOf(apt[j+1]);
int r2 = Integer.valueOf(apt[j+2]);
// 주변 건물중에 내 건물이 가장 높다면
if(mine > l2 && mine > l1 && mine > r1 && mine > r2) {
goodViewRoom = goodViewRoom + mine - getHighestFloor(l2, l1, r1, r2);
}
}
sb.append("#").append(i+1).append(" ").append(goodViewRoom).append("\n");
}
System.out.println(sb.toString());
}
public static int getHighestFloor(int a, int b, int c, int d) {
return Math.max(a, Math.max(b, Math.max(c, d)));
}
}
다소 코드는 길지만 코드를 보기 편하게 만드려고 했다.
크게 어려운 문제는 아니어서 설명을 더 달지 않아도 될 것 같다.
4. 실행시간
야호! 반에서 1등을 했다. 🥳
역대 싸피 순위로 치면 몇 등인지 궁금해서 찾아봤는데
1981명 중에 150등이었다. 역시... 선배님들의 벽은 아주 높군요 😭
순위를 더 올려보고자 코드 한 줄을 추가해보았다.
조망권이 확보된 세대를 발견했다는 것은 앞으로 검사할 2개의 아파트는 절대 조망권을 가질 수 없는 아파트라는 것을 의미한다. 즉, 조망권이 확보되는 세대를 발견했을 때 j+=2를 해서 for문 돌리는 횟수를 조금이나마 줄여보고자 하였다.
이렇게 하면 분명히 for문 돌리는 횟수가 확 줄어들 텐데 오히려 실행시간이 늘어나 버렸다. 대체 왜???????????? 🤔
진짜 이해가 안 간다...
💡 느낀 점
- 실행시간이 더 느려진 건 오차범위로 생각해야 하는 걸까?
- 그렇다고 하기엔 SWEA의 테스트 케이스는 주어지는 게 전부고 매번 같은 걸로 검사하는 듯하다.
- 교수님한테 여쭤보고 싶다... 근데 온라인 특성상 모두 다 보는 화면에서 질문을... 윽... 공개처형...
- 교수님은 배열을 멤버 변수로 선언해서 코드 수를 줄이고 보기 편하게 작성하셨다.
- 실제 현업에서 전역변수를 남용하면 팀장님한테 불려 가겠지만 코테에서는 적절한 전역변수 사용이 코드를 깔끔하게 만든다는 것을 새삼 깨달았다.
'문제 풀이 > SWEA' 카테고리의 다른 글
1210번 - Ladder1 (0) | 2021.08.03 |
---|---|
1220번 - Magnetic (0) | 2021.08.02 |
1208번 - Flatten (0) | 2021.08.02 |
1209번 - Sum (0) | 2021.08.02 |
1204번 - 최빈수 구하기 (0) | 2021.08.01 |
댓글