본문 바로가기

분류 전체보기

(77)
[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..
허프만 코딩 2 - 문자열 압축과 추출 지난 포스팅(https://taeminator1.tistory.com/51)에서 허프만 코딩이 무엇인지 알아보았고, 허프만 코드를 생성하는 방법과 허프만 코드가 "더 짧은 심벌 트릭"에서 적절한 심벌이 될 수 있는 이유에 대해 알아보았다. 이번 시간에는 허프만 코드를 이용해 실제 압축과 추출을 구현하기 위한 전체 과정을 살펴보려고 한다. 크게 "압축"과 "추출" 두 가지 동작에 대해 설명할 것이다. (추가로 동작이 제대로 이루어졌는지 확인하기 위한 "검증"도 필요할 수 있다) 압축: 입력받은 문자열을 압축하여 새로운 문자열을 생성 추출: 입력받은 문자열에서 원래 문자열 추출 전체 과정을 살펴본 다음, 문자열이 주어졌을 때, 각각의 과정의 결과가 어떻게 되는지 설명하려고 한다. 먼저 전체 과정은 다음과 같..
허프만 코딩 1 - 허프만 코드 구하기 허프만 코딩(Huffman Coding)은 이전 포스팅(https://taeminator1.tistory.com/49)에서 언급한 "더 짧은 심벌 트릭(shorter-symbol trick)"의 일종이다. 더 짧은 심벌 트릭은 압축하려는 문자열에서 자주 사용되는 문자일수록 짧은 심벌을 부여하여 압축하는 방법이다. 허프만 코딩은 이러한 심벌을 허프만 코드를 이용해서 압축하는 방법이다. 허프만 코딩의 핵심은 아무래도 허프만 코드를 구하는 것이다. 허프만 코드를 구하는 방법을 살펴보기 전에, "더 짧은 심벌 트릭"에서 "심벌"이 되기 위한 조건을 살펴보자. 다음과 같은 두 가지 조건이 있다. 빈도수가 많을수록 심벌의 자릿수가 적어야 한다 임의의 심벌이 다른 심벌의 첫 부분이 아니어야 한다 먼저 첫 번째 조건은..
인코딩과 UTF-8 트랜지스터는 일종의 스위치이다. 스위치는 off와 on의 두 가지 상태를 나타낼 수 있으며, 이러한 각각의 상태를 0과 1로 치환하여 모으면 이진수로 나타낼 수 있다. 컴퓨터는 자신을 구성하는 트랜지스터를 이용해 이진수로 데이터를 저장한다. 하지만 이진수는 사람이 바로 이해하고 사용하기 힘들기 때문에, 우리가 일반적으로 사용하는 문자들(숫자, 글자, 기호 등)을 컴퓨터가 이해할 수 있는 이진수로 변환하는 작업이 필요하다. 이렇듯 우리가 입력한 문자열을 이진수의 모임으로 변환하는 작업을 인코딩(encoding)이라고 하며, 반대로 이진수의 모임을 문자열로 변환하는 작업을 디코딩(decoding)이라고 한다. 인코딩을 하기 위해서는 각각의 이진수와 문자들을 대응시킨 규칙이 필요하다. 이러한 규칙에는 대표적으..
데이터 압축 압축은 기존의 데이터를 변형하여 더 적은 용량을 갖는 데이터로 만드는 데에 그 목적이 있다. 물론 압축 결과로 생기는 부가 데이터 등으로 인해 데이터의 용량이 늘어나는 경우도 있지만 기본 목적은 데이터 용량을 줄이는 것이다. 이러한 압축은 데이터의 손실 여부에 따라 두 가지로 나눌 수 있다. 압축 후 추출하는 과정에서 데이터 손실이 발생했다면 손실 압축, 그렇지 않다면 무손실 압축이다. 백업 파일을 저장할 때, 때때로 압축 프로그램을 쓴다. 일반적으로 데이터의 용량이 줄어들고 하나의 파일로 묶을 수 있어 데이터 관리나 전송을 용이하게 한다. 이렇게 압축된 데이터를 풀면 압축하기 전 그대로의 데이터를 얻을 수 있다. 무손실 압축이 적용된 것이다. 또 다른 예로 인터넷 사이트에서 동영상을 다운로드할 때, 화..
VoCap 개발 과정 - 앱 개발 1 - 레이아웃 구성 VoCap의 전체 레이아웃 구성은 다음과 같다. 물론 actionSheet와 같은 자잘한 View들도 있지만, 주요 View만 표시를 하였다. 앞서 정리한 주요 기능을 모두 포함할 수 있도록 구성하였다. 하나씩 살펴보면 다음과 같다. HomeView: 앱을 실행하고 Launch Screen이 이후의 처음 화면이다. 다른 View들로 전환이 가능하다. 해당 View는 List로 이루어져 스크롤을 통해 단어장 목록을 볼 수 있다. .sheet를 통해 단어장을 추가/편집할 수 있는 NoteModifierView로 이동 NavigationLink를 통해 단어장 내부인 NoteDetailView로 이동 .sheet를 통해 설정창으로 이동 NoteModifierView: 단어장을 새로 만들거나, 기존 단어장을 수정..
VoCap 개발 과정 - 컨셉 결정 및 시장 조사 개발 과정을 설명하기 앞서 VoCap이 어떤 앱인지 소개하는 것이 좋을 것 같다. VoCap은 어휘라는 의미의 VoCabulary와 짱이라는 의미의 Cap 또는 Captain을 합친 이름이다. 참고로 한국어의 부제는 암기왕이다. 어휘 관련 앱에서 최고가 되겠다는 포부를 담았다(하지만 현실은 냉혹했다). VoCap의 가장 큰 가치는 쉬운 사용에 있다. 다시 말해 단어를 외우고자 하는 사용자가 단어를 간단하게 추가하고 쉽게 외우는 걸 목표로 만들었다. 자세한 설명은 앱스토어(apps.apple.com/kr/app/vocap/id1559011042?l=ko)를 참고하면 되겠다. 이번 포스팅의 주제가 "컨셉 결정 및 시장 조사"인데, 모든 단계가 그렇지만 해당 두 단계도 완벽히 구분 지어지는 것은 아니다. 어느..