본문 바로가기
문제 풀이/SWEA

1206번 - View

by Kim Juhwan 2021. 8. 1.

문제의 저작권은 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

댓글