728x90
취업과 이직을 위한 프로그래머스 코딩테스트 문제풀이전략이라는 책을 읽고 배열 파트 정리를 했다
개념
배열: 연속적으로 데이터를 집어넣을 수 있는 1차원 형식의 자료 구조
문제 풀이
1. 교점에 별 만들기(level 2)
더보기
def solution(line):
#prevent swallow copy
pos, answer = [], []
n = len(line)
x_min = y_min = int(1e15)
x_max = y_max = -int(1e15)
for i in range(n):
a, b, e = line[i]
for j in range(i + 1, n):
c, d, f = line[j]
if a * d == b * c:
continue
x = (b*f - e*d) / (a*d - b*c)
y = (e*c - a*f) / (a*d - b*c)
if x == int(x) and y == int(y):
x = int(x)
y = int(y)
pos.append([x,y])
if x_min > x: x_min = x
if y_min > y: y_min = y
if x_max < x: x_max = x
if y_max < y: y_max = y
x_len = x_max - x_min + 1
y_len = y_max - y_min + 1
coord = [['.'] * x_len for _ in range(y_len)]
for star_x, star_y in pos:
nx = star_x + abs(x_min) if x_min < 0 else star_x - x_min
ny = star_y + abs(y_min) if y_min < 0 else star_y - y_min
coord[ny][nx] = '*'
for result in coord: answer.append(''.join(result))
return answer[::-1]
2. 행렬 테두리 회전하기(level 2)
더보기
def rotate(x1, y1, x2, y2, matrix):
first = matrix[x1][y1]
min_value = first
# 왼쪽
for k in range(x1, x2):
matrix[k][y1] = matrix[k+1][y1]
min_value = min(min_value, matrix[k+1][y1])
# 아래
for k in range(y1, y2):
matrix[x2][k] = matrix[x2][k+1]
min_value = min(min_value, matrix[x2][k+1])
# 오른쪽
for k in range(x2, x1, -1):
matrix[k][y2] = matrix[k-1][y2]
min_value = min(min_value, matrix[k-1][y2])
# 위
for k in range(y2, y1+1, -1):
matrix[x1][k] = matrix[x1][k-1]
min_value = min(min_value, matrix[x1][k-1])
matrix[x1][y1+1] = first
return min_value
def solution(rows, columns, queries):
matrix = [[(i)*columns+(j+1) for j in range(columns)] for i in range(rows)]
result = []
for x1, y1, x2, y2 in queries:
result.append(rotate(x1-1, y1-1, x2-1, y2-1, matrix))
return result
3. 삼각 달팽이(level 2)
더보기
def solution(n):
res = [[0] * i for i in range(1, n+1)]
y, x = -1, 0
num = 1
for i in range(n):
for _ in range(i, n):
angle = i % 3
# 순서대로 아래 -> 오른쪽 -> 위 (반시계 나선형)
if angle == 0: y += 1
elif angle == 1: x += 1
elif angle == 2: y -= 1; x -= 1
res[y][x] = num
num += 1
return [i for j in res for i in j]
4. 거리두기 확인하기(level 2)
더보기
def check(place):
for idx_row, row in enumerate(place):
for idx_col, cell in enumerate(row):
if cell != 'P':
continue
isNotEndRow = idx_row != 4
isNotEndCol = idx_col != 4
isNotFirstCol = idx_col != 0
isBeforeThirdRow = idx_row < 3
isBeforeThirdCol = idx_col < 3
#D(Down), D2(2 times Down)
#R(Right), R2(2 times Right)
#L(Left)
#RD(Right-Down), LD(Left-Down)
if isNotEndRow:
D = place[idx_row + 1][idx_col]
if D == 'P': return 0
if isBeforeThirdRow:
D2 = place[idx_row + 2][idx_col]
if D2 == 'P' and D != 'X': return 0
if isNotEndCol:
R = place[idx_row][idx_col + 1]
RD = place[idx_row + 1][idx_col + 1]
if RD == 'P' and (D != 'X' or R != 'X'): return 0
if isNotFirstCol:
L = place[idx_row][idx_col - 1]
LD = place[idx_row + 1][idx_col - 1]
if LD == 'P' and (D != 'X' or L != 'X'): return 0
if isNotEndCol:
R = place[idx_row][idx_col + 1]
if R == 'P': return 0
if isBeforeThirdCol:
R2 = place[idx_row][idx_col + 2]
if R2 == 'P' and R != 'X': return 0
return 1
def solution(places):
return [check(place) for place in places]
5. 행렬의 곱셈(level 2)
더보기
def solution(arr1, arr2):
answer = [[0 for _ in range(len(arr2[0]))] for _ in range(len(arr1))]
for i in range(len(arr1)):
for j in range(len(arr2[0])):
for k in range(len(arr1[0])):
answer[i][j] += (arr1[i][k] * arr2[k][j])
return answer
'프로그래밍 > 알고리즘' 카테고리의 다른 글
프로그래머스 - 억억단을 외우자 파이썬 (1) | 2023.05.15 |
---|---|
프로그래머스 - 같은 숫자는 싫어 파이썬 (0) | 2023.05.08 |
앞으로 (반복해서) 풀 알고리즘 유형별 문제(총 50개) (0) | 2023.05.02 |
프로그래머스 - 완주하지 못한 선수 파이썬 (0) | 2023.04.26 |
'if-if-else'가 아니라 'if-elif-else'를 사용해야 하는 이유 (0) | 2023.04.25 |
댓글