3 분 소요

안전지대

문제 설명

다음 그림과 같이 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류합니다.

image-20250108231750733

지뢰는 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

문제를 풀이할때 우선 경우의 수를 두개로 나눴습니다.

  1. sides안에 가장 긴 길이가 있는경우
  2. 나머지 한 변이 가장 긴 길이인 경우

이렇게 두가지로 나누고 가장긴 길이와 나머지 변이 같은 경우도 있으니 고려하여 식을 세웠습니다.

다른 사람의 풀이

def solution(sides):
    return sum(sides) - max(sides) + min(sides) - 1

-----------

def solution(sides):
    return 2 * min(sides) - 1

좀더 수학적인 접근을 하신 것 같습니다.

업데이트:

댓글남기기