오늘 할 일: 갈고 닦기

해시

1. Lv 2 - 나머지 한 점

import collections

def solution(v):
    coord = {'x': [i[0] for i in v], 'y': [j[1] for j in v]}
    answer = []

    for value in coord:
        my_counter = collections.Counter(coord[value])
        my_counter = sorted(my_counter.items(), key=lambda x: x[1])
        answer.append(my_counter[0][0])

    return answer
  • 딕셔너리 자료구조는 for key, value in coord.items() 또는 for axis, coordinates in coord.items()와 같이 표기하기

 

2. Lv 2 - 운송 트럭

def solution(max_weight, specs, names):
    answer = 1
    specs = dict(specs)
    weight = 0

    for name in names:
        weight += int(specs[name])
        if weight > max_weight:
            answer += 1
            weight = int(specs[name])

    return answer

 

3. Lv 3 - 빙고

def solution(board, nums):
    answer = 0
    N = len(board)

    # 빙고 내에 nums의 숫자가 있으면 0으로 변경
    for i in range(N):
        for j in range(N):
            for num in nums:
                if board[i][j] == num:
                    board[i][j] = 0

    right_down = 0
    left_down = 0
    # 우하향, 좌하향(대각선)으로 원소합이 0이라면 빙고 개수 +1
    for k in range(N):
        right_down += board[k][k]
    if right_down == 0:
        answer += 1

    for k in range(N):
        left_down += board[k][N - k - 1]
    if left_down == 0:
        answer += 1

    # 가로, 세로의 원소합이 0이라면 빙고 개수 +1
    for i in range(N):
        width = 0
        height = 0
        for j in range(N):
            width += board[i][j]
            height += board[j][i]
        if width == 0:
            answer += 1
        if height == 0:
            answer += 1

    return answer
  • 효율성 테스트를 통과하기 위해 숫자가 담긴 리스트를 set 자료구조로 변형.
  • time complexity를 O(N4)에서 O(N2)로 줄임.

 

4. Lv 3 - 방문길이

변경 전

def solution(dirs):
    answer = 0
    d = {'U': (0, 1), 'D': (0, -1), 'L': (-1, 0), 'R': (1, 0)}
    visited = []
    start_idx = (0, 0)

    for cmd in dirs:
        next_idx = (start_idx[0] + d[cmd][0], start_idx[1] + d[cmd][1])
        if abs(next_idx[0]) > 5 or abs(next_idx[1]) > 5:
            continue
        if (start_idx, next_idx) not in visited:
            visited.append((start_idx, next_idx))
            visited.append((next_idx, start_idx))
            answer += 1
        start_idx = next_idx

    return answer
  • 인덱스로 접근하기보다는 딕셔너리 자료구조를 활용해 볼 것.
  • 변수가 무슨 역할을 하는지 변수명에서 드러나는 게 좋음.
    • command : 받는 문자열이 캐릭터를 움직이는 명령어이기 때문에
    • dir_coord : 방향과 각각에 해당하는 좌표를 나타내기 때문에

 

변경 후

def solution(dirs):
    answer = 0
    dir_coord = {'U': (0, 1), 'D': (0, -1), 'L': (-1, 0), 'R': (1, 0)}
    visited = set()
    start_idx = (0, 0)

    for cmd in dirs:
        next_idx = (start_idx[0] + dir_coord[cmd][0], start_idx[1] + dir_coord[cmd][1])
        if abs(next_idx[0]) > 5 or abs(next_idx[1]) > 5:
            continue
        if (start_idx, next_idx) not in visited:
            visited.add((start_idx, next_idx))
            visited.add((next_idx, start_idx))
            answer += 1
        start_idx = next_idx

    return answer
  • 딕셔너리 자료구조를 활용하여 적용하니 코드가 훨씬 간결하고 이해하기 쉬워짐.

 

스택

1. Lv 2 - 쇠막대기

def solution(s):
    stack = []
    answer = 0

    for c in s:
        if c == '(':
            stack.append(c)
            cut = True
        else:
            stack.pop()
            if cut:
                answer += len(stack)
                cut = False
            else:
                answer += 1

    return answer
  • 올바른 괄호 문제를 변형하여 풀이함.
  • 레이저를 replace()를 사용하여 다른 문자로 변경하고 풀어보기. replace()의 time complexity는 O(N)이다.

 

2. Lv 2 - 짝지어 제거하기

def solution(s):
    stack = []

    for alphabet in s:
        if not stack or alphabet != stack[-1]:
            stack.append(alphabet)
        else :
            stack.pop()

    return 1 if not len(stack) else 0
  • : 앞에는 띄어쓰기를 넣지 않는 편이 좋음. 즉, else : -> else:

 

3. Lv 2 - 사전순 부분문자열

def solution(s):
    stack = []

    for alphabet in s:
        while len(stack) > 0 and stack[-1] < alphabet:
            stack.pop()
        stack.append(alphabet)

    return ''.join(stack)

 

모의고사

1. 좌석 구매

def solution(seat):
    seat = map(tuple, seat)
    seat = set(seat)
    return len(seat)

 

2. 대중소 괄호 짝 맞추기

변경 전

def solution(s):
    open_bracket = ['(', '{', '[']
    close_bracket = [')', '}', ']']
    new_list = []
    new_idx_list = []

    for bracket in s:
        if bracket in open_bracket:
            new_idx_list.append(open_bracket.index(bracket))
            new_list.append(bracket)
            print(new_idx_list, new_list)
        else:
            if len(new_list) and new_list[-1] == close_bracket[new_idx_list[-1]]:
                new_list.pop()
                new_idx_list.pop()
                print(new_idx_list, new_list)
            else:
                return False

    return False if len(new_list) else True
  • 딕셔너리 자료구조를 활용해 볼 것

 

변경 후

def solution(s):
    pairs = {'(': ')', '{': '}', '[': ']'}
    new_list = []

    for bracket in s:
        if bracket in pairs:
            new_list.append(bracket)
        else:
            if len(new_list) and bracket == pairs.get(new_list[-1]):
                new_list.pop()
            else:
                return False

    return False if len(new_list) else True
  • 변수명을 확실하게 하자. new_list -> stack 등
  • if len(new_list) == if new_list
  • pairs.get(new_list[-1]) -> paris[new_list[-1]]

'OLD > Coding Study' 카테고리의 다른 글

[4주차 정렬, DP] 코드 리뷰  (0) 2020.03.16
[3주차 탐색] 코드 리뷰  (0) 2020.03.04
[1주차 큐, 힙] 코드 리뷰  (0) 2020.02.23
[0주차 모의고사] 스킬 트리  (0) 2020.02.18