[PCCE 기출문제] 9번 / 이웃한 칸 - Python

2024. 11. 22. 21:18공부/📝 프로그래머스

1. 풀이 코드

def solution(board, h, w):
    answer = 0

    up_cell = board[h - 1][w] if h - 1 >= 0 else 'x'
    down_cell = board[h + 1][w] if len(board) > h + 1 else 'x'
    left_cell = board[h][w - 1] if w - 1 >= 0 else 'x'
    right_cell = board[h][w + 1] if len(board) > w + 1 else 'x'

    for item in [up_cell, down_cell, left_cell, right_cell]:
        if item == board[h][w]:
            answer += 1

    return answer

제 접근법이 좋지 않았네요.

2. ChatGPT 풀이

이 문제는 2차원 리스트에서 특정 칸의 위, 아래, 왼쪽, 오른쪽의 색이 같은 칸의 개수를 찾는 문제입니다. 이를 통해 주어진 위치와 인접한 칸의 색상을 비교하여 얼마나 많은 칸이 같은 색으로 칠해져 있는지 확인하는 과정을 코딩할 수 있습니다. 기본적인 접근 방식과 파이썬 코드 작성 방법을 단계별로 설명하겠습니다.

문제 해결을 위한 접근 방식

  1. 입력받은 데이터 분석
    • board는 2차원 리스트로, 각 칸에 색깔 이름이 문자열로 저장되어 있습니다.
    • h와 w는 체크하려고 하는 위치를 나타내는 두 정수입니다.
  2. 주변의 네 방향 탐색
    • 각 칸의 위, 아래, 왼쪽, 오른쪽을 탐색해야 합니다.
    • 이 문제는 상하좌우 네 방향을 탐색하여 같은 색상인 칸의 수를 계산합니다.

Step-by-Step으로 코딩하기

  1. 코드 기본 구조 생성
    파이썬 함수의 기본 틀을 먼저 만듭니다.
def solution(board, h, w):
    # 결과를 저장할 변수를 초기화합니다.
    count = 0

    return count
  1. 변수와 이동 방향 정의하기
    네 방향을 탐색하기 위해 이동할 방향을 정의합니다. 각 방향의 변화량을 나타내는 dh와 dw 리스트를 만들고, 각각 [0, 1, -1, 0]과 [1, 0, 0, -1]을 저장합니다.
def solution(board, h, w):
    # 결과를 저장할 변수를 초기화합니다.
    count = 0

    # 보드의 크기 n을 저장합니다.
    n = len(board)

    # 상하좌우로 이동할 수 있는 변화량을 정의합니다.
    dh = [0, 1, -1, 0]  # 세로 방향 변화량
    dw = [1, 0, 0, -1]  # 가로 방향 변화량

    return count
  1. 탐색을 위한 반복문 작성
    상하좌우로 탐색하기 위해 반복문을 사용하여 네 방향을 모두 탐색합니다.
def solution(board, h, w):
    # 결과를 저장할 변수를 초기화합니다.
    count = 0

    # 보드의 크기 n을 저장합니다.
    n = len(board)

    # 상하좌우로 이동할 수 있는 변화량을 정의합니다.
    dh = [0, 1, -1, 0]  # 세로 방향 변화량
    dw = [1, 0, 0, -1]  # 가로 방향 변화량

    # 현재 칸의 색깔
    current_color = board[h][w]

    # 네 방향을 탐색하기 위해 반복합니다.
    for i in range(4):
        # 체크할 칸의 좌표를 계산합니다.
        h_check = h + dh[i]
        w_check = w + dw[i]

        # 체크할 칸이 보드 범위 내에 있는지 확인합니다.
        if 0 <= h_check < n and 0 <= w_check < n:
            # 같은 색으로 칠해져 있는지 확인합니다.
            if board[h_check][w_check] == current_color:
                count += 1

    return count
  1. 코드 설명
    • count: 현재 칸과 같은 색으로 칠해진 인접 칸의 수를 저장합니다.
    • n: 보드의 크기(행 또는 열의 길이)를 저장합니다.
    • dh, dw: 네 방향(상, 하, 좌, 우)으로 이동할 때 사용할 변화량입니다.
      • dh: 세로 방향 이동 (상: -1, 하: +1)
      • dw: 가로 방향 이동 (좌: -1, 우: +1)
    • 반복문을 사용하여 네 방향으로 이동한 좌표 h_check, w_check를 계산한 뒤, 해당 좌표가 보드의 범위 내에 있는지 확인합니다.
    • 인접한 칸의 색이 현재 칸의 색과 동일하면 count를 증가시킵니다.

전체 코드

이제 모든 과정을 하나로 합친 전체 코드를 다시 보여드리겠습니다.

def solution(board, h, w):
    # 결과를 저장할 변수를 초기화합니다.
    count = 0

    # 보드의 크기 n을 저장합니다.
    n = len(board)

    # 상하좌우로 이동할 수 있는 변화량을 정의합니다.
    dh = [0, 1, -1, 0]  # 세로 방향 변화량
    dw = [1, 0, 0, -1]  # 가로 방향 변화량

    # 현재 칸의 색깔
    current_color = board[h][w]

    # 네 방향을 탐색하기 위해 반복합니다.
    for i in range(4):
        # 체크할 칸의 좌표를 계산합니다.
        h_check = h + dh[i]
        w_check = w + dw[i]

        # 체크할 칸이 보드 범위 내에 있는지 확인합니다.
        if 0 <= h_check < n and 0 <= w_check < n:
            # 같은 색으로 칠해져 있는지 확인합니다.
            if board[h_check][w_check] == current_color:
                count += 1

    return count

Step 5: 예제 입력을 통해 코드가 잘 작동하는지 확인해보겠습니다.

board_1 = [["blue", "red", "orange", "red"], 
           ["red", "red", "blue", "orange"], 
           ["blue", "orange", "red", "red"], 
           ["orange", "orange", "red", "blue"]]
h_1, w_1 = 1, 1
print(solution(board_1, h_1, w_1))  # 출력: 2

board_2 = [["yellow", "green", "blue"], 
           ["blue", "green", "yellow"], 
           ["yellow", "blue", "blue"]]
h_2, w_2 = 0, 1
print(solution(board_2, h_2, w_2))  # 출력: 1

정리

  • 이 문제는 상하좌우의 칸을 탐색하는 방법을 묻고 있으며, 이를 위해 두 개의 리스트 dh와 dw를 사용하여 쉽게 접근할 수 있습니다.
  • 각 방향에 대해 반복문을 통해 탐색하고, 범위를 벗어나지 않는지 확인한 후, 색이 같은 경우 카운트를 증가시킵니다.
  • 최종적으로 count 값을 반환하여 문제에서 요구하는 값을 구합니다.

이렇게 하면 각 칸에 대한 인접 칸의 색상 비교를 효율적으로 처리할 수 있습니다.


 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

'공부 > 📝 프로그래머스' 카테고리의 다른 글

체육복 - Python  (0) 2024.11.22
옹알이 (2) - Python  (0) 2024.08.04
둘만의 암호 - Python  (0) 2024.01.31
완주하지 못한 선수 - Python  (0) 2024.01.29
대충 만든 자판 - Python  (0) 2024.01.28