문제 링크 / level: D3
내가 생각한 풀이
최근, SWEA의 S/W 문제해결 시리즈에 도전하기 시작했다. 순서대로 풀기 시작했는데 [1204. [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
'🥇Problem Solving (psS2mj) > SWEA' 카테고리의 다른 글
[SWEA] 1210. [S/W 문제해결 기본] 2일차 - Ladder1 (Java) (0) | 2020.05.10 |
---|---|
[SWEA] 1208. [S/W 문제해결 기본] 1일차 - Flatten (Java) (0) | 2020.05.09 |
[SWEA] 5515. 2016년 요일 맞추기 (Java) (0) | 2020.04.07 |
[SWEA] 4406. 모음이 보이지 않는 사람 (Java) (0) | 2020.04.03 |
[SWEA] 1217. [S/W 문제해결 기본] 4일차 - 거듭 제곱 (Java) (0) | 2020.03.28 |
댓글