

삼성 기출에서 자주 나오는 & 숙지하면 좋을 코드 유형들을 추려보았습니다
혹시 자주 나오는 또다른 유형이 있다면 댓글로 알려주시면 감사하겠습니다 ! 🙇🏻♀️
arr = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
## zip
# 시계 방향 90 (= 반시계 방향 270)
arr_90 = list(map(list, zip(*arr[::-1])))
print(arr_90)
# 시계 방향 180 (= 반시계 방향 180)
arr_180 = [a[::-1] for a in arr[::-1]]
print(arr_180)
# 시계 방향 270 (= 반시계 방향 90)
arr_270 = [x[::-1] for x in list(map(list, zip(*arr[::-1])))[::-1]]
print(arr_270)
## 인덱싱
arr = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
n = 3
# 시계 방향 90 (= 반시계 방향 270)
new_90 = [[0] * n for _ in range(n)]
for i in range(n):
    for j in range(n):
        new_90[j][n - i - 1] = arr[i][j]
print(new_90)
# 시계 180 & 반시계 180
new_180 = [[0] * n for _ in range(n)]
for i in range(n):
    for j in range(n):
        new_180[n - i - 1][n - j - 1] = arr[i][j]
print(new_180)
# 시계 270 & 반시계 90
new_270 = [[0] * n for _ in range(n)]
for i in range(n):
    for j in range(n):
        new_270[n - 1 - j][i] = arr[i][j]
print(new_270)
def rotated_90(a):
  m= len(a)
  n = len(a[0])
  result = [[0]* m for _ in range(n)] # 배열의 가로 세로 길이가 뒤바뀌는 것 주의
  for i in range(m): # 범위 주의
    for j in range(n): # 범위 주의
      result[j][m-i-1] = a[i][j]
  return result
def rotated_180(a):
  n= len(a)
  m = len(a[0])
  result = [[0]* m for _ in range(n)] 
  for i in range(n): # 범위 주의
    for j in range(m): # 범위 주의
      result[n-i-1][m-j-1] = a[i][j]
  return result
def rotated_270(a):
  n= len(a)
  m = len(a[0])
  result = [[0]* n for _ in range(m)] # 배열의 가로 세로 길이가 뒤바뀌는 것 주의
  for i in range(n): # 범위 주의
    for j in range(m): # 범위 주의
      result[m-1-j][i] = a[i][j]
  return result
a=[[1,2,3,4],[5,6,7,8],[9,10,11,12]]
print(rotated_90(a))
print(rotated_180(a))
print(rotated_270(a))
부분 회전은 말그대로 2차원배열의 특정 부분만 회전시키는 것을 말한다. 보기엔 간단해 보일 수 있어도 꼭 step 별로 구현하는 것을 추천한다. (나중에 해당 부분에서 꼬이게 되면 디버깅 하기 힘들기 때문)
# 7X7 배열
arr = [[7 * j + i for i in range(1, 8)] for j in range(7)]
new_arr = [[0] * 7 for _ in range(7)]
sy, sx = 2, 2
length = 3
# 배열의 특정 부분(정사각형)을 회전시킴
def rotate_90(sy, sx, length):
    global arr, new_arr
    # 정사각형을 시계방향으로 90도 회전
    for y in range(sy, sy + length):
        for x in range(sx, sx + length):
            # 1단계 : (0,0)으로 옮겨주는 변환을 진행함
            oy, ox = y - sy, x - sx
            # 2단계 : 90도 회전했을때의 좌표를 구함
            ry, rx = ox, length - oy - 1
            # 3단계 : 다시 (sy,sx)를 더해줌
            new_arr[sy + ry][sx + rx] = arr[y][x]
    # new_arr 값을 현재 board에 옮겨줌
    for y in range(sy, sy + length):
        for x in range(sx, sx + length):
            arr[y][x] = new_arr[y][x]
            print(arr[y][x])
rotate_90(sy, sx, length)
for i in range(len(arr)):
    print(arr[i])
원본

회전 후

삼성 코테는 itertools 라이브러리 사용 불가하다. 백트래킹으로 직접 구현해서 써야한다.
arr = [1, 2, 3, 4]
visited = [0] * len(arr)  # visited도 전역으로 둬도 됨
def permutations(n, new_arr):
    global arr
    # 순서 상관 0, 중복 X
    if len(new_arr) == n:
        print(new_arr)
        return
    for i in range(len(arr)):
        if not visited[i]:
            visited[i] = 1
            permutations(n, new_arr + [arr[i]])
            visited[i] = 0
permutations(2, [])
parameter : 뽑을 개수, 뽑힌 값을 담는 배열arr = [1, 2, 3, 4]
def product(n, new_arr):
    global arr
    # 순서 상관 0, 중복 0
    if len(new_arr) == n:
        print(new_arr)
        return
    for i in range(len(arr)):
        product(n, new_arr + [arr[i]])
product(2, [])
parameter : 뽑을 개수, 뽑힌 값을 담는 배열arr = [1, 2, 3, 4]
# 현재 인덱스 +1 만큼을 매개변수로 계속 넘겨주어야함
# 순서가 상관없고 중복 불가이기 때문에 현재 인덱스보다 같거나 작은 인덱스는 볼 필요가 없기 때문
def combinations(n, new_arr, c):
    # 순서 상관 X, 중복 X
    if len(new_arr) == n:
        print(new_arr)
        return
    for i in range(c, len(arr)):
        combinations(n, new_arr + [arr[i]], i + 1)
combinations(2, [], 0)
현재 인덱스+1 값을 넘김parameter : 뽑을 개수, 뽑힌 값을 담는 배열, 현재 인덱스arr = [1, 2, 3, 4]
def combinations_with_replacement(n, new_arr, c):
    # 순서 상관 X, 중복
    if len(new_arr) == n:
        print(new_arr)
        return
    for i in range(c, len(arr)):
        combinations(n, new_arr + [arr[i]], i)
combinations_with_replacement(2, [], 0)
현재 인덱스 값을 그대로 넘김parameter : (뽑을 개수, 뽑힌 값을 담는 배열, 현재 인덱스)arr = [[0, 1, 0], [1, 0, 1], [0, 1, 0], [0, 0, 1], [0, 1, 0]]
print("기존")
for i in range(len(arr)):
    print(arr[i])
def gravity(arr):
    n = len(arr)
    m = len(arr[0])
    for i in range(m):
        write = n-1
        for j in range(n-1,-1,-1):
            if arr[j][i]==1:
                if write == j:
                    write-=1
                    continue
                arr[write][i],arr[j][i]=1,0
                write-=1
gravity()
print("변화")
for i in range(len(arr)):
    print(arr[i])

2차원 배열에서 시작 지점을 기준으로 나선형으로 값에 접근하는 코드 유형이다
어딘가에선 토네이도 🌪 코드라고도 불리는 듯 하다
def spiral_from_center(n: int):
    """센터에서 시작해 좌→하→우→상 순으로 나선 채우기 (센터는 0 유지)"""
    arr = [[0]*n for _ in range(n)]
    y = x = n // 2           # 시작: 중앙
    num = 0                  # 채울 값 (센터는 0 유지)
    dist = 1                 # 한 번에 이동할 칸 수
    d_idx = 0                # 현재 방향 인덱스 (0:좌,1:하,2:우,3:상)
    dy=[0,1,0,-1]
    dx=[-1,0,1,0]
    # 전체 칸 n*n 중, 센터를 비워 두면 채워야 할 칸은 n*n - 1
    while num < n*n - 1:
        # 같은 dist로 두 번 진행하면(좌→하) dist를 1 늘리는 패턴
        for _ in range(2):
            _dy=dy[d_idx]
            _dx=dx[d_idx]
            for _ in range(dist):
                y += _dy
                x += _dx
                if 0 <= y < n and 0 <= x < n:
                    num += 1
                    arr[y][x] = num
            d_idx = (d_idx + 1) % 4
        dist += 1
    return arr
arr=spiral_from_center(5)
for i in range(len(arr)):
    print(arr[i])
    

def spiral_from_corner(n: int):
    """(0,0)에서 시작해 우→하→좌→상으로 바깥에서 안쪽으로 채우기"""
    arr = [[0]*n for _ in range(n)]
    y = x = 0
    num = 1
    dirs = [(0,1),(1,0),(0,-1),(-1,0)]  # 우, 하, 좌, 상
    d_idx = 0
    # 바깥-테두리 길이를 줄여가며 진행
    top, left, bottom, right = 0, 0, n-1, n-1
    while top <= bottom and left <= right:
        # 우
        for c in range(left, right+1):
            arr[top][c] = num; num += 1
        top += 1
        # 하
        for r in range(top, bottom+1):
            arr[r][right] = num; num += 1
        right -= 1
        if top > bottom or left > right: break
        # 좌
        for c in range(right, left-1, -1):
            arr[bottom][c] = num; num += 1
        bottom -= 1
        # 상
        for r in range(bottom, top-1, -1):
            arr[r][left] = num; num += 1
        left += 1
    return arr
낚시왕 문제는 아래 방식대로 코드를 짜지 않으면 시간초과가 난다. 아래 코드의 경우 한 번에 코드를 이해하기 힘들 수 있는데 해당 영상이 이해하는 데 도움이 될 수 있으니 참고해 보면 좋을 듯 하다
# d: 1=위, 2=아래, 3=오른쪽, 4=왼쪽
dr = [0, -1, 1, 0, 0]
dc = [0,  0, 0, 1,-1]
def move(r, c, s, d, R, C):
    if d in (1, 2):                  # 위/아래
        cycle = 2 * (R - 1) if R > 1 else 1
        steps = s % cycle
        for _ in range(steps):
            if r == 0 and d == 1:    # 맨 위에서 위로 가려면 튕겨서 아래로
                d = 2
            elif r == R-1 and d == 2: # 맨 아래에서 아래로 가려면 튕겨서 위로
                d = 1
            r += dr[d]
    else:                            # 좌/우
        cycle = 2 * (C - 1) if C > 1 else 1
        steps = s % cycle
        for _ in range(steps):
            if c == 0 and d == 4:    # 맨 왼쪽에서 왼쪽이면 → 오른쪽으로 튕김
                d = 3
            elif c == C-1 and d == 3: # 맨 오른쪽에서 오른쪽이면 → 왼쪽으로 튕김
                d = 4
            c += dc[d]
    return r, c, d
백준의 배열돌리기1 문제 풀이이다 !
from collections import deque
def rotate_matrix(arr, R):
    N = len(arr)
    M = len(arr[0])
    layers = min(N, M) // 2  # 레이어 개수
    
    for layer in range(layers):
        q = deque()
        
        # 1. 레이어 껍질 꺼내기
        # 위쪽 행
        for y in range(layer, M-layer):
            q.append(arr[layer][y])
        # 오른쪽 열
        for x in range(layer+1, N-layer-1):
            q.append(arr[x][M-layer-1])
        # 아래쪽 행
        for y in range(M-layer-1, layer-1, -1):
            q.append(arr[N-layer-1][y])
        # 왼쪽 열
        for x in range(N-layer-2, layer, -1):
            q.append(arr[x][layer])
        
        # 2. 회전 (R만큼 왼쪽으로)
        q.rotate(-(R % len(q)))
        
        # 3. 다시 채워넣기
        # 위쪽 행
        for y in range(layer, M-layer):
            arr[layer][y] = q.popleft()
        # 오른쪽 열
        for x in range(layer+1, N-layer-1):
            arr[x][M-layer-1] = q.popleft()
        # 아래쪽 행
        for y in range(M-layer-1, layer-1, -1):
            arr[N-layer-1][y] = q.popleft()
        # 왼쪽 열
        for x in range(N-layer-2, layer, -1):
            arr[x][layer] = q.popleft()
    return arr
좋은 글 감사합니다 :)