본문 바로가기
프로그래밍/알고리즘

취업과 이직을 위한 프로그래머스 코딩테스트 문제풀이전략 - 배열

by 숙님 2023. 5. 3.
728x90

취업과 이직을 위한 프로그래머스 코딩테스트 문제풀이전략이라는 책을 읽고 배열 파트 정리를 했다 

 

개념 

배열: 연속적으로 데이터를 집어넣을 수 있는 1차원 형식의 자료 구조 

 

문제 풀이 

1. 교점에 별 만들기(level 2) 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

더보기
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) 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

더보기
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) 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

더보기
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) 

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

더보기
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) 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

더보기
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

댓글