트랙
/
Julia
Julia
/
연습 문제
/
Tisbury 보물찾기
Tisbury 보물찾기

Tisbury 보물찾기

학습 연습 문제

소개

Tuple은 여러 면에서 Vector(1차원 array)와 아주 비슷해요. 하지만 몇 가지 중요한 차이점이 있어요.

  • 튜플은 대괄호 [ ] 대신 소괄호 ( )로 작성해요. 다만 의미가 명확한 경우에는 소괄호를 생략할 수 있어요.
  • 튜플은 모든 원소가 같은 타입일 필요가 없어요. 각 원소의 타입이 따로 저장돼요.
  • 튜플은 불변이에요.

불변성 덕분에 컴파일러가 더 많은 최적화를 할 수 있고, 튜플은 벡터보다 성능이 좋아요. 그래서 값을 바꿀 필요가 없을 때는 튜플을 쓰는 게 좋아요.

julia> t = (3, 5.2, "xyz")
(3, 5.2, "xyz")

# Non-homogeneous:
julia> dump(t)
Tuple{Int64, Float64, String}
  1: Int64 3
  2: Float64 5.2
  3: String "xyz"

julia> t[2]
5.2

# Immutable:
julia> t[2] = 7.3
ERROR: MethodError: no method matching setindex!(::Tuple{Int64, Float64, String})

Tuple() 생성자도 있어요. 이 생성자는 반복 가능한 모든 컬렉션을 튜플로 바꿔줘요. 유용하게도, 문자열을 문자의 반복 가능한 컬렉션으로 취급해요.

julia> Tuple("Julia")
('J', 'u', 'l', 'i', 'a')

어떤 튜플이든 인덱스로 원소에 접근하거나, 원소를 순회할 수 있어요.

숫자로만 이루어진 튜플은 배열과 똑같이 sum() 같은 수학 함수에 사용할 수 있어요.

구조 분해

여러 개를 한 번에 대입하면 튜플을 각각의 원소로 분해할 수 있어요. 필요하지 않은 원소에는 더미 변수로 밑줄(_)을 사용해요.

julia> tup = (1, "Julia", true)
(1, "Julia", true)

julia> num, name, _ = tup
(1, "Julia", true)

julia> uppercase(name), 2num
("JULIA", 2)

Python 프로그래머라면 이 다중 대입 문법이 아주 익숙할 거예요.

이름 있는 튜플

Tuple은 값만 담아요. NamedTuple은 각 값에 이름을 짝지어 줘요.

그러면 "점" 표기법으로 각 필드에 접근할 수 있어요:

julia> nt = (a = 1, b = 7.3)
(a = 1, b = 7.3)

julia> dump(nt)
@NamedTuple{a::Int64, b::Float64}
  a: Int64 1
  b: Float64 7.3

julia> nt.b
7.3

이름은 내부적으로 Symbol이라는 불변 타입으로 저장돼요. Symbol은 앞에 콜론 :을 붙여요. 그래서 다른 문법도 쓸 수 있어요:

julia> nt[:b]
7.3

값과 이름(또는 "키")을 각각 따로 가져오는 것도 쉬워요:

julia> nt
(a = 1, b = 7.3)

julia> keys(nt)
(:a, :b)

julia> values(nt)
(1, 7.3)

이름 있는 튜플을 순회하면 _값_만 나오고 _이름_은 무시된다는 점에 주의해요.

튜플은 (이름이 있든 없든) 함수와 구조화된 데이터를 주고받는 아주 흔한 방법이에요. 이런 용도에서는 불변성이 좋아요. 데이터 안전성을 보장하고, 컴파일러가 더 적극적으로 최적화할 수 있게 해주니까요.

지침

Azara와 Rui는 해적을 테마로 한 보물찾기 대회에 함께 참가한 팀원이에요. 한 명은 지도 좌표가 적힌 보물 목록을, 다른 한 명은 지도 좌표가 적힌 장소 이름 목록을 가지고 있어요. 두 사람은 시작 지점이 '현재 위치'로 표시된 빈 지도도 받았어요.

Azara의 목록 Rui의 목록
Treasure Coordinates
Amethyst Octopus 1F
Angry Monkey Figurine 5B
Antique Glass Fishnet Float 3D
Brass Spyglass 4B
Carved Wooden Elephant 8C
Crystal Crab 6A
Glass Starfish 6D
Model Ship in Large Bottle 8A
Pirate Flag 7F
Robot Parrot 1C
Scrimshaw Whale's Tooth 2A
Silver Seahorse 4E
Vintage Pirate Hat 7E
Location Name Coordinates Quadrant
Seaside Cottages ('1', 'C') Blue
Aqua Lagoon (Island of Mystery) ('1', 'F') Yellow
Deserted Docks ('2', 'A') Blue
Spiky Rocks ('3', 'D') Yellow
Abandoned Lighthouse ('4', 'B') Blue
Hidden Spring (Island of Mystery) ('4', 'E') Yellow
Stormy Breakwater ('5', 'B') Purple
Old Schooner ('6', 'A') Purple
Tangled Seaweed Patch ('6', 'D') Orange
Quiet Inlet (Island of Mystery) ('7', 'E') Orange
Windswept Hilltop (Island of Mystery) ('7', 'F') Orange
Harbor Managers Office ('8', 'A') Purple
Foggy Seacave ('8', 'C') Purple

그런데 좀 엉망이에요. Azara의 좌표는 Rui의 좌표와 형식도, 정렬 순서도 달라 보여서, 어떤 보물이 어느 장소에 해당하는지 알아내려면 두 목록을 번갈아 계속 들여다봐야 해요. Julia를 막 배우기 시작한 두 사람은 탐사 정보를 더 잘 정리할 작은 프로그램(정확히는 함수 몇 개)을 작성하는 데 도움을 받고자 여러분에게 찾아왔어요.

1. 좌표 추출하기

Azara의 목록에서 (treasure, coordinate) 쌍을 받아 추출한 지도 좌표만 반환하는 get_cooordinate() 함수를 구현해요.

julia> get_cooordinate( ("Scrimshaw Whale's Tooth", "2A") )
"2A"

2. 좌표 형식 맞추기

"2A" 형식의 좌표를 받아 ('2', 'A') 형식의 튜플을 반환하는 convert_coordinate() 함수를 구현해요.

julia> convert_coordinate("2A")
('2', 'A')

3. 좌표 일치 확인하기

(treasure, coordinate) 쌍과 (location, coordinate, quadrant) 레코드를 받아 각각의 좌표를 비교하는 compare_records() 함수를 구현해요. 좌표가 일치하면 **true**를, 일치하지 않으면 **false**를 반환해요. 정확하게 비교하려면 좌표 형식을 필요에 따라 다시 맞춰요.

julia> compare_records(("Brass Spyglass", "4B"), ("Seaside Cottages", ('1', 'C'), "blue"))
false

julia> compare_records(("Model Ship in Large Bottle", "8A"), ("Harbor Managers Office", ('8', 'A'), "purple"))
true

4. 일치하는 레코드 합치기

Azara의 목록에서 (treasure, coordinate) 쌍을, Rui의 목록에서 (location, coordinate, quadrant) 레코드를 받아, 좌표가 일치하면 (coordinate, location, quadrant, treasure)를 반환하는 create_record() 함수를 구현해요.

좌표가 일치하지 않으면 빈 튜플을 반환해요. 정확하게 비교하려면 좌표 형식을 필요에 따라 다시 맞춰요.

julia> create_record(("Brass Spyglass", "4B"), ("Abandoned Lighthouse", ('4', 'B'), "Blue"))
("4B", "Abandoned Lighthouse", "Blue", "Brass Spyglass")

julia> create_record(("Brass Spyglass", "4B"), ("Seaside Cottages", ('1', 'C'), "Blue"))
()
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Julia Exercism

Tisbury 보물찾기 문제를 시작해 볼 준비가 됐나요?

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