Post

라이브코테 준비 - 연습문제2

어떤 기업의 라이브코테를 봐야했다.

메일로 연습문제를 보내줬으므로 풀어보도록 하였다.

출처링크

문제

1
2
3
4
5
6
7
8
9
10
11
Problem 134 [Easy]

페이스북에서 제출된 문제입니다.

0이 대다수를 차지하는 큰 배열이 있습니다.

더 공간 효율적인 자료구조인 SparseArray를 다음과 같은 인터페이스로 구현하세요.

init(arr, size): 큰 원본 배열과 사이즈를 인자로 받아 초기화 합니다.
set(i, val): 인덱스 i 를 val 값으로 업데이트 합니다.
get(i): 인덱스 i 번째 값을 반환합니다.

저번에 풀었던 경험처럼 이렇게만 주어지면 너무 모호하다.

나는 일단 풀었으므로 고려해야할 사항을 추가하겠다.

먼저, 실제 테스트코드를 보면서 유추를 해봐야겠다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def test_p134_1():
    arr = SparseArray([0, 0, 0], 5)

    assert arr.get(0) == 0
    assert arr.get(3) == 0

    with pytest.raises(IndexError):
        assert arr.get(-1)
        assert arr.get(-1, 0)
        assert arr.get(5)
        assert arr.set(5, 0)

    arr.set(0, 1)
    assert arr.get(0) == 1

    arr.set(4, 1)
    assert arr.get(4) == 1

이 코드가 돌아가게 하면 되는데, 인자로 들어온 오리진 배열의 크기는 3이다. 근데 초기화 사이즈로 받는 값은 5이다.

근데 assert arr.get(3) == 0이 통과된 것으로 보아 오리진 배열의 크기를 벗어나도 초기화 사이즈 안에만 있으면 0을 리턴해야한다는 것이다.

그리고 with구문 안에 assert arr.get(-1,0)은 출제자의 오타 같고 이슈를 냄기려 했으나 막아놓으신 관계로.. 오타라고 생각하겠다. 아무튼 초기화 사이즈의 인덱스 범위를 벗어나면 IndexError를 발생시켜야한다.

풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import pytest


class SparseArray:
    def __init__(self, origin_list, input_size):
        self.size = input_size
        self.dic = {}

        for i in range(input_size):
            if i >= len(origin_list):
                self.dic[i] = 0
            else:
                self.dic[i] = origin_list[i]

    def get(self, idx) -> int:
        try:
            return self.dic[idx]
        except Exception:
            raise IndexError

    def set(self, idx, value) -> None:
        try:
            self.dic[idx] = value
        except Exception:
            raise IndexError

나는 이렇게 풀었는데, 실제로 답지는 좀 더 효율적으로 풀었다.

나와 다른점은 나는 오리진 배열의 크기를 넘어서면 0으로 초기화해줬는데, 답지는 그렇게 하지 않았고 초기화 작업을 하지 않았다.

그리고 get()이나 set()함수 호출시 초기화 사이즈를 넘어서는지 확인하고 get()경우 벗어나지 않지만 초기화되지 않았다면(None인 경우) 0을 리턴해버리고, set()경우는 처음 접근하는 값이던 아니던 초기화작업을 수행해준다.

그래서 나와 달리 초기화 작업을 거칠 필요가 없으므로 나보다 더 빠른 코드가 탄생할 것이다.

또한, 모든 예외에 대해서 IndexError를 발생시키도록 하였는데, 답지는 좀 더 디테일하게 범위를 정하여 예외처리를 하였다.

결론

라이브 코테를 좀 해보니까 알것같다.

최소한의 조건만줘도 얼마나 디테일하게 설계하는지를 보는것 같단 생각을 하였다. 그냥 푸는것도 중요하지만 주어진 조건으로 예외를 어떻게 생각하는지?에 대해 고민하게 만드는것 같다.

다음 문제는 좀 더 디테일하게 풀어보도록 해야겠다.

This post is licensed under CC BY 4.0 by the author.