트랙
/
Pharo
Pharo
/
연습 문제
/
문자열 뒤집기
문자열 뒤집기

문자열 뒤집기

쉬움

소개

문자열을 뒤집는 것, 그러니까 왼쪽에서 오른쪽이 아니라 오른쪽에서 왼쪽으로 읽는 것은 프로그래밍에서 의외로 흔한 작업이에요.

예를 들어 생물정보학에서는 DNA나 RNA 문자열의 서열을 뒤집는 일이 상보적인 가닥을 찾거나 생물학적 의미가 있는 회문 서열을 확인하는 등 여러 분석에서 중요한 경우가 많아요.

지침

이번 과제는 주어진 문자열을 뒤집는 거예요.

몇 가지 예시를 볼까요?

  • "stressed"를 "desserts"으로 바꿔요.
  • "strops"를 "sports"으로 바꿔요.
  • "racecar"를 "racecar"로 바꿔요.

문자열에는 #reversed와 #reverseDo: 메서드가 있지만, 더 낮은 수준의 문자 반복과 스트림을 사용해서 직접 해결할 수 있을까요?

코드를 살펴보는 데 도움이 되도록, Pharo에는 멋진 코드 찾기 도구가 있어요. Shift-Enter를 눌러 활성화해요.

참고: Exercism의 관례에 따라 풀이의 이름을 ReverseString이라고 지었지만, 더 Smalltalk다운 이름은 StringReverser예요.

Smalltalk과 문자열

문자열과 관련해서는 주석에 큰따옴표를 쓰고, 문자열에 작은따옴표를 쓰며, 문자에는 특별한 문법을 쓰는 것(예: 문자 “x”는 $x)처럼 처음 읽을 때 헷갈릴 만한, 뻔하지만 중요한 세부 사항이 몇 가지 있어요. 다른 언어에서 쓰는 관례와 다르기 때문이에요.

메모리 전체에서 유일한 문자열을 뜻하는 심볼이라는 개념도 있어요. 즉, 심볼이 만들어질 때(보통 컴파일 시점에) 메모리를 검색해서 똑같은 것이 이미 있는지 확인하고, 원래 있던 것만 사용해요. 그 이유는 메모리를 아끼기 위해서만이 아니라, 심볼을 비교할 때 속도가 크게 빨라지기 때문이에요.

"this is a comment"
'this is a string'
#'this is a symbol'
#thisIsASymbolToo

Smalltalk 프로그램에는 쉼표도 거의 없어요. 쉼표가 문법적인 역할을 하지 않기 때문이에요. 그래서 예를 들어 배열 리터럴에는 쉼표가 없어요. 예를 들면 #(1 2 3 4 5) 같아요. 하지만 쉼표 자체가 연산자라서, 두 문자열을 이어 붙일 때는 쉼표를 보게 될 거예요. 예를 들면 'string1', 'string2' 처럼요.

마지막으로, 문자열과 문자가 서로 다른 클래스라는 점을 알아두면 좋아요. 문자열은 문자의 모음이에요. 문자열을 반복할 때 문자열을 기대하는 메서드에 문자를 넘겨 버릴 수 있어서 방심하다가 당할 수 있어요. 다음을 봐요...

(('hello' at: 2) = $e) inspect.
(('hello' at: 2) = 'e') inspect.

Smalltalk과 스트림

스트림은 순차적인 읽기와 쓰기에 유용해요. 인덱스를 증가시킬 필요를 없애서 코드를 더 깔끔하게 만들어 줘요. 스트림은 어떤 컬렉션에서도 동작해요.

stream := WriteStream on: String new.
stream nextPut: $h ; nextPutAll: 'ell' ; nextPut: $o.
stream contents inspect
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Pharo Exercism

문자열 뒤집기 문제를 시작해 볼 준비가 됐나요?

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

문자열 뒤집기 깊이 살펴보기!

문자열을 뒤집는 14가지 서로 다른 방법을 살펴보며, 유니코드 코드 포인트, 그래핌, 스택과 힙 할당, 포인터 등 다양한 주제를 탐구해요. 편안히 앉아 Jeremy와 Erik과 함께 45분간 즐겁게 배워봐요.