본문 바로가기
  • think together
카테부 4기 판교 ai 실무/코테 공부

[⭐ 꼭 다시보기⭐] 카테부 4기 판교 ai 실무프로그래머스 코딩 기초 트레이닝 Day25

by hwamgai 2026. 6. 19.

문제: 정수를 나선형으로 배치하기

https://school.programmers.co.kr/learn/courses/30/lessons/181832

 

프로그래머스

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

programmers.co.kr

제미나이 코드:

#제미나이가 작성한 코드
def solution(n):
    # 1. n x n 크기의 배열을 0으로 안전하게 초기화
    answer = [[0] * n for _ in range(n)]
    
    # 2. 시작 위치와 처음 방향(우) 설정
    r, c = 0, 0
    dist_idx = 0 
    
    # 방향 벡터 정의: [오른쪽, 아래, 왼쪽, 위] 순서
    # 행(r)의 변화량 dx, 열(c)의 변화량 dy
    dx = [0, 1, 0, -1]
    dy = [1, 0, -1, 0]
    
    # 3. 1부터 n*n까지 숫자를 하나씩 채워나가는 반복문
    for i in range(1, n*n + 1):
        answer[r][c] = i  # 현재 위치에 숫자 채우기
        
        # 일단 현재 방향 그대로 갔을 때의 '다음 위치'를 미리 계산해봅니다.
        next_r = r + dx[dist_idx]
        next_c = c + dy[dist_idx]
        
        # [방향 전환 조건 검사]
        # 다음 위치가 배열을 벗어나거나(벽을 만나거나), 이미 숫자가 채워진 곳(0이 아닌 곳)이라면?
        if not (0 <= next_r < n and 0 <= next_c < n) or answer[next_r][next_c] != 0:
            # 시계 방향으로 꺾기 (0 -> 1 -> 2 -> 3 -> 0)
            dist_idx = (dist_idx + 1) % 4
            # 꺾은 방향을 기준으로 다음 위치를 다시 계산해줍니다.
            next_r = r + dx[dist_idx]
            next_c = c + dy[dist_idx]
            
        # 확정된 안전한 다음 칸으로 드디어 이동!
        r = next_r
        c = next_c
        
    return answer

좋은 코드:

def solution(n):
    answer = [[None for j in range(n)] for i in range(n)]
    move = [[0, 1], [1, 0], [0, -1], [-1, 0]]
    x, y, m = 0, 0, 0
    for i in range(1, n**2 + 1):
        answer[y][x] = i
        if y + move[m][0] >= n or x + move[m][1] >= n or answer[y + move[m][0]][x + move[m][1]]:
            m = (m + 1) % len(move)
        y, x = y + move[m][0], x + move[m][1]
    return answer
def solution(n):
    return [[ 4*i*(n-i) + (1+x+y - 2*i if (x==i or y==n-i-1) else (4*n - 6*i - x - y -3))  for i,x,y in row]   for row in [[(min(n-x-1,x,n-y-1,y),x,y) for y in range(n)] for x in range(n)]]
def solution(n):
    dy = [0, 1, 0, -1]
    dx = [1, 0, -1, 0]
    y, x = 0, -1

    arr = [[0] * n for _ in range(n)]
    cnt = 1
    direction = 0
    while cnt <= n**2:
        ny, nx = y + dy[direction], x + dx[direction]
        if 0 <= ny < n and 0 <= nx < n and not arr[ny][nx]:
            arr[ny][nx] = cnt
            cnt += 1
            y, x = ny, nx
        else:
            direction = (direction + 1) % 4

    return arr
def solution(n):
    answer = [([0]*n) for _ in range(n)]
    j = 1
    top, bottom, right, left = 0, n-1, n-1, 0


    while j <= n**2:
        # 오른쪽
        for i in range(left, right+1):
            answer[top][i] = j
            j += 1
        top += 1

        # 아래쪽
        for i in range(top, bottom+1):
            answer[i][right] = j
            j += 1
        right -= 1

        # 왼쪽
        for i in range(right,left-1,-1):
            answer[bottom][i] = j
            j += 1
        bottom -= 1

        # 위쪽 
        for i in range(bottom, top-1,-1):
            answer[i][left] = j
            j += 1
        left += 1

    return answer

 

 

 

 

 

 

문제: 특별한 2차원 배열2

https://school.programmers.co.kr/learn/courses/30/lessons/181831

 

프로그래머스

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

programmers.co.kr

내 코드:

한 번이라도 다른게 나오면 return 0을 해버리기

def solution(arr):
    answer = 0
    
    
    for i in range(len(arr)):
        for j in range(len(arr)):
            if arr[i][j] == arr[j][i]:
                answer = 1
            else:
                return 0
    
    
    return answer

좋은 코드:

def solution(arr):
    return int(arr == list(map(list, zip(*arr))))
#나와 같은데 더 나은 코드
def solution(arr):
    answer = 0

    for i in range(len(arr)):
        for j in range(len(arr)):
            if arr[i][j] != arr[j][i]:
                return 0

    return 1
#대칭 대각선 위에만 검사
def solution(arr):

    for i in range(len(arr)):
        for j in range(i+1, len(arr)):
            if arr[i][j] != arr[j][i]:
                return 0

    return 1

 

 

 

 

 

문제: 정사각형으로 만들기

https://school.programmers.co.kr/learn/courses/30/lessons/181830

 

프로그래머스

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

programmers.co.kr

내 코드:

#에러 발생
def solution(arr):
    answer = arr
    
    if len(arr) > len(arr[0]):
        for i in range(len(arr)):
            answer[i] += [0]
    elif len(arr) < len(arr[0]):
        n = len(arr[0]) - len(arr)
        new_arr = []
    	for j in range(len(arr[0])):
            new_arr += [0]
        for i in range(n):
            answer.append(new_arr)
        
    return answer
#에러 발생
def solution(arr):
    answer = arr
    
    if len(arr) > len(arr[0]):
        for i in range(len(arr)):
            answer[i] += [0]
    elif len(arr) < len(arr[0]):
        n = len(arr[0]) - len(arr)
        new_arr = [0] * len(arr[0])
    
        for i in range(n):
            answer.append(new_arr)
        
    return answer
    
  # 에러 이유: 파이썬에서 new_arr라는 리스트를 여러 번 append하면, 
  # 값이 복사되어 들어가는 게 아니라 동일한 리스트의 주소(참조)가 여러 개 추가됩니다.
  # 즉, 나중에 answer[2][0] = 5처럼 한 곳만 수정해도 새로 추가된 모든 행의 0번째 요소가
  # 동시에 5로 바뀌는 치명적인 버그가 생깁니다.
#에러 발생
def solution(arr):
    answer = arr
    
    if len(arr) > len(arr[0]):
        for i in range(len(arr)):
            answer[i] += ([0] * (len(arr)-len(arr[0])))
            
    elif len(arr) < len(arr[0]):
        n = len(arr[0]) - len(arr)
        
        for i in range(n):
            answer.append([0] * len(arr[0]))
        
    return answer
    
# 파이썬에서 len(arr[0])은 첫 번째 행의 길이를 의미합니다.
# 그런데 방금 첫 번째 행에 0을 붙여서 길이가 늘어났죠?
# 그 결과, 두 번째 행 작업을 할 때 len(arr) - len(arr[0])을 계산하면
# 아까와 다른 (더 작아진) 값이 나옵니다. 루프가 돌 때마다 len(arr[0])이 계속 커지니까
# 뒤로 갈수록 0이 모자라게 붙거나 안 붙게 되는 것이죠.

# 파이썬에서 answer = arr이라고 작성하면, 새로운 배열이 복사되어 만들어지는 것이 아닙니다.
# 하나의 배열을 가리키는 이름(변수)이 arr과 answer 두 개가 되는 것뿐입니다. 
# (이를 '참조'라고 합니다.)
# answer와 arr은 완전히 같은 메모리 주소를 공유하고 있습니다.
# 따라서 answer[0]의 값을 바꾸면, arr[0]의 값도 동시에 바뀝니다. 
# 둘이 같은 대상을 가리키고 있으니까요!
# 🤖 제미나이 도움 받아서 겨우 고친 정답
# 결국 두 조건문 다 틀렸던거였다
def solution(arr):
    answer = arr
    length = len(arr)-len(arr[0])
    
    if len(arr) > len(arr[0]):
        for i in range(len(arr)):
            answer[i] += ([0] * (length))
            
    elif len(arr) < len(arr[0]):
        n = len(arr[0]) - len(arr)
        
        for i in range(n):
            answer.append([0] * len(arr[0]))
        
    return answer

좋은 코드:

def solution(arr):
    n=len(arr)
    m=len(arr[0])
    if n>m:
        for i in range(n):
            for j in range(n-m):
                arr[i].append(0)
    else:
        for i in range(m-n):
            arr.append([0]*m)

    return arr
def solution(arr):
    answer = []
    x = len(arr)
    y = len(arr[0])
    m = max(x, y)

    answer=[[0]*m for i in range(m)]

    for i in range(x):
        for j in range(y):
            answer[i][j] = arr[i][j]

    return answer
def solution(arr):
    num_rows = len(arr)
    num_cols = len(arr[0])

    if num_rows > num_cols:
        for i in range(num_rows):
            arr[i] += [0] * (num_rows - num_cols)
    elif num_cols > num_rows:
        for i in range(num_cols - num_rows):
            arr.append([0] * num_cols)

    return arr
def solution(arr):
    for idx,i in enumerate(arr):
        for j in range(len(arr)-len(i)):
            arr[idx].append(0)
        for j in range(len(i)-len(arr)):
            arr.append([0]*(len(i)-len(arr)))
    return arr

 

 

 

 

 

 

 

 

 

문제 : 이차원 배열 대각선으로 회하기

https://school.programmers.co.kr/learn/courses/30/lessons/181829?language=python3

 

프로그래머스

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

programmers.co.kr

내코드:

def solution(board, k):
    answer = 0
    for i in range(len(board)):
        for j in range(len(board[0])):
            if i + j <= k :
                answer += board[i][j]
    return answer

좋은 코드:

def solution(board, k):
    answer = 0
    n, m = len(board), len(board[0])

    for i in range(n):
        for j in range(m):
            if i + j <= k:
                answer += board[i][j]
            else:
                break
    return answer
def solution(board, k):
    answer=0
    n,m=len(board),len(board[0])
    for i in range(k+1):
        if i>=n: continue
        for j in range(k+1-i):
            if j>=m: continue
            answer+=board[i][j]
    return answer