본문 바로가기
개발공부/코딩테스트

코딩테스트 합격자 되기 - 05 배열

by bzerome240 2024. 1. 13.


2주차 스터디 카페글

 

코딩테스트 합격자 되기 - 05 배열

[집중 포인트] 1. 가장 기본적인 자료구조인 배열에 대해서 알아보고, 파이썬에서 배열 대용으로 많이 사용하는 리스트의 특징도 알아봅니다. 2. 배열의 경우에는 구현 시 내...

cafe.naver.com


리스트는 내부적으로 동적 배열로 구현되어있는 파이썬 자료구조이다.
트리 혹은 그래프 문제를 제외하고 대부분 문제에서 리스트를 활용하는 경우가 많으므로 자주 사용하는 메서드 및 성능을 명확하게 정리하는 것이 중요하다.

책의 문제는 꼭 풀어보는 것을 권장한다고 합니다.
- 04 모의고사, 06 실패율, 07 방문길이



추가문제


1. N개의 데이터가 채워진 리스트를 아래 조건을 기준으로 정렬하는 코드를 구현해주세요

  • 홀수보다 짝수가 앞에 온다
  • 홀수 혹은 짝수 간에는 값이 적을수록 앞에 온다

<나의풀이>

정렬을 먼저하고, for문을 돌면서 각각의 배열에 저장함

a = [4,5,6,7,1,2,3,8,9,10]

sorteda = sorted(a)

even = []
odd = []

for a in sorteda:
    if a % 2 == 0:
        even.append(a)
    else:
        odd.append(a)        
        
print(even+odd)

<스터디풀이>

sorted 함수에 비교 함수를 넣어서 구현

def custom_compare(x):
    return (x % 2, x)  # 첫 번째 요소로 짝수/홀수 여부를 판단하고, 두 번째 요소로 값 비교

def solution(arr):
    return sorted(arr, key=custom_compare)

arr = [5, 3, 2, 8, 1, 4]
sorted_arr = solution(arr)
print(sorted_arr)  # [2, 4, 8, 1, 3, 5] 출력




2. 아래의 요구조건에 맞는 함수를 구현해주세요. nums와 k는 인자로 받고 함수 이름은 solution()으로 해주세요.

프로토타입: solution(nums, k)
길이가 N인 정수 리스트 nums와 정수 k를 가지고 있습니다. 여기서 k는 회전의 횟수를 나타냅니다.
목표는 리스트의 모든 요소를 오른쪽으로 k번 회전시키는 것입니다.  이때 회전은 마지막 요소가 첫번째 위치로 이동하고 나머지 요소들이 오른쪽으로 하나씩 이동하는 것을 의미한다.

예를들어 nums=[1,2,3,4,5] 이고 k=2인 경우 리스트는 다음과 같이 변환됩니다.
첫번째 회전후: [5,1,2,3,4]
두번째 회전후: [4,5,1,2,3]

요구사항
리스트 nums와 정수 k를 입력으로 받는 파이썬 함수를 작성하세요.
함수는 리스트를 k번 회전시킨 결과를 반환해야 합니다.
모듈러 연산을 사용하여 효율적으로 문제를 해결하세요.

def solution(nums, k):
    i = 0
    modular = len(nums)%k
    
    if modular == 0:
        return nums
    
    answer = nums[-k:] + nums[0:-k]
    
    return answer

print(solution([1,2,3,4,5], 2))

 


3. 아래의 요구조건에 맞는 함수를 구현해주세요

MxN 크기의 2차원 배열 그리드를 가지고 있습니다. 이 배열은 0 (지뢰X)과 -1 (지뢰O) 두가지 숫자로 구성되어있습니다.

각 0 위치에 대해 인접한 8개의 셀(수평, 수직, 대각선) 중 지뢰(-1)의 개수를 계산하여 해당 위치에 그 숫자를 기록하는 것입니다.
예를들어 그리드가 [[-1,0,0],[0,0,-1],[0,-1,0]] 처럼 주어질 때 지뢰찾기 보드의 모양은 아래와 같다.

-1  0  0
0  0  -1
0  -1  0


결과값은 [[-1,1,1],[2,2,-1],[1,-1,2]]가 돼야하고 그림으로 나타내면 아래와 같다.

-1  2  1
2  3  -1
1  -1  2



작성중...!

grid = [[-1,0,0],[0,0,-1],[0,-1,0]]

for i in range(len(grid)):
    row = grid[i]
    
    for j in range(len(row)):
        # print(j, row[j])
        
        x = [-1, 0, 1]
        y = [-1, 0, 1]
        check = row[j]
        
        # 지뢰가 없을 때 인접셀 체크
        if check == 0:
            print('check')
            for xx in x:
                for yy in y:
                    print(xx, yy)
                    #print(i-1, j-1)



<스터디 풀이>

def solution(grid):
    m, n = len(grid), len(grid[0])  # 2차원 배열의 행과 열 크기

    # 주어진 셀 주변의 지뢰 개수를 세는 함수
    def count_mines(i, j):
        mines = 0
        for x in range(max(0, i-1), min(i+2, m)):
            for y in range(max(0, j-1), min(j+2, n)):
                if grid[x][y] == -1:
                    mines += 1
        return mines

    # 지뢰가 없는 셀을 순회하면서 인접한 지뢰의 개수를 계산
    for i in range(m):
        for j in range(n):
            if grid[i][j] == 0:
                grid[i][j] = count_mines(i, j)

    return grid


grid = [[-1, 0, 0], [0, 0, -1], [0, -1, 0]]
print(solution(grid))  # [[-1, 2, 1], [2, 3, -1], [1, -1, 2]] 출력
728x90
반응형

댓글