트랙
/
Crystal
Crystal
/
연습 문제
/
파티 로봇
파티 로봇

파티 로봇

학습 연습 문제

소개

Crystal에는 텍스트를 나타내는 데 사용하는 String이라는 타입이 있어요. Crystal의 문자열은 유니코드 문자의 시퀀스예요. 문자열은 불변이에요. 즉, 한 번 만들면 바꿀 수 없어요. 그래서 문자열을 수정할 때마다 새로운 문자열이 만들어지고, 원본 문자열은 수정되지 않아요.

문자열을 정의할 때는 큰따옴표 "를 사용해요.

"Hello World"

연결

두 문자열을 연결하려면 + 연산자를 사용해요. + 연산자는 두 문자열을 합친 새로운 문자열을 반환해요.

hello = "Hello"
hello + " World"
# => "Hello World"

문자열과 숫자 사이의 변환

to_i 메서드는 문자열을 정수로 변환해요. 또는 to_f 메서드로 실수를 반환받을 수도 있어요. 문자열을 숫자로 변환할 수 없으면 ArgumentError가 발생해요.

"1".to_i
# => 1

"1.0".to_f
# => 1.0

"Hello".to_i
# => ArgumentError: Invalid integer: Hello

정수나 실수는 to_s 메서드로 문자열로 변환할 수 있어요.

1.to_s
# => "1"

1.0.to_s
# => "1.0"

보간

보간은 문자열을 합치고 문자열 안에 표현식을 넣는 편리한 방법이에요. 문자열을 보간하려면 # 문자 뒤에 중괄호 {}를 쓰고, 중괄호 안에 표현식을 넣어요.

name = "World"
"Hello #{name}!"
# => "Hello World!"

Crystal은 표현식의 결과를 자동으로 문자열로 변환해요.

"Hello #{1 + 1}!"
# => "Hello 2!"

크기

문자열의 문자 수를 알아야 할 때는 size 메서드를 사용할 수 있는데, 이 메서드는 문자열의 길이를 정수로 반환해요. 문자열의 크기는 문자열에 저장된 속성이기 때문에, 메서드를 호출할 때마다 크기를 계산할 필요가 없어서 아주 빨라요.

"Hello World".size
# => 11

인덱싱

인덱싱은 문자열에서 특정 문자를 가져오고 싶을 때 사용해요. String에서 문자를 가져오려면 익숙한 대괄호 표기법을 사용할 수 있어요.

Note

[]는 String 인스턴스 메서드로 구현되어 있고, 인덱스가 이 메서드의 인자예요.

문자열의 첫 번째 문자는 인덱스 0에 있어요.

"Hello World"[0]
# => 'H'

"Hello World"[6]
# => 'W'

문자열의 끝에서 문자를 가져오려면, 문자열의 길이에서 1을 빼서 마지막 문자의 인덱스를 구할 수 있어요. 끝에서 두 번째 문자는 문자열의 길이에서 2를 빼면 되고, 이런 식이에요. 이걸 더 간단히 하는 방법도 있는데, 바로 음수 인덱스를 쓰는 거예요. 마지막 문자가 인덱스 -1이고, 끝에서 두 번째 문자가 인덱스 -2인 식이에요.

name = "Hello World"
name[name.size - 1]
# => 'd'

name[-1]
# => 'd'

이스케이프

어떤 문자는 문자열에 그대로 쓸 수 없어서 이스케이프 시퀀스를 사용해야 해요. 예를 들어 문자열 안에서 큰따옴표를 쓰고 싶다면, 큰따옴표를 이스케이프해야 해요. \ 문자 뒤에 이스케이프할 문자를 붙여서 이스케이프 시퀀스를 쓸 수 있어요.

Crystal의 특수 문자는 다음과 같아요:

값 설명
\a 경고음
\b 백스페이스
\e 이스케이프
\f 폼 피드
\n 줄 바꿈(새 줄)
\r 캐리지 리턴
\t 가로 탭
\v 세로 탭
\\ 역슬래시
\' 작은따옴표
\" 큰따옴표
\377 8진수 ASCII 문자
\xFF 16진수 ASCII 문자
\uFFFF 16진수 유니코드 문자
puts "Hello \"World\""
# => Hello "World"

puts "Hello \nWorld"
# => Hello
# => World

여러 줄 문자열

여러 줄 문자열을 쓰려면 한 줄 문자열과 같은 문법을 사용하되, 문자열에 넣고 싶은 각 줄마다 줄을 바꿔 주면 돼요.

"Hello
World"
# => "Hello\nWorld"

지침

옛날에 창문에 창살이 달린 이상한 집에 사는 별난 프로그래머가 있었어요. 어느 날 그는 온라인 구인 게시판에서 파티 로봇을 만드는 일을 맡았어요. 이 로봇은 사람들을 맞이하고 자리로 안내해야 해요. 첫 번째 버전은 매우 기술적이어서 프로그래머가 인간적인 상호작용에 서툴다는 점이 그대로 드러났어요. 그중 일부는 다음 버전에도 그대로 남았어요.

1. 파티에 온 새 손님을 맞이해요

주어진 이름으로 환영 메시지를 반환하는 welcome 메서드를 구현해요:

PartyRobot.welcome("Christiane")
# => Welcome to my party, Christiane!

2. 오늘이 생일인 새 손님을 맞이해요

주어진 이름과 나이로 생일 메시지를 반환하는 happy_birthday 메서드를 구현해요. 아쉽게도 프로그래머가 허풍을 좀 떠는 편이라, 로봇은 모든 손님의 생일을 알고 있다는 걸 꼭 보여줘야 해요.

PartyRobot.happy_birthday("Frank", 58)
# => Happy birthday Frank! You are now 58 years old!

3. 길을 안내해요

길을 안내하는 assign_table 함수를 구현해요. 이 함수는 매개변수 5개를 받아요.

  • 맞이할 새 손님의 이름 (String)
  • 테이블 번호 (Int)
  • 옆자리 사람의 이름 (String)
  • 테이블이 있는 방향 (String)
  • 테이블까지의 거리 (Float64)

정확한 결과 형식은 아래 예시에서 볼 수 있어요.

옆자리 사람의 이름은 이름의 첫 글자와 마지막 글자로 줄여야 해요. Frank는 Fk, Christian은 Cn 이런 식이에요.

로봇은 테이블 번호를 알려줘요. 테이블까지의 거리도 알려주는데, 다행히도 정밀도는 소수점 한 자리로 제한돼요.

PartyRobot.assign_table("Christiane", "on the left", 27, 23.7834298, "Frank")
# =>
# Welcome to my party, Christiane!
# You have been assigned to table 27. Your table is on the left, exactly 23.8 meters from here.
# You will be sitting next to Fk.
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Crystal Exercism

파티 로봇 문제를 시작해 볼 준비가 됐나요?

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