COS PRO 2급 Python 4차
4 x 4
크기 격자 모양 지형에 위험 지역이 몇 개인지 알고 싶습니다. 위험지역이란 동
, 서
, 남
, 북
인접한 지역이 모두 해당 지역보다 높은 지역입니다.
예를 들어 지역 높이가 아래와 같다면
빨간 영역은 인접한 지역이 모두 해당 지역보다 높은 위험지역입니다.
지역별 높이가 담긴 2차원 배열 height
, height
의 길이 height_len
이 solution
함수의 매개변수로 주어질 때, 위험 지역이 몇 개인지 return
하도록 solution
함수를 완성해주세요.
지역별 높이가 담긴 2차원 배열 height
, height
의 길이 height_len
이 solution
함수의 매개변수로 주어집니다.
각 지역의 높이는 1
이상 50
이하인 자연수입니다.
height_len
은 항상 4입니다.
return
값 설명위험지역이 몇 개인지 return
해주세요.
height = [[3, 6, 2, 8], [7, 3, 4, 2], [8, 6, 7, 3], [5, 3, 2, 9]]
height_len = 4
→ solution(height) = 5
Logic
구조2
차원 배열이므로, i
번째 리스트의 j
번째 값의 위치를 좌표를 통해 표현함.height = [[3, 6, 2, 8], [7, 3, 4, 2], [8, 6, 7, 3], [5, 3, 2, 9]]
# height[0][3]=8 이므로 (0,3)의 좌표값은 8을 의미한다고 해석하면 됨.
2
가지 함수를 생성1
번째 함수4방향(상/하/좌/우)의 값들 중 최소 한 개보다 크다
면 더이상 확인할 필요가 없으니 다음 숫자로 넘어가고, 그렇지 않다면(4방향의 값들보다 모두 작다
면) 우리가 찾는 값임.if문
을 통해 4번의 가지치기
로 진행하여 판단하고, 모두 통과
하는 경우가 바로 우리가 찾는 위험지역
이므로 1
을 반환
- 나보다 왼쪽에 위치한 값이 있는데, 내 값보다 작다면?
pass
- 나보다 오른쪽에 위치한 값이 있는데, 내 값보다 작다면?
pass
- 나보다 위쪽에 위치한 값이 있는데, 내 값보다 작다면?
pass
- 나보다 아래쪽에 위치한 값이 있는데, 내 값보다 작다면?
pass
2
번째 함수 : 위의 과정을 순서대로 모든 값들에 대해 진행total
로 지정하여 초기 값을 0
으로 설정2
차원 배열이므로, 반복문을 중첩으로 사용1
번째 함수의 결과를 total
에 누적시켜 최종 위험지역의 갯수를 반환Code
def check(i,j):
# 나보다 왼쪽에 값이 있고, 내 값이 내 왼쪽 값보다 크다면
if i > 0 and height[i][j] > height[i-1][j]:
# 아무것도 안하고 그냥 넘어감
pass
# 나보다 오른쪽에 값이 있고, 내 값이 내 오른쪽 값보다 크다면
elif i < 3 and height[i][j] > height[i+1][j]:
# 아무것도 안하고 그냥 넘어감
pass
# 나보다 위쪽에 값이 있고, 내 값이 내 위쪽 값보다 크다면
elif j > 0 and height[i][j] > height[i][j-1]:
# 아무것도 안하고 그냥 넘어감
pass
# 나보다 아래쪽에 값이 있고, 내 값이 내 아래쪽 값보다 크다면
elif j < 3 and height[i][j] > height[i][j+1]:
# 아무것도 안하고 그냥 넘어감
pass
# 결과적으로, 내가 내 주변(상/하/좌/우)에 있는 값들보다 모두 작다면
else:
# 1을 반환
return 1
# 내 주변(상/하/좌/우)에 있는 값들 중 최소 하나보다 크다면 1을 반환
return 0
def solution(height):
count = 0
# 16개의 모든 값을 순회하면서
for i in range(4):
for j in range(4):
# check 함수를 통해 확인한 값을 추가
count += check(i,j)
return count
if문
의 열거로 구현해야 했던 위의 코드를 개선dx
, dy
리스트를 도입하여 for문
을 통해 간결하게 변경for
문을 그냥 지나치게 코드를 작성Logic
구조※ 2가지 함수를 생성
target
이라는 변수를 도입하여, 초기 값을 0
으로 지정.1
씩 증가시킴.반복문의 시행 횟수
를 의미함.continue
를 사용하기 때문에, 현재 내 위치가 격자 모양 지형의 테두리
에 있는 경우에는 target
값이 2
혹은 3
이 될 것임.cnt
라는 변수를 도입하여, 초기 값을 0
으로 지정cnt
값을 1씩 증가시킴.
- 현재 내 위치를 좌표
(x, y)
로 설정- 비교할 위치를 좌표
(nx, ny)
로 설정
(nx와 ny
는new x, new y
를 의미)
→for
문을 돌면서dx
,dy
를 이용하여nx
와ny
를x
와y
와의 관계로 수식을 표현- 그런데, 비교 위치의 좌표
(nx, ny)
가 현재 격자 모양 지형의 밖으로 벗어나는 경우는continue
를 통해 다음 반복문을 시행하도록 만듦for
문을 모두 돌고 난 후target
값과cnt
값을 비교target == cnt
인 경우만 체크 → 이 경우가 바로 위험지역을 의미하므로, 카운트를1
증가시킴.
total
로 지정하여 초기 값을 0
으로 설정2
차원 배열이므로, 반복문을 중첩으로 사용1
번째 함수의 결과를 total
에 누적시켜 최종 위험지역의 갯수를 반환Code
def check(x,y):
# target : continue 때문에 건너뛰는 횟수를 제외한, 실제로 for문을 반복하는 횟수
target = 0
# cnt : 현재 내 위치(x,y)의 값이 상/하/좌/우의 비교 위치(nx, ny)의 값보다 작은 횟수
cnt = 0
# 상/하/좌/우 최대 4번을 반복하겠다
for _ in range(4):
# 비교 대상 nx, ny를 x, y와 dx, dy를 이용하여 표현
# for문을 4번 돌 때 새로운 점의 좌표는 현재 위치 좌표를 기준으로 각각 우/좌/상/하의 좌표를 의미함.
nx, ny = x + dx[_], y + dy[_]
# 만약, 비교 위치의 좌표가 격자 모양 지형의 밖으로 벗어난다면?
if nx < 0 or nx >=4 or ny < 0 or ny >= 4:
# 현재 작업은 그만하고 다음 반복문을 시행해라
continue
# 비교 대상의 좌표가 격자 모양 지형 내에 위치한다면
else:
# 이번 시행은 진행 한것이기 때문에 시행 횟수를 1 증가시킴.
target += 1
# 만약, 현재 위치의 좌표값이 비교 위치의 좌표값보다 작다면
if height[x][y] < height[nx][ny]:
# 내가 주변 값보다 작은 횟수를 1 증가시킴.
cnt +=1
# 작업을 시행한 횟수가 주변 값보다 작은 횟수와 동일하다면 모든 시행 횟수에 대해 주변 값보다 작은 것이이므로
# 위험지역에 해당하기 때문에 1을 반환하고, 그렇지 않은 경우는 0을 반환
return 1 if target == cnt else 0
# dx는 오른쪽(1)/왼쪽(-1)으로의 이동을, dy는 위쪽(1)/아래쪽(-1)으로의 이동을 지정하기 위해 사용하는 리스트
dx = [1,-1,0,0]
dy = [0,0,1,-1]
def solution(height):
# total : 위험지역을 카운트 하기 위해 할당한 변수
total = 0
# i번째 행, j번째 열에 위치한 모든 값들에 대해
for i in range(4):
for j in range(4):
# 위험지역 여부를 체크하여 반환 값을 위험지역에 더함.
# 반환값은 0 혹은 1뿐이므로, total 값 자체가 위험지역의 개수를 의미
total += check(i,j)
return total