[코딩테스트 입문] 안전지대…
안전지대
문제 설명
다음 그림과 같이 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류합니다.
지뢰는 2차원 배열 board
에 1로 표시되어 있고 board
에는 지뢰가 매설 된 지역 1과, 지뢰가 없는 지역 0만 존재합니다.
지뢰가 매설된 지역의 지도 board
가 매개변수로 주어질 때, 안전한 지역의 칸 수를 return하도록 solution 함수를 완성해주세요.
제한사항
board
는 n * n 배열입니다.- 1 ≤ n ≤ 100
- 지뢰는 1로 표시되어 있습니다.
board
에는 지뢰가 있는 지역 1과 지뢰가 없는 지역 0만 존재합니다.
입출력 예
board | result |
---|---|
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 1, 0, 0], [0, 0, 0, 0, 0]] | 16 |
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 1, 1, 0], [0, 0, 0, 0, 0]] | 13 |
[[1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1]] | 0 |
입출력 예 설명
입출력 예 #1
- (3, 2)에 지뢰가 있으므로 지뢰가 있는 지역과 지뢰와 인접한 위, 아래, 좌, 우, 대각선 총 8칸은 위험지역입니다. 따라서 16을 return합니다.
입출력 예 #2
- (3, 2), (3, 3)에 지뢰가 있으므로 지뢰가 있는 지역과 지뢰와 인접한 위, 아래, 좌, 우, 대각선은 위험지역입니다. 따라서 위험지역을 제외한 칸 수 13을 return합니다.
입출력 예 #3
- 모든 지역에 지뢰가 있으므로 안전지역은 없습니다. 따라서 0을 return합니다.
나의 풀이
def solution(dots):
x=dots[0][0]
y=dots[0][1]
for i in dots[1:]:
if i[0] != x:
x1 = x - i[0]
if i[1] != y:
y1 = y - i[1]
return abs(x1) * abs(y1)
abs()
라는 절대 값을 구하는 내장함수로 변환하여 계산했습니다.
다른 사람의 풀이
def solution(dots):
return (max(dots)[0] - min(dots)[0])*(max(dots)[1] - min(dots)[1])
삼각형의 완성조건(2)
문제 설명
선분 세 개로 삼각형을 만들기 위해서는 다음과 같은 조건을 만족해야 합니다.
- 가장 긴 변의 길이는 다른 두 변의 길이의 합보다 작아야 합니다.
삼각형의 두 변의 길이가 담긴 배열 sides
이 매개변수로 주어집니다. 나머지 한 변이 될 수 있는 정수의 개수를 return하도록 solution 함수를 완성해주세요.
제한사항
sides
의 원소는 자연수입니다.sides
의 길이는 2입니다.- 1 ≤
sides
의 원소 ≤ 1,000
입출력 예
sides | result |
---|---|
[1, 2] | 1 |
[3, 6] | 5 |
[11, 7] | 13 |
입출력 예 설명
입출력 예 #1
- 두 변이 1, 2 인 경우 삼각형을 완성시키려면 나머지 한 변이 2여야 합니다. 따라서 1을 return합니다.
입출력 예 #2
- 가장 긴 변이 6인 경우
- 될 수 있는 나머지 한 변은 4, 5, 6 로 3개입니다.
- 나머지 한 변이 가장 긴 변인 경우
- 될 수 있는 한 변은 7, 8 로 2개입니다.
- 따라서 3 + 2 = 5를 return합니다.
입출력 예 #3
- 가장 긴 변이 11인 경우
- 될 수 있는 나머지 한 변은 5, 6, 7, 8, 9, 10, 11 로 7개입니다.
- 나머지 한 변이 가장 긴 변인 경우
- 될 수 있는 한 변은 12, 13, 14, 15, 16, 17 로 6개입니다.
- 따라서 7 + 6 = 13을 return합니다.
나의 풀이
def solution(sides):
answer = []
maxN = max(sides)
minN = min(sides)
# sides안에 담긴 수가 제일 긴 경우
i = 1
while 0 <i < maxN+minN:
if maxN >= i >maxN - minN:
if i not in answer:
answer.append(i)
elif maxN+minN > i >= maxN:
if i not in answer:
answer.append(i)
i+= 1
return len(answer)
print(solution([1,2]))
------------------------------------------
def solution(sides):
answer = 0
maxN = max(sides)
minN = min(sides)
# sides안에 담긴 수가 제일 긴 경우
i = 1
while 0 <i < maxN+minN:
if maxN >= i >maxN - minN:
answer += 1
elif maxN+minN > i >= maxN:
answer += 1
i+= 1
return answer
문제를 풀이할때 우선 경우의 수를 두개로 나눴습니다.
sides
안에 가장 긴 길이가 있는경우- 나머지 한 변이 가장 긴 길이인 경우
이렇게 두가지로 나누고 가장긴 길이와 나머지 변이 같은 경우도 있으니 고려하여 식을 세웠습니다.
다른 사람의 풀이
def solution(sides):
return sum(sides) - max(sides) + min(sides) - 1
-----------
def solution(sides):
return 2 * min(sides) - 1
좀더 수학적인 접근을 하신 것 같습니다.
댓글남기기