트랙
/
Crystal
Crystal
/
연습 문제
/
루턴의 도서관
루턴의 도서관

루턴의 도서관

학습 연습 문제

소개

Char는 Crystal에서 32비트 유니코드 코드 포인트를 나타내는 데이터 타입이에요. 이 크기 덕분에 메모리를 효율적으로 사용할 수 있고, 문자열에는 없는 고유한 특성도 가지고 있어요. 작은따옴표(')로 만들며, 안에는 유니코드 코드 포인트 하나만 넣을 수 있어요.

'a' # => 'a'
'a'.class # => Char

Crystal에서 문자열을 다룰 때 Char를 함께 다루는 일은 아주 흔해요. 문자열 클래스에는 Char를 반환하거나 Char를 인자로 받는 메서드가 꽤 많기 때문이에요. 예를 들어 String#[] 메서드는 Char를 반환하고, String#chars 메서드는 Char 컬렉션을 반환해요.

증가 / 감소

Char는 32비트 유니코드 코드 포인트이기 때문에 증가와 감소를 지원해요. 덕분에 'a'가 있을 때 1을 더하면 'b'를 얻을 수 있어요.

'a' + 5
# => 'f'

'z' - 25
# => 'a'

유니코드 표에서 다음 문자를 반환하는 Char#succ 메서드와, 이전 문자를 반환하는 Char#pred 메서드도 있어요.

'a'.succ
# => 'b'

'z'.pred
# => 'y'

연결

Char는 32비트 유니코드 코드 포인트 하나만 나타내도록 만들어졌기 때문에 Char 두 개를 서로 연결할 수 없어요. 따라서 Char는 문자열과만 연결할 수 있어요.

'a' + "bc"
# => "abc"

'a' + 'b'
# => error: expected argument #1 to 'Char#+' to be Int or String, not Char

속성 메서드

Crystal에는 문자가 숫자인지 글자인지, 대문자인지 소문자인지 같은 정보를 알아낼 수 있는 메서드가 몇 가지 있어요. 다음은 그중 일부예요. 전체 목록은 Char API에서 확인할 수 있어요.

메서드 설명
Char#number? Char가 숫자면 true를 반환해요
Char#letter? Char가 글자면 true를 반환해요
Char#lowercase? Char가 소문자면 true를 반환해요
Char#uppercase? Char가 대문자면 true를 반환해요
Char#ascii? Char가 ASCII 문자면 true를 반환해요
Char#whitespace? Char가 공백 문자면 true를 반환해요

변환

코드 포인트와 Char 사이의 변환

Char는 32비트 유니코드 코드 포인트이기 때문에 Char와 코드 포인트(정수) 사이를 변환할 수 있어요. Char#ord 메서드로 Char의 코드 포인트를 얻거나, Int#chr 메서드로 코드 포인트에 해당하는 Char를 얻을 수 있어요.

'a'.ord
# => 97

97.chr
# => 'a'

타입 사이의 변환

다른 데이터 타입과 마찬가지로 Char에도 타입을 변환하는 메서드가 몇 가지 있어요. 가장 흔히 쓰는 건 Char를 문자열로 변환하는 Char#to_s 메서드예요. 그 밖에도 Char를 정수로 변환하는 Char#to_i 메서드와 Char를 실수로 변환하는 Char#to_f 메서드가 있어요.

'a'.to_s
# => "a"

'4'.to_i
# => 4

'a'.to_i
# => Error: Invalid integer: a (ArgumentError)

지침

루턴의 도서관은 책부터 예술 작품까지 다양한 문학 작품을 소장한 큰 도서관이에요. 도서관에는 문학을 연구하고 컴퓨터 시스템에 책을 등록하는 부서가 있어요.

일부 업무는 자동화를 목표로 하고 있어서, 여러분에게 도움을 요청했어요. 여기에는 도서 등록 양식 자동화부터 암호화된 텍스트 해독까지 다양한 작업이 포함돼요.

1. 제목의 첫 글자 가져오기

도서관의 책은 찾기 쉬워야 하므로 제목의 첫 글자를 기준으로 정렬돼요.

도서의 제목을 담은 인자 title을 받는 Library.first_letter 메서드를 구현해요. 이 메서드는 제목의 첫 글자를 반환해야 해요.

Library.first_letter("Mystery of the Crystal Skull")
# => 'M'

2. 저자의 이니셜 가져오기

도서관에는 다양한 저자가 쓴 책이 아주 많아요. 저자는 흔히 이니셜로 불리기 때문에, 도서관은 저자의 이름과 성을 입력하면 이니셜을 알려주는 시스템을 요청했어요. 이니셜은 {first_letter_of_first_name}.{first_letter_of_last_name} 형식으로 만들어야 해요.

저자의 이름과 성을 담은 두 인자 first_name과 last_name을 받는 Library.initials 메서드를 구현해요. 이 메서드는 저자의 이니셜을 반환해야 해요.

Library.initials("William", "Shakespeare")
# => "W.S"

3. 글자 복호화하기

일부 문학 작품은 암호화되어 있고, 도서관에는 암호화된 텍스트가 많아요. 도서관은 특별한 암호화 방식에 대응하는 새로운 복호화 시스템을 원해요.

이 암호화는 글자를 알파벳에서 그 앞에 오는 글자로 바꾸는 방식으로 동작해요. 예를 들어 a는 z가 되고, b는 a가 되고, c는 b가 되는 식이에요.

도서관은 대문자와 소문자를 모두 복호화하면서 원래 글자의 대소문자를 그대로 유지하기를 원해요.

복호화할 글자를 담은 인자 character를 받는 Library.decrypt_character 메서드를 구현해요. 이 메서드는 복호화된 글자를 반환해야 해요.

Library.decrypt_character('a')
# => 'z'

4. 텍스트 복호화하기

도서관은 알파벳에서 앞 글자를 취하는 이 암호화 방식으로 텍스트 전체를 복호화하는 것도 원해요.

복호화기는 글자만 복호화하고 다른 모든 문자는 그대로 둬야 해요.

복호화할 텍스트를 담은 인자 text를 받는 Library.decrypt_text 메서드를 구현해요. 이 메서드는 복호화된 텍스트를 반환해야 해요.

Library.decrypt_text("Ifmmp Xpsme!")
# => "Hello World!"
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Crystal Exercism

루턴의 도서관 문제를 시작해 볼 준비가 됐나요?

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