본문 바로가기

Computer Science/알고리즘

(13)
[Swift]세탁 횟수 같게 만들기 2 - 모든 속옷의 세탁 횟수 같게 만들기 지난 시간에 세탁 횟수에 영향을 미치는 요인 중, 2번 "입을 속옷을 선택하는 방법"에 대해 생각해 보았다. 그 결과, 세탁된 속옷을 서랍에 넣기 전에 임시 바구니를 거치도록 하여 모든 속옷이 사용되게 하였다. 이를 추가한 세탁 라이프는 다음과 같다. 이번엔 5 단계의 반복으로 표현된다. 사용자가 그날 속옷을 입기로 하였다면 서랍에서 속옷을 꺼내 입는다. 서랍이 비었다면 건조대에서 서랍으로 속옷을 옮긴다. 속옷을 사용하고 난 뒤 세탁 바구니에 넣는다. 세탁하는 날이 되면 세탁 바구니에 있는 속옷을 세탁한다. 건조가 다 된 속옷을 건조대에 그대로 둔다. 이제 세탁 횟수에 영향을 미치는 요인 중, 1번 "일정하지 않은 세탁물의 양"을 살펴보자. 세탁물의 양이 일정하지 않게 되는 현상은 사용자가 그날 속옷을 ..
[Swift]세탁 횟수 같게 만들기 1 - 안 쓰는 속옷 없게 만들기 이전 포스팅(https://taeminator1.tistory.com/70)에서 살펴봤듯이, 일반적으로 속옷을 세탁할 때, 시간이 지나면 각각의 속옷의 세탁 횟수가 달라진다. 이번 시간에는 이러한 문제를 해결할 수 있는 방법을 살펴보려고 한다. 세탁 횟수에 영향을 미치는 요인을 두 가지로 정리한 적이 있다. 일정하지 않은 세탁물의 양 입을 속옷을 선택하는 방법 따라서 위에 두 요인에 대한 해결책을 제시한 후에, 시뮬레이션으로 구현하여 결과를 확인해 보려고 한다. 그전에 속옷을 입고 세탁하는 등의 과정을 아래와 같이 정리해보았다. 사실 이전 포스팅에서 다 말한 내용이다. 세탁 라이프는 다음과 같이 4단계의 반복으로 표현 가능하다. 사용자 그날 속옷을 입기로 하였다면 서랍에서 속옷을 꺼내 입는다. 속옷을 사..
[Swift]세탁 횟수 문제 구현 2 이전 포스팅에 이어, normalLaundrySimulator의 반복문 내에 들어갈 동작을 구현해 보자. 먼저 가장 안쪽 반복문 부분((1)에 해당)을 정의를 할 텐데, 해당 반복문은 이전 세탁과 다음 세탁 사이의 날들에 대한 부분이다. 다시 말해 그날그날 속옷을 입을지 결정하고, 다 입은 속옷을 세탁바구니에 넣는 작업까지 하게 된다. 어떤 날, 속옷을 입을지 말지는 확률에 의해 정해지도록 설계하였다. 그리고 이러한 확률이 매개변수로 전달되도록 지난 포스팅에서 함수의 정의 부분을 설명한 바 있다. 이러한 확률과 Swift가 제공하는 random 함수를 사용하여 그날그날 속옷을 입을지 말지 결정하였다. let isPossible: Bool = { Double.random(in: 0.0 ..< 1.0) < ..
[Swift]세탁 횟수 문제 구현 1 지난 포스팅에서 세탁 횟수에 영향을 미치는 요인을 두 가지로 정리했다. 일정하지 않은 세탁물의 양 입을 속옷을 선택하는 방법 이번 포스팅에서는 해당 요인이 세탁 횟수에 얼마나 영향을 주는지 알아보기 위해 시뮬레이션을 작성하여 살펴볼 것이다. 먼저 세탁물에 대한 클래스인 Stuff를 정의하자. 해당 클래스에서 생성된 인스턴스(속옷)가 다른 영역에서도 같은 객체로서 참조하길 원하기 때문에 클래스로 정의하였다. // Stuff.swift class Stuff { static var sPreference: Int = 0 // Whenever create a instance, add unique ID. private(set) var preference: Int = 0 private(set) var washedNu..
세탁 횟수 문제 민망하지만 나는 대학교에 입학하고 나의 옷을 스스로 세탁했다. 그래도 벌써 8년이 넘었다. 일주일에 한 번 정도 세탁을 하니까, 8년이면 약 400번(8 *365 / 7) 정도의 세탁을 하는 셈이 된다. 세탁물의 종류는 다양하다. 속옷(양말, 팬티 민소매 등)과 같이 한 번 입고 바로 세탁해야 하는 옷들도 있고, 집에서 세탁하기에는 민감한 옷들도 있다. 그리고 계절이나 날씨와 같은 환경적인 요소가 옷의 세탁을 결정하기도 한다. 이번 포스팅에서는 속옷과 같이 한 번 입고 세탁해야 하는 옷들에 대해 이야기해보려고 한다. 세탁된 속옷을 다시 입을 때면 종종 다음과 같은 의문이 들곤 한다. (사실 매우 자주 든다) “이 팬티는 산지 얼마 안 된 거 같은데 왜 이렇게 낡았지??” “이 양말의 짝은 분명 얘인데, ..
[Swift]허프만 코딩 구현 3 - 검증 검증하기 전에 압축과 추출에서 구현한 다양한 동작들을 구조체로 묶어보자. Compressor와 Extractor 구조체를 생성하였다. 코드는 지난 시간에 전부 구현을 하였기 때문에 클래스 다이어그램만 제시하고 따로 구현은 필요 없어 보인다. 몇 가지 특성은 다음과 같다. 두 구조체 모두 input을 속성으로 갖는데, 해당 속성은 입력받은 데이터를 의미한다. pNumber는 지난 시간과 동일하게 이진 문자열을 쪼개는 개수이다. ASCII가 7bit의 이진수를 나타내므로 기본값은 7이다. Compressor 구조체의 makeHuffmanCodes()는 허프만 코드를 반환하는데, 이전에 설명한 바와 같이, 허프만 코드는 구할 때마다 값이 다를 수 있어 private으로 선언해 다른 곳에서의 사용을 방지하였다...
[Swift]허프만 코딩 구현 2 - 문자열 추출 이전 포스팅에서 Swift를 이용해 문자열 압축한 데에 이어 이번에는 문자열 추출을 구현하려고 한다. 지난 포스팅의 마지막에 얻은 데이터의 형식은 다음과 같다. 문자열 형식으로 나타내었으며, 가독성을 위해 줄 바꿈 문자 뒤에는 실제로 줄 바꿈을 해주었다. "허프만 코드의 개수"\n "허프만 코드"\n "원래 문자열의 길이"\n "압축된 문자열"\n 이제 해당 문자열을 가지고 원래 문자열을 추출해 보자. [A-a. 허프만 코드의 개수를 이용해 허프만 코드 반환] 먼저 허프만 코드의 개수를 구해야 한다. 문자열에서 해당 값은 가장 첫 문자열이다. 각각의 문자열은 줄 바꿈으로 구분되어 있기 때문에, 줄 바꿈 전까지의 문자열을 읽어 해당 문자열을 숫자로 바꿔주면 된다. 이러한 방식은 원래 문자열의 길이를 반환할..
[Swift] 허프만 코딩 구현 1 - 문자열 압축 Swift로 허프만 코드를 이용해 문자열을 압축하고 추출해 보려고 한다. 이번 포스팅에서는 문자열 압축을, 다음 포스팅에서는 문자열 추출을 구현하도록 하겠다. 지난 시간에 살펴본 허프만 코드를 이용한 문자열 압축 및 출력 과정을 순서대로 구현해 보려고 한다. (압축 및 추출에 대한 전체 과정은 다음 링크 참고 https://taeminator1.tistory.com/52) 먼저 유용한 extension을 하나 추가하자. String에 대해 subscript를 통해 하나의 문자로 반환하거나, 범위 연산자를 통해 부분 문자열로 반환하는 확장이다. extension String { var length: Int { return count } subscript (i: Int) -> String { return s..