문제: 정수를 나선형으로 배치하기
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
'카테부 4기 판교 ai 실무 > 코테 공부' 카테고리의 다른 글
| [⭐ 꼭 다시보기⭐] 프로그래머스 코딩테스트 "입문 문제" Day2 (0) | 2026.06.22 |
|---|---|
| 프로그래머스 코딩테스트 "입문 문제" Day1 (0) | 2026.06.20 |
| 카테부 4기 판교 ai 실무프로그래머스 코딩 기초 트레이닝 Day24 (0) | 2026.06.18 |
| 카테부 4기 판교 ai 실무프로그래머스 코딩 기초 트레이닝 Day23 (0) | 2026.06.17 |
| 카테부 4기 판교 ai 실무프로그래머스 코딩 기초 트레이닝 Day22 (0) | 2026.06.15 |