자기개발👨‍💻/코딩 알고리즘

파이썬 알면 좋은 내용!

천숭이 2023. 12. 7. 16:56

1. 마름모 범위 체크

(↓마름모의 크기가 1일때)

  1  
1 1 1
  1  

 

위 격자에서 1이 있는 부분만을 마름모라고 표현한다면, (정사각형이고 한 변의 크기를 n이라고 하자)

(0,0) ~ (n-1,n-1) 즉, 좌측 위부터 우측 아래까지 모든 영역에서 (a,b)가 마름모의 범위에 속하는지 구하는 방법!

중앙의 인덱스 값을 (cx, cy)라고 한다면 아래 범위 내부에 속해야 한다.

|a-cx| + |b-cy| <= m (마름모의크기)

ex )

  1 ?
1 1 1
  1  

마름모 중앙의 인덱스는 (1, 1)이다. (0,2)가 범위 내에 있는지 체크해보자

         |1-0| + |1-2| = 2이므로 범위 내에 없다

 

 

2. 다차원배열 -> 1차원배열

tmp = [[1,2],[3,4]]
result = sum(tmp, []) 
# tmp 내부의 리스트와 빈 리스트를 합친다는 의미로, 결국에 tmp 내부 리스트 값만 추출돼서 1차원배열로 저장됨

 

 

3. 격자에서 쓰면 좋은 스킬

 (1) dx, dy 테크닉

 (2) 빈 board를 만들어서 방문 체크

 

 

4. 사각형 시계방향으로 밀면서 회전

배열을 쉬프트해야 하는데, 행과 열이 증가하는 방향으로 쉬프트 되면 역순 for문으로 코딩하기

temp 한 번만 백업하는 방법! 

# 직사각형 경계 숫자들 시계방향으로 회전
# 네 변 쉬프트 할 때마다 tmp 저장이 아닌, 한 번만 tmp 저장!
def rotate(start_row, start_col, end_row, end_col):
    temp = a[start_row][start_col]
    # 왼면
    for row in range(start_row, end_row):
        a[row][start_col] = a[row+1][start_col]
    
    # 아랫면
    for col in range(start_col, end_col):
        a[end_row][col] = a[end_row][col+1]

    # 오른면
    for row in rangee(end_col, start_col, -1)):
        a[start_row][col] = a[start_row][col-1]

    a[start_row][start_col+1] = temp

 

 

 

5. 파이썬 프로그램 종료 방법

# 프로그램 정상 종료
sys.exit(0)

# 프로그램 비정상 종료
sys.exit(1)

 

 

6. 리스트내에 반복되는 수열이 존재하는지, 그리고 바로 붙어서 존재하는지 체크

def is_possible_series():
    length = 1
    while True:
        # start2:end2 | start1:end1
        start1, end1 = len(series) - length, len(series) - 1
        start2, end2 = start1 - length, start1 - 1

        if start2 < 0:
            break

        # length만큼의 연속된 부분수열이 있는지 체크
        if series[start1:end1 + 1] == series[start2:end2 + 1]:
            return False

        length += 1
    
    return True

 

 

7. 문자열 받을 때 개행문자(줄바꿈 '\n') 처리 방법 

readline 함수에서 strip() 처리 해주면 개행문자 제외되고 입력받을 수 있다

import sys
grid =[
    list(sys.stdin.readline().strip())
    for _ in range(n)
]

 

 

8. 격자 N X M 크기 헷갈릴 때

행 x 열 임을 기억하자.

통상 n은 행이고, m은 열로 표현

백준 문제 설명 중 일부
N x M = 3 x 5

 

 

9. recursion 깊이 제한 해제

sys.setrecursionlimit(2500)  # 2500 아닌 다른 수도 가능