프로그래머스 기초문제

[프로그래머스 기초문제] 이차원 리스트(배열)

Devleoper_yh 2025. 3. 27. 23:10
반응형

1. 정수를 나선형으로 배치하기

양의 정수 n이 매개변수로 주어집니다. n × n 배열에 1부터 n2 까지 정수를 인덱스 [0][0]부터 시계방향 나선형으로 배치한 이차원 배열을 return 하는 solution 함수를 작성해 주세요.


제한사항

  • 1 ≤ n ≤ 30

입출력 예

n result
4 [[1, 2, 3, 4], [12, 13, 14, 5], [11, 16, 15, 6], [10, 9, 8, 7]]
5 [[1, 2, 3, 4, 5], [16, 17, 18, 19, 6], [15, 24, 25, 20, 7], [14, 23, 22, 21, 8], [13, 12, 11, 10, 9]]

입출력 예 설명

입출력 예 #1

  • 예제 1번의 n의 값은 4로 4 × 4 배열에 다음과 같이 1부터 16까지 숫자를 채울 수 있습니다.

행 \ 열0123

행/열 0 1 2 3
0 1 2 3 4
1 12 13 14 5
2 11 16 15 6
3 10 9 8 7
따라서 [[1, 2, 3, 4], [12, 13, 14, 5], [11, 16, 15, 6], [10, 9, 8, 7]]를 return 합니다.

입출력 예 #2

  • 예제 2번의 n의 값은 5로 5 × 5 배열에 다음과 같이 1부터 25까지 숫자를 채울 수 있습니다.

제출 답안

import Foundation

func solution(_ n: Int) -> [[Int]] {
    // n × n 크기의 이차원 배열 초기화
    var result = Array(repeating: Array(repeating: 0, count: n), count: n)
    
    // 방향을 정의: 오른쪽(0), 아래(1), 왼쪽(2), 위(3)
    let directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]
    var directionIndex = 0 // 현재 방향 인덱스
    
    // 현재 위치를 초기화
    var row = 0
    var col = 0
    
    for num in 1...(n * n) {
        result[row][col] = num // 현재 위치에 숫자 배치
        
        // 다음 위치 계산
        let nextRow = row + directions[directionIndex].0
        let nextCol = col + directions[directionIndex].1
        
        // 다음 위치가 배열 범위를 벗어나거나 이미 값이 채워져 있으면 방향 전환
        if nextRow < 0 || nextRow >= n || nextCol < 0 || nextCol >= n || result[nextRow][nextCol] != 0 {
            directionIndex = (directionIndex + 1) % 4 // 시계방향으로 방향 전환
   
        }
        // 새로운 방향에 따라 위치 업데이트
        row += directions[directionIndex].0
        col += directions[directionIndex].1
    }
    
    return result
}

2. 특별한 이차원 배열 2

n × n 크기의 이차원 배열 arr이 매개변수로 주어질 때, arr이 다음을 만족하면 1을 아니라면 0을 return 하는 solution 함수를 작성해 주세요.

  • 0 ≤ i, j < n인 정수 i, j에 대하여 arr[i][j] = arr[j][i]

제한사항

  • 1 ≤ arr의 길이 = arr의 원소의 길이 ≤ 100
  • 1 ≤ arr의 원소의 원소 ≤ 1,000
  • 모든 arr의 원소의 길이는 같습니다.

입출력 예

arr result
[[5, 192, 33], [192, 72, 95], [33, 95, 999]] 1
[[19, 498, 258, 587], [63, 93, 7, 754], [258, 7, 1000, 723], [587, 754, 723, 81]] 0

import Foundation

func solution(_ arr: [[Int]]) -> Int {
    let n = arr.count // 배열의 크기 (n x n)
    
    // 대칭 확인을 위한 이중 반복문
    for i in 0..<n {
        for j in 0..<n {
            // arr[i][j]와 arr[j][i]가 다르면 대칭 아님
            if arr[i][j] != arr[j][i] {
                return 0 // 대칭이 아니므로 0 반환
            }
        }
    }
    
    return 1 // 모든 값이 대칭이면 1 반환
}

3. 정사각형으로 만들기

이차원 정수 배열 arr이 매개변수로 주어집니다. arr의 행의 수가 더 많다면 열의 수가 행의 수와 같아지도록 각 행의 끝에 0을 추가하고, 열의 수가 더 많다면 행의 수가 열의 수와 같아지도록 각 열의 끝에 0을 추가한 이차원 배열을 return 하는 solution 함수를 작성해 주세요.


제한사항

  • 1 ≤ arr의 길이 ≤ 100
  • 1 ≤ arr의 원소의 길이 ≤ 100
    • arr의 모든 원소의 길이는 같습니다.
  • 1 ≤ arr의 원소의 원소 ≤ 1,000

입출력 예

arr result
[[572, 22, 37], [287, 726, 384], [85, 137, 292], [487, 13, 876]] [[572, 22, 37, 0], [287, 726, 384, 0], [85, 137, 292, 0], [487, 13, 876, 0]]
[[57, 192, 534, 2], [9, 345, 192, 999]] [[57, 192, 534, 2], [9, 345, 192, 999], [0, 0, 0, 0], [0, 0, 0, 0]]
[[1, 2], [3, 4]] [[1, 2], [3, 4]]

입출력 예 설명

입출력 예 #1

  • 예제 1번의 arr은 행의 수가 4, 열의 수가 3입니다. 행의 수가 더 많으므로 열의 수를 4로 만들기 위해 arr의 각 행의 끝에 0을 추가한 이차원 배열 [[572, 22, 37, 0], [287, 726, 384, 0], [85, 137, 292, 0], [487, 13, 876, 0]]를 return 합니다.

입출력 예 #2

  • 예제 2번의 arr은 행의 수가 2, 열의 수가 4입니다. 열의 수가 더 많으므로 행의 수를 4로 만들기 위해 arr의 각 열의 끝에 0을 추가한 이차원 배열 [[57, 192, 534, 2], [9, 345, 192, 999], [0, 0, 0, 0], [0, 0, 0, 0]]을 return 합니다.

입출력 예 #3

  • 예제 3번의 arr은 행의 수와 열의 수가 2로 같습니다. 따라서 0을 추가하지 않고 [[1, 2], [3, 4]]을 return 합니다.

제출 답안

import Foundation

func solution(_ arr: [[Int]]) -> [[Int]] {
    let rowCount = arr.count        // 행(row)의 개수
    let colCount = arr[0].count     // 열(column)의 개수
    let size = max(rowCount, colCount) // 정사각형 크기 결정
    
    var result = arr
    
    // 열(column) 수가 부족하면 0을 추가
    for i in 0..<rowCount {
        result[i] += Array(repeating: 0, count: size - colCount)
    }
    
    // 행(row) 수가 부족하면 새로운 행 추가
    while result.count < size {
        result.append(Array(repeating: 0, count: size))
    }
    
    return result
}

4. 이차원 배열 대각선 순회하기

2차원 정수 배열 board와 정수 k가 주어집니다.

i + j <= k를 만족하는 모든 (i, j)에 대한 board[i][j]의 합을 return 하는 solution 함수를 완성해 주세요.


제한사항

  • 1 ≤ board의 길이 ≤ 100
  • 1 ≤ board[i]의 길이 ≤ 100
    • 1 ≤ board[i][j] ≤ 10,000
    • 모든 board[i]의 길이는 같습니다.
  • 0 ≤ k < board의 길이 + board[i]의 길이

입출력 예

board k result
[[0, 1, 2], [1, 2, 3], [2, 3, 4], [3, 4, 5]] 2 8

입출력 예 설명

입출력 예 #1

  • 입출력 예 #1의 board를 표로 나타내면 다음과 같습니다.
  0 1 2
0 0 1 2
1 1 2 3
2 2 3 4
3 3 4 5
  • i + j가 2보다 작거나 같은 항들의 합은 0 + 1 + 2 + 1 + 2 + 2 = 8이므로 8을 return 합니다.

제출 답안

import Foundation

func solution(_ board: [[Int]], _ k: Int) -> Int {
    let rowCount = board.count       // 행 개수
    let colCount = board[0].count    // 열 개수
    var sum = 0                      // 합을 저장할 변수
    
    // 모든 (i, j) 위치를 탐색
    for i in 0..<rowCount {
        for j in 0..<colCount {
            if i + j <= k {          // 조건을 만족하면 합산
                sum += board[i][j]
            }
        }
    }
    
    return sum
}

Day 25까지 완료

반응형