[algorithm] 시간 줄이기 연습

markyang92·2021년 11월 2일
0

algorithm

목록 보기
10/13

1. remove() 주의하자.

for i in range(0, N):
    ...
    now_list.remove(dish[i])

2. in, not in은 매우 비효율적이다.

  • 그냥 순차 탐색이라 O(N)O(N) 이다.

3. for -> list comprehension

list의 일부 element 더하고 저장

  • listelement에 접근해 값을 수정하는데, 당연히 for이 많이 사용되지만..
    • slicing을 사용하는 연습을 하자!!!!!!!
      똑같은 동작이지만 시간이 아래 list comprehension 을 사용한 것이 빠르다.
truck[s:e]=[ x+move_box for x in truck[s:e] ]

2차원 list

1. '111011' 처럼 붙어서 한줄 씩 들어오는 경우

import sys

readl=sys.stdin.readline
row, col=map(int,readl().split())
maps=[[0]+list(map(int, readl().strip()))+[0] if 1<=r=R else [0]*(C+2) for r in range(R+2)]
for i in range(0,row):
    print(maps[i])

# ==== 입력 ==== #
7 8
0010000
0011000
0001100
1011111
1111011
0011100
0011100
0001000
3 5

# ==== 출력 ==== #
[0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 1, 0, 0, 0, 0, 0]
[0, 0, 0, 1, 1, 0, 0, 0, 0]
[0, 0, 0, 0, 1, 1, 0, 0, 0]
[0, 1, 0, 1, 1, 1, 1, 1, 0]
[0, 1, 1, 1, 1, 0, 1, 1, 0]
[0, 0, 0, 1, 1, 1, 0, 0, 0]
[0, 0, 0, 1, 1, 1, 0, 0, 0]


2. 'WLLWL' 처럼 붙어서 한줄 씩 들어오는 경우

import sys

readl=sys.stdin.readline
R,C = map(int,readl().strip().split())
maps[ list(readl().strip() for _ in range(R) ]
for i in range(R):
    print(maps[i])

# ==== 입력 ==== #
5 7
WLLWWWL
LLLWLLL
LWLWLWW
LWLWLLL
WLLWLWW
# ==== 출력 ==== #
['W', 'L', 'L', 'W', 'W', 'W', 'L']
['L', 'L', 'L', 'W', 'L', 'L', 'L']
['L', 'W', 'L', 'W', 'L', 'W', 'W']
['L', 'W', 'L', 'W', 'L', 'L', 'L']
['W', 'L', 'L', 'W', 'L', 'W', 'W']

3. 2차원 list '0'으로 초기화하여 만들기

visited=[ [0 for _ in range(col+2)] for _ in range(row+2) ]

4. 2차원 list, comprehension

  1. maps(2차원 list)에서 element가 -1인 것은 0으로, 아니면 element 그대로
maps=[[0 if x==-1 else x for x in row] for row in maps]


  1. maps[2:4]에서 element-1인 경우 0으로, 아닌 경우 x값 그대로

  1. 2차원 리스트의 각 row10 이상일 때, 그 row의 합이 3으로 나누어 떨어지는 것'만' element로 담음
maps = [[1,2,3], [4,5,6], [7,8,9]]
maps = [ [ x for x in row if x % 3 == 0] for row in maps if sum(row) >=10]
# 결과
# [[6], [9]]

dict

'x y' 형태로 들어오는 입력을 각각 dict의 key, value

  • 알고리즘 문제를 풀다보면 아래와 같이 N번의 입력을 예고하고 X Y 형태로 값을 줄때가 있는데
    • 즉각 dict()X: key, Y: value 로 넣을 수 있다.
readl=sys.stdin.readline
vil=dict( map(int,readl().strip().split() for_ in range(N) )
print(vil)
# ==== 입력 ==== #
3
1 0
2 21
4 0
# ==== 출력 ==== #
{1: 0, 2: 21, 4: 0}

조건문 단줄화

for i in range(0,4):
    nx=now_x+dx[i]
    ny=now_y+dy[i]
    if (nx < 0 or nx >=row) or (ny < 0 or ny >= col) or (maps[nx][ny] != 1):
        continue
profile
pllpokko@alumni.kaist.ac.kr

0개의 댓글