본문 바로가기
🥇Problem Solving (psS2mj)/SWEA

[SWEA] 1206. [S/W 문제해결 기본] 1일차 - View (Java)

by psS2mj 2020. 5. 9.
반응형

문제 링크 / level: D3

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV134DPqAA8CFAYh&categoryId=AV134DPqAA8CFAYh&categoryType=CODE

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

 

내가 생각한 풀이

최근, SWEA의 S/W 문제해결 시리즈에 도전하기 시작했다. 순서대로 풀기 시작했는데 [1204. [S/W 문제해결 기본] 1일차 - 최빈수 구하기] 이 문제는 옛날옛적에 풀어서 이번엔 패스하고, 그 다음 문제인 바로 이 문제(View)부터 풀기 시작했다.

 

풀어본 결과 간단한(?) 완전탐색 문제인 듯하다. 완전탐색이니 브루트 포스니 어쩌구 저쩌구 그런 용어들에 익숙해지지가 않아서 일부러라도 더 쓰면서 익숙해져야지!🤗

 

출처: [SWEA] 1206. [S/W 문제해결 기본] 1일차 - View

문제의 핵심은

1. 이차원배열로 위 그림과 같은 형태의 입력을 받는다. (빈 칸과 빌딩을 0과 1으로 구분)

2. 빌딩이 있는 모든 칸을 탐색하면서 조망권이 확보되는지 확인한다. 그리고 동시에 확보되는 세대수를 카운트해준다.

 

참 쉽죠?😊

 

새로 그린 개발자 만두 캐릭터😊

(열심히 코딩코딩코딩!)


 

일단 이차원배열의 크기는 빌딩의 최대 높이가 255이므로 세로는 255 x 가로는 input으로 주어지는 사이즈 만큼으로 설정했다. 

그리고 그 다음에 input으로 주어지는 값이 뭔지 제대로 이해를 못했었는데 알고보니 각 열에 해당하는 빌딩 높이였다.

 

그렇다면 만약 값이 255으로 주어지면 그 열에 해당하는 빌딩의 높이는 255이라는 뜻이다.

여기서 나는 코드의 효율성과 길이를 줄이는 방안을 고민해봤다.

 

결론적으로, 보통은 빈 칸을 0으로 두고 빌딩을 1으로 하겠지만 나는 이차원배열을 생성했을 때 0으로 초기화된다는 점을 십분 활용하기 위해 이 코드에서는 빌딩이 있는 곳을 0으로 두고 빈 칸을 1으로 하기로 했다.

쉽게 말하자면 이차원배열은 처음에 전부 0으로 초기화 되어있는 상태고 나는 input 값으로 각 열의 빌딩 높이를 입력 받았다.  그럼 일단은 전부 0 이니까 전부 빌딩이라고 생각하고, 각 열의 빌딩 높이에 따라서 위에서부터(인덱스=0) 해당 빌딩의 높이인 곳까지는 빈 칸인거니까 거기를 다 1로 채워주는 방식이다.

for (int i = 0; i < width; i++) {
	height = Integer.parseInt(st.nextToken());
	for (int j = 0; j < 255 - height; j++) {
		map[j][i] = 1;
	}
}

이렇게 하면 Arrays.fill이나 이중for문을 이용해서 전체를 1로 초기화해주는 과정을 스킵할 수 있으니까. 내 머리만 조금 고생하면 된다🤔 그리고 이렇게 하는 가장 큰 이유 중 하나는 for문을 돌릴 때 기본적으로 0부터 올라가는 구조니까 아래서부터 빌딩을 쌓아올리는 식으로 해도 되지만 나는 위에서부터 빈 칸으로 만들어가는 방법을 택했다고 보면 된다.

 


 

아무튼 이렇게 해두고 코드를 작성한 뒤에 조망권을 확인한다는 의미에서 checkView라는 메소드를 만들어서 모든 빌딩에 대해서 완전탐색을 해줬다. 이중for문을 돌리면서 빌딩이 있는 곳은 전부 다 확인해주면 된다.

 

checkView 메소드에 대해 간단히 설명을 해보자면 - 좌로 두 칸, 좌로 한 칸, 우로 한 칸, 우로 두 칸이 전부 다 비어있어야 조망권이 확보된 것!! 나는 카운트 변수를 이용해서 cnt=4가 되었을 때만 조망권이 확보된 것으로 보고 true를 리턴하도록 했다.

 

원래는 좌우로 이동하면서 탐색할 때 배열의 범위를 벗어나는지 아닌지 체크를 해줘야하겠지만 이 문제는 S/W 문제해결 1일차 문제라서 그런지 가장 왼쪽, 오른쪽 각각 2개 열은 비워뒀다. 즉, 범위 체크를 따로 해주지 않아도 된다는 의미다. for문의 범위를 잘 조절해주기만 하면 된다.

 

결과는 성공!!

 

💌 전체 코드 보기: https://github.com/psS2mj/Problem_Solving_SWEA_by_JAVA/blob/master/D3/Solution_D3_1206_View.java

 

psS2mj/Problem_Solving_SWEA_by_JAVA

SW Expert Academy (https://swexpertacademy.com/main/main.do) by JAVA - psS2mj/Problem_Solving_SWEA_by_JAVA

github.com

반응형

댓글