이 블로그는 더 이상 업데이트되지 않습니다.

최신 내용을 확인하시려면 여기를 클릭해주세요.

Programming (77)


프로젝트 오일러 4번

  • 2013/09/13
  • Perl

앞에서부터 읽을 때나 뒤에서부터 읽을 때나 모양이 같은 수를 대칭수(palindrome)라고 부릅니다.
두 자리 수를 곱해 만들 수 있는 대칭수 중 가장 큰 수는 9009 (= 91 × 99) 입니다.
세 자리 수를 곱해 만들 수 있는 가장 큰 대칭수는 얼마입니까?

역시 하나하나 해보면서 가장 큰 녀석을 찾는게 가장 빠른듯.
수학적으로 좀 더 나은 알고리즘을 만들 수는 있겠지만, 거기에 투자하는 시간보다
이게 훨씬 나아보인다.




프로젝트 오일러 3번

  • 2013/09/13
  • Perl

어떤 수를 소수의 곱으로만 나타내는 것을 소인수분해라 하고, 이 소수들을 그 수의 소인수라고 합니다.
예를 들면 13195의 소인수는 5, 7, 13, 29 입니다.
600851475143의 소인수 중에서 가장 큰 수를 구하세요.

제곱근을 나타내기 위해 모듈을 써봤습니다.
사실 0.5제곱이랑 같기 때문에 사용할 이유는 없습니다만, 앞으로 사용하게 될 수많은 모듈을 사용하기에 앞서 워밍업처럼 한번 사용해봤습니다.




프로젝트 오일러 2번

  • 2013/09/13
  • Perl

피보나치 수열의 각 항은 바로 앞의 항 두 개를 더한 것이 됩니다. 1과 2로 시작하는 경우 이 수열은 아래와 같습니다.

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, …

짝수이면서 4백만 이하인 모든 항을 더하면 얼마가 됩니까?

피보나치 수열을 하나씩 구해가면서 짝수일 경우 차례로 더해서 출력한다.
역시 간단한 문제.




프로젝트 오일러 1번

  • 2013/09/13
  • Perl

10보다 작은 자연수 중에서 3 또는 5의 배수는 3, 5, 6, 9 이고, 이것을 모두 더하면 23입니다.
1000보다 작은 자연수 중에서 3 또는 5의 배수를 모두 더하면 얼마일까요?

1부터 999까지의 자연수 중 3 또는 5의 배수를 구하자.
아주 쉬운 문제.




프로젝트 오일러 시작

프로젝트 오일러는 간단히 말해 수학적인 문제들을 프로그래밍으로 해결해 나가는 퀴즈 프로젝트이다.
이 포스트를 작성하는 2013년 9월 13일 현재까지 총 435문제가 등록되어 있으며 문제의 개수는 앞으로 계속해서 늘어날 예정이다.

자세한 정보는 http://projecteuler.net/http://euler.synap.co.kr/에서 확인하자.

사실 영어로 기술된 수학적인 문제들을 해석하는 것이 번거로워 잘 손대지 않고 있었는데, 한국어로 잘 번역된 사이트가 있는 것을 발견하고 풀어보기로 마음먹었다.

모든 문제는 perl로 풀고, 이용 가능한 수학 모듈이 있으면 활용하여 문제를 풀기로 했다.
(perl을 잘 몰라 공부하며 풀 생각이다.)
또한, 풀이 방법이 아닌 단순히 ‘펄을 이용한 문제 해결’에 집중할 예정이다.

따라서 알고리즘적인 성능 향상보다 이미 존재하는 모듈을 사용하여 해결하므로, 다소 맥빠지는 문제풀이가 될 수는 있겠다…




코드에서 생성한 View에 Id 생성하기

안드로이드에서 ListView를 사용하면서 ViewHolder 패턴이란 것을 많이 사용해 봤을 것이다.
(아니라면 [Android] ListView 구현시에 뷰홀더(ViewHolder) 사용하기 를 보자.)

viewHolder 패턴을 사용하면서 하나의 ListView에 서로 다른 구조를 가진 View들을 보여주게 되면, convertView.getId() 메서드를 이용하여 View의 교체 여부를 결정하게 된다.

위와 같은 코드를 사용하면서, 차츰 View.getId() 메서드를 이용해 View를 비교하는 방법을 즐겨 사용하게 되었는데, 그러던 와중에 문제점이 하나 발생했다.

만약 Id를 가져오고자 하는 View가 코드상에서 생성된 View라면, Id가 없다…
따라서 Id를 따로 생성해 주어야 한다.

API Level 17 부터는 View.generateViewId() 메서드를 사용하면 되겠지만, 보통 진저브레드까지 지원하도록 앱을 만드는 나는 사용할 수 없었다.

그럴 때 사용할 수 있는 메서드가 있다.
역시 내가 구현한 코드는 아니지만, 유용해보여 소개한다.

* 참고
http://stackoverflow.com/questions/1714297/android-view-setidint-id-programmatically-how-to-avoid-id-conflicts




ViewPager에서 현재 보고있는 Fragment 알아내기

안드로이드에서 ViewPager를 사용할 때, 현재 보고있는 Fragment를 알아내는 것은 여간 골치아픈 일이 아니다.

Fragment 내에서 OnResume()가 호출되는 순간으로는 올바르게 알아 낼 수 없다.
onPageChangeListener 등을 쓰는 방법도 있겠지만, 아주 간단하게 구현할 수 있는 방법이 있다.

바로 setUserVisibleHint 메소드를 오버라이드 하는 방법이다.
Android Support Library (rev 11) 에서도 사용이 가능하다.

적용하고자 하는 Fragment에서 다음과 같이 사용하자.

* 참고
http://stackoverflow.com/questions/10024739/how-to-determine-when-fragment-becomes-visible-in-viewpager




비트플래그 (Bitflag)

한번에 여러 가지 속성을 동시에 지정할 때, 편리하게 사용 할 수 있는 방법 중에 하나가 비트플래그이다.
간단하게 안드로이드에서 비트플래그를 사용하는 법을 알아보자.
(사실, 자바랑 똑같다)

우선 사용하는 연산자는 다음과 같다.

~A : NOT 연산자 – A의 각 비트가 0이면 1로, 1이면 0으로 바뀐다.
A & B : AND비트 연산자 – 두 비트가 모두 1일 때 1이다.
A | B : OR비트 연산자  – 두 비트가 모두 0일 때 0이다.
A ^ B : XOR비트 연산자  – 두 비트가 모두 달라야 1이다.

아래는 간단한 예제.

http://pastebin.com/9HspchLS




Type Replace “…” with ellipsis character (…, … ?

ADT에서 Type Replace “…” with ellipsis character (…, …) ? 라는 경고가 뜬다.

ctrl + 1을 이용한 빠른 수정으로 수정이 안되는걸 보니 버그인듯.

쉽게 말하면 …을 말줄임표 유니코드로 바꾸라는 말씀.
아래처럼 바꾸면 된다.




3D Filp Animation

간단하게 안드로이드에서 사용할 수 있는 3D Filp Animation 입니다.
제가 작성한 코드는 아니고, 유용해 보여서 소개합니다.

세로축을 중심으로 플립하는 animation인데,
중간에 camera.rotateY(degrees); 를 camera.rotateX(degrees); 로 바꿔주면 가로축을 중심으로 회전합니다.
http://pastebin.com/dP7aVmM9