https://www.youtube.com/watch?v=wtmIATeaeG4&list=PLnp1rUgG4UVb_5oT4tYaB4Sro-SBPJSWy&index=4 

 

Cos Pro 1급 3회 문제 3 - 구현

체스에서 비숍(Bishop)은 아래 그림과 같이 대각선 방향으로 몇 칸이든 한 번에 이동할 수 있습니다. 만약, 한 번에 이동 가능한 칸에 체스 말이 놓여있다면 그 체스 말을 잡을 수 있습니다.

8 x 8 크기의 체스판 위에 여러 개의 비숍(Bishop)이 놓여있습니다. 이때, 비숍(Bishop)들에게 한 번에 잡히지 않도록 새로운 말을 놓을 수 있는 빈칸의 개수를 구하려고 합니다.

위 그림에서 원이 그려진 칸은 비숍에게 한 번에 잡히는 칸들이며, 따라서 체스 말을 놓을 수 있는 빈칸 개수는 50개입니다.

8 x 8 체스판에 놓인 비숍의 위치 bishops가 매개변수로 주어질 때, 비숍에게 한 번에 잡히지 않도록 새로운 체스 말을 놓을 수 있는 빈칸 개수를 return 하도록 solution 함수를 완성해주세요.

▣ 매개변수 설명

체스판에 놓인 비숍의 위치 bishops가 solution 함수의 매개변수로 주어집니다.

  • bishops는 비숍의 위치가 문자열 형태로 들어있는 리스트입니다.
  • bishops의 길이는 1 이상 64 이하입니다.
  • 비숍이 놓인 위치는 알파벳 대문자와 숫자로 표기합니다.
    • 알파벳 대문자는 가로 방향, 숫자는 세로 방향 좌표를 나타냅니다.
    • 예를 들어 위 그림에서 비숍이 있는 칸은 "D5"라고 표현합니다.
  • 한 칸에 여러 비숍이 놓이거나, 잘못된 위치가 주어지는 경우는 없습니다.

▣ return 값 설명

비숍에게 한 번에 잡히지 않도록 새로운 체스 말을 놓을 수 있는 빈칸의 개수를 return 해주세요.

▣ 예시

| bishops            | return |
|--------------------|--------|
| ["D5"]             | 50     |
| ["D5", "E8", "G2"] | 42     |

▣ 예시 설명 예시 #1 : 문제에 나온 예시와 같습니다. 예시 #2 :

그림과 같이 원이 그려진 칸은 비숍에게 한 번에 잡히는 칸들이며, 따라서 체스 말을 놓을 수 있는 빈칸 개수는 42개입니다.

 

문제풀이

대각선 방향 끝까지 갔다가 다시 제자리로 돌아오자

def solution(bishops):
    #여기에 코드를 작성해주세요.
    maps = [[0]*9 for _ in range(9)]
    dyx = [(1, 1), (-1, 1), (1, -1), (-1, -1)]
    

    for bishop in bishops :
        start_y = ord(bishop[0]) - ord('A') + 1                  #a : 65-1, b : 66-2, c : 67-3, d : 68-4 
        start_x = int(bishop[1])
        maps[start_y][start_x] = 1
        for dy, dx in dyx :
            next_y, next_x = start_y, start_x                   #시작값으로 초기화
            while True :
                next_y += dy
                next_x += dx

                #1보다 작을때 컷, 8보다 클때 컷
                if next_y < 1 or next_y > 8 or next_x < 1 or next_x > 8 :
                    break
                maps[next_y][next_x] = 1
        
        answer = 0
        #0으로 계속 남아 있는 부분 체크
        for y in range(1, 9) :
            for x in range(1, 9) :
                if maps[y][x] == 0 :
                    answer += 1
    return answer

bishops1 = ["D5"]
ret1 = solution(bishops1)

print("solution 함수의 반환 값은", ret1, "입니다.")

bishops2 = ["D5", "E8", "G2"]
ret2 = solution(bishops2)

print("solution 함수의 반환 값은", ret2, "입니다.")
[Cos Pro 1급] 3회 문제 3(비숍 대각선 이동 위치이동)