콘텐츠로 건너뛰기
Home » 21세기소년 » Page 8

21세기소년

21세기소년 / IT / 정보기술 / 인터넷 / 프로그래밍 / 미래 / 과학 / 과학지식 / 물리 / 화학 / 천문 / 생물학 / 이과생이나 관심가질 법한 자질구레한 이야기들

정수 배열의 최대 부분합 (연습문제)

배열의 연속된 부분집합의 최대합 정수 배열이 주어질 때 배열내의 연속된 원소를 더한 부분합의 최대값을 구하는 문제이다. 구간이 아닌 최대값 자체를 구하면 되는 문제이다. 간단히 생각하면 0부터 1, 2, 3 … n 까지의 합 중 최대인 값, 그 다음은 1부터 2, 3, 4 .. n 까지의 값 중 최대인값 이렇게 비교해나갈 수 있는데 그러면 반복계산이 너무 많다. 따라서 DP를 이용한다. 0번 인덱스까지의 최대합은 0번 값 그 자체이다. i번 인덱스까지의 최대 부분합은, (i-1) 번 까지의 최대 부분합과 i번 값의 합이다. 이 때… 더 보기 »정수 배열의 최대 부분합 (연습문제)

자바스크립트 배열의 정렬

javascrip는 개인적으로 참 마음에 안드는 부분이 많은데, 그 중에서도 배열의 sort() 메소드는 좀 좌절스러운 것이… a = [0 to 10].map -> parseInt Math.random! * 100 # [ 74, 7, 45, 41, 43, 85, 84, 66, 41, 91 ] a.sort! # [ 41, 41, 43, 45, 66, 7, 74, 84, 85, 91 ] 숫자로 된 배열을 정렬할 때도 사전식으로 비교해서 어이없는 결과를 만들어낸다…. sort() 메소드는 비교 함수를 받긴하므로, 정수 크기별로 비교하려면, 다음과 같이 각 값을 정수형으로 계산한 결과를 던져주는 비교함수를 넣어준다.… 더 보기 »자바스크립트 배열의 정렬

Vim – 사용자 정의 명령을 만드는 방법

vim의 명령모드에서 입력하여 실행하는 명령들을 “Ex명령”이라고 한다. 주로 :가 앞에 붙는 명령들이 여기에 해당하며, vimscript 함수와는 별개로 작동한다. (vimscript 함수들은 엄밀히 말해 :call 명령의 인자로 전달받는 값이 되는 것이다.)

:command 명령을 사용하면 사용자가 직접 원하는 동작을 수행하는 명령을 새로 정의하여 사용할 수 있다. 간단한 예로 다음 명령은 vim 파일을 편집할 때, 현재 파일을 저장하고 vim 스크립트를 로드하는 사용자 정의 Ex명령을 생성한다.

더 보기 »Vim – 사용자 정의 명령을 만드는 방법

(연습문제) 리사의 워크북 문제

Lisa의 워크북 문제 https://www.hackerrank.com/challenges/bear-and-workbook n개의 챕터가 있는 워크북이 있고, 이 워크북의 매 페이지는 k 개 문제를 담을 수 있다. 이후에 n 개의 정수를 받는데 이는 각 챕터의 문제 수이다. 각 챕터의 문제는 1번 부터 시작하며, 새로운 챕터는 새 페이지에서 시작한다. 이 때, 문제번호와 페이지번호(1번부터 시작)가 같은 문제를 특별한 문제라고 할 때, 주어진 데이터 내에서 특별한 문제의 개수를 구하라는 내용이다. 풀이 이 문제는 하스켈에서 의외로 쉽게 풀린다. 다음과 같은 순서로 풀어보자. 숫자 x 를 받았을 때, [[1,2,3], [4,5,6], [7]] 과 같이… 더 보기 »(연습문제) 리사의 워크북 문제

UIDynamics 예제

예전에 관련된 내용을 작성한 적이 있는데, 여기서는 내용과 예제를 좀 더 보강한 버전이다. 또한 해당 예제들은 모두 Swift3 버전으로 작성되었다.

UIDynamicAnimator

다이내믹 애니메이터는 물리연산과 관련된 계산이나 애니메이션을 다이내믹 아이템에 적용하고, 그 결과로 계산된 애니메이션 컨텍스트를 제공한다.
더 보기 »UIDynamics 예제

추상클래스

추상클래스

추상클래스(abstract class)는 OOP 언어의 특징 중 하나로, 클래스가 무엇인가 하는 점과 그것이 어떻게 구현되는가 하는 지점의 경계에 있는 개념이다. 이 타입의 메소드는 실제 메소드 및 추상 메소드를 포함한다. 추상 클래스는 인스턴스화 될 수 없으며, 인스턴스를 만들고 싶다면 해당 클래스를 상속받는 서브 클래스를 만들어서 인스턴스화해야 한다.
더 보기 »추상클래스

(연습문제) 대소문자변환

연습문제 : 대소문자 변환하기 입력받은 문자열의 대소문자를 반전하여 출력하는 프로그램을 작성하시오. 입력받은 각 글자의 문자 코드가 ‘a’ … ‘z’ 사이에 있으면 소문자, ‘A’~’Z’ 사이에 있으면 대문자이다. 그리고 그 변환은 해당 코드값에 a – A를 더하거나 빼주면 된다. 먼저 대소문자의 범위를 찾아보자. print("azAZ".utf8.map(Int.init)) //=> [97, 122, 65, 90] 즉 문자 코드가 97~122 구간에 있으면 소문자, 65~90 구간에 있으면 대문자이다. 소문자->대문자 변환은 32를 빼고, 반대의 변환은 32를 더한다. 문자 코드 값으로 다시 문자를 만드는 방법은 다음과 같다. 문자열은 [Character] 타입으로 만들 수… 더 보기 »(연습문제) 대소문자변환

꼬리재귀 최적화와 트램폴린

꼬리재귀 최적화

꼬리재귀는 재귀의 특별한 한 형태인데, 재귀호출로 받은 결과값을 추가로 계산하거나 처리하지 않고 그대로 리턴하는 형태를 말한다. 예를 들어 1부터 n 까지의 합을 구하는 함수를 재귀로 구현했다고 하면 일반적으로 다음과 같은 꼴을 생각할 수 있다.

<br />func sum1(n: Int) -> Int {
  if n < 1 { return 0 }
  return n + sum1(n - 1)
}

이를 꼬리 재귀로 만들면 다음과 같다.

func sum2(n: Int, acc: Int = 0) -> Int {
  if n < 1 { return acc }
  return sum2(n-1, acc: acc + n)
}

더 보기 »꼬리재귀 최적화와 트램폴린

하스켈에서 조합 구현하기

하스켈 연습문제 주어진 리스트에서 중복되지 않은 모든 부분집합을 만들어라. 주어진 리스트에서 n 개를 비복원추출한 조합은 다음과 같이 만든다. combinations :: Int -> [a] -> [[a]] combinations 0 _ = [[]] combinations n xs = [ xs !! i : x | i <- [0..(length xs)-1], x <- combinations (n-1) (drop (i+1) xs)] > combinations 2 [1..4] [[1,2],[1,3],[1,4],[2,3],[2,4],[3,4]] n 개짜리 원소의 리스트의 모든 부분집합은 따라서 다음과 같이 구한다. combinationAll xs = concatMap (\n -> combinations n xs) [0..length xs] tails 함수를… 더 보기 »하스켈에서 조합 구현하기