트랙
/
Julia
Julia
/
연습 문제
/
Elyse의 마법
Elyse의 마법

Elyse의 마법

학습 연습 문제

소개

Julia의 핵심 목표 중 하나는 수치 데이터에 대한 계산을 빠르고 효율적으로 수행하는 것이에요. 아주 많은 수치 데이터 말이에요.

일반적으로 이런 데이터는 배열(또는 이와 관련된 타입)에 저장되기 때문에, 배열이 Julia 언어의 중심에 있다고 해도 과언이 아니에요.

배열은 임의의 크기를 가질 수 있고(하드웨어의 메모리 제약만 받아요), 차원도 얼마든지 많이 가질 수 있어요.

이번 입문 개념에서는 1차원 배열, 즉 벡터의 기초에 집중해요.

벡터 만들기

Julia에서 벡터는 인덱스 번호로 접근할 수 있는 값의 순서 있는 나열이에요.

벡터를 만드는 가장 간단한 방법은 값을 대괄호 안에 나열하는 것이에요:

julia> num_vec = [1, 4, 9]
3-element Vector{Int64}:
 1
 4
 9

julia> str_vec = ["arrays", "are", "important"]
3-element Vector{String}:
 "arrays"
 "are"
 "important"

벡터의 타입은 각 원소의 타입과 일치해요.

그러면 벡터는 모든 원소가 같은 타입이어야 하나요?

어느 정도는 맞아요. 최고의 성능을 원한다면 이를 목표로 삼는 걸 권장해요. 하지만 Julia는 필요할 때 Any 타입을 사용해 이런 제약을 우회할 수 있어요:

julia> mixed_vector = [1, "str", 'c']
3-element Vector{Any}:
 1
  "str"
  'c': ASCII/Unicode U+0063 (category Ll: Letter, lowercase)

빈 벡터를 만들 때 Julia는 기본적으로 원소 타입을 Any로 지정하지만, 빈 배열에 원하는 원소 타입을 표기해서 더 구체적으로 지정할 수도 있어요.

julia> empty_vec = []
Any[]

julia> empty_int_vec = Int64[]
Int64[]

다음 규칙을 꼭 읽고 기억해 두세요:

  • Julia의 인덱싱은 기본적으로 0이 아니라 1에서 시작해요.

이는 다른 데이터 과학 언어(R, Matlab, Fortran...)를 써 본 사람에게는 익숙하지만, C 계열 언어에 익숙한 컴퓨터 과학자에게는 충격적으로 보일 수 있어요.

그 외에는 인덱스가 예상하는 대로 동작해요. 그냥 대괄호 안에 넣으면 돼요:

squares = [0, 1, 4, 9, 16]
squares[1]  # 0
squares[3]  # 4
squares[begin]  # 0 ("begin" is synonym for 1)
squares[end]  # 16 ("end" is synonym for length(squares))

end(아주 유용해요)와 begin(아마 아닐 거예요)으로 인덱싱하는 편리함도 눈여겨봐요.

Python 프로그래머라면 음수 인덱스를 궁금해할 수 있어요. 그럴 필요 없어요. 음수 인덱스는 Julia에 없고, BoundsError를 발생시켜요. 1보다 작거나 length(squares)보다 큰 인덱스도 마찬가지예요.

벡터 연산

Julia의 벡터는 _가변적_이에요. 각 칸의 내용을 바꿀 수 있어요.

julia> vals = [1, 3, 5, 7]
4-element Vector{Int64}:
 1
 3
 5
 7

julia> vals[2] = 4  # reassign the value of this element
4

# Only the value at position 2 changes:
julia> vals
4-element Vector{Int64}:
 1
 4
 5
 7

벡터를 다루는 함수가 많이 있지만, Julia 문서에서는 이를 벡터보다는 "컬렉션"으로 일반화해서 다뤄요.

관례적으로 입력을 변경하는 함수는 이름에 !가 붙어요. 컴파일러가 이를 강제하지는 않지만, Julia 세계에서는 아주 강한 관례예요.

유용한 함수 몇 가지를 살펴봐요:

  • 벡터 끝에 값을 추가하려면 push!()를 사용해요.
  • 마지막 값을 제거하려면 pop!()를 사용해요.
  • 벡터의 앞쪽을 다루는 함수로는 pushfirst!()와 popfirst!()가 있어요.
  • 임의의 위치에 원소를 넣거나 제거하려면 insert!()와 deleteat!()가 있어요.
julia> vals = [1, 3]
2-element Vector{Int64}:
 1
 3

julia> push!(vals, 5, 6)  # can add multiple values
4-element Vector{Int64}:
 1
 3
 5
 6

julia> pop!(vals)  # mutates vals, return popped value
6

julia> vals
3-element Vector{Int64}:
 1
 3
 5

지침

마술사 지망생 Elyse는 기초를 좀 연습할 필요가 있어요. Elyse에게는 조작하고 싶은 카드 더미가 하나 있어요.

좀 더 쉽게 하기 위해 Elyse는 1부터 10까지의 카드만 사용해서, 카드 더미를 숫자 벡터로 나타낼 수 있어요. 특정 카드의 위치는 벡터의 인덱스에 해당해요.

1. 카드 더미에서 카드 가져오기

카드를 한 장 고르려면, 주어진 카드 더미에서 인덱스 position에 있는 카드를 반환해요.

julia> stack = [1, 2, 4, 1];
julia> position = 3;
julia> get_item(stack, position)
4

2. 카드 더미의 카드 교체하기

손기술을 좀 부려서 인덱스 position에 있는 카드를 주어진 대체 카드와 교환해요. 변경된 카드 더미를 반환해요.

julia> stack = [1, 2, 4, 1];
julia> position = 3;
julia> replacement_card = 6;
julia> set_item!(stack, position, replacement_card)
[1, 2, 6, 1]

3. 카드 더미 맨 위에 카드 넣기

카드 더미 맨 위에 새 카드를 넣어서 카드 한 장을 나타나게 해요. 변경된 카드 더미를 반환해요.

julia> stack = [5, 9, 7, 1];
julia> new_card = 8;
julia> insert_item_at_top!(stack, new_card)
[5, 9, 7, 1, 8]

4. 카드 더미에서 카드 제거하기

카드 더미에서 주어진 position에 있는 카드를 제거해서 카드 한 장을 사라지게 해요. 변경된 카드 더미를 반환해요.

julia> stack = [3, 2, 6, 4, 8];
julia> position = 3;
julia> remove_item!(stack, position)
[3, 2, 4, 8]

5. 카드 더미 맨 위의 카드 제거하기

카드 더미 맨 위에 있는 카드를 제거해서 카드 한 장을 사라지게 해요. 변경된 카드 더미를 반환해요.

julia> stack = [3, 2, 6, 4, 8];
julia> remove_item_from_top!(stack)
[3, 2, 6, 4]

6. 카드 더미 맨 아래에 카드 넣기

카드 더미 맨 아래에 새 카드를 넣어서 카드 한 장을 나타나게 해요. 변경된 카드 더미를 반환해요.

julia> stack = [5, 9, 7, 1];
julia> new_card = 8;
julia> insert_item_at_bottom!(stack, new_card)
[8, 5, 9, 7, 1]

7. 카드 더미 맨 아래의 카드 제거하기

카드 더미 맨 아래에 있는 카드를 제거해서 카드 한 장을 사라지게 해요. 변경된 카드 더미를 반환해요.

julia> stack = [8, 5, 9, 7, 1];
julia> remove_item_at_bottom!(stack)
[5, 9, 7, 1]

8. 카드 더미의 크기 확인하기

카드 더미의 크기가 stack_size와 같은지 확인해요.

julia> stack = [3, 2, 6, 4, 8];
julia> stack_size = 4;
julia> check_size_of_stack(stack, stack_size)
false
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Julia Exercism

Elyse의 마법 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 Julia 트랙을 개념 35개연습 문제 128개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.