시간제한 : 10초

설명
알프레드는 앞으로 어떤 요리를 할 지 계획을 세우려고 한다. 그는 다양한 요리를 할 수 있는데, 각 요리를 하는 데 드는 비용과 그 요리를 통해 얻는 만족도는 정해져 있다. 그가 만약 어떤 요리를 첫 번째로 한다면, 그는 그 요리가 주는 만족도 만큼의 만족을 얻을 수 있다. 하지만 그가 같은 요리를 다음날에 또 한다면, 그는 그 요리가 주는 만족도 * 0.5 만큼의 만족밖에 얻지 못하며, 3번째나 그 이후는 같은 요리를 하면 전혀 만족을 얻지 못한다.
예를 들어, 만족도가 v인 요리를 3일간 하면, 그는 1.5*v만큼의 만족을 얻는다.

입력 설명
입력은 여러 개의 테스트 케이스로 이루어질 수 있다. 각 테스트 케이스는 3개의 정수(요리 계획을 세울 날의 수 k(1<=k<=21), 알프레드가 할 수 있는 요리의 수 n(1<=n<=50), 알프레드가 가진 돈 m(1<=m<=100))를 포함하는 한 줄로 시작한다. 이후에 오는 n개의 줄에는 알프레드가 할 수 있는 요리에 대한 정보가 나열된다. 각 줄에는 요리를 하는 데 드는 비용 c(1<=c<=50), 요리를 통해 얻을 수 있는 만족 v(1<=v<=10,000)이 주어진다. k=n=m=0일 때 입력을 종료한다.

출력 설명
각 테스트 케이스에 대해 얻을 수 있는 최대의 만족을 소수점 한 자리까지 출력한다. 그 다음에는 k개의 정수를 출력한다. 이는 각 날에 어떤 요리를 할 것인지에 대한 정보이다. 요리는 1부터 n까지 번호를 붙인다. 같은 만족을 얻을 수 있는 계획이 여러 개 존재할 경우, 그 중 가장 가격이 적은 것을 출력하며, 가격이 모두 같을 경우 아무 것이나 출력해도 된다. 어떠한 방법으로도 주어진 돈 이내에서 계획을 짤 수 없는 경우, 0을 출력한다. 각 정수 사이에는 공백이나 개행 문자를 출력한다.

입력 예제
2 1 5
3 5
3 5 20
2 5
18 6
1 1
3 3
2 3
0 0 0

출력 예제
0.0
13.0
1 5 1




2008년 1월 19일 이후 작성된 모든 글에 대해서 퍼가는 것을 금지합니다.
퍼가고자 하시는 분은 링크를 달아 주시기 바랍니다.
Posted by Harry

설명
탁자 위에, n개의 사과가 있다. i번째의 사과는 k+i의 무게를 가진다(1<=i<=n). 딱 하나의 사과만이 맛있고, 그보다 가벼운 사과들은 모두 쓰고, 그보다 무거운 사과들은 모두 시다. 거인은 어떤 사과가 맛있는지 알기 위해, 사과를 먹어보는 수밖에 없다. 그는 쓴 사과와 신 사과를 싫어한다. 그는 어떻게 해야 할까?

예를 들어, n=4, k=0일 때, 사과들의 무게는 각각 1, 2, 3, 4이다. 만약 거인이 사과#2를 먹는다면,
#2가 맛있으면 답은 #2이다.
#2가 시면 답은 #1이다.
#2가 쓰면 답은 #3이나 #4가 될 테고, 그는 #3을 먹어보고 답을 알게 될 것이다.
불쌍한 거인은 맛있는 사과가 무엇인지 알기 위해서 맛없는 사과들을 먹을 각오를 해야 한다. 모든 경우에 거인이 먹어야 되는 총 사과의 무게를 계산해주자.

위의 방법에 의하면,
#1이 맛있을 경우 : 2
#2가 맛있을 경우 : 2
#3이 맛있을 경우 : 2 + 3 = 5
#4가 맛있을 경우 : 2 + 3 = 5
고로 총 무게의 합은 2 + 2 + (2 + 3) + (2 + 3) = 14이다.

하지만 위의 방법은 최적이 아니다. 그가 사과#1을 먼저 먹어본다면, 그는 각 경우에 1, 3, 3, 3의 무게의 사과를 먹어야 하고, 총합은 14보다 작은 13이다.
각 경우에 최적의 방법으로 사과를 먹을 때, 거인이 먹게 되는 총 사과의 무게를 구하여라.

입력 형식
입력의 첫 줄에 정수 테스트 케이스의 개수를 의미하는 t가 들어온다.(1<=t<=100). 이어지는 t줄에는 각 줄에 n과 k가 주어진다.(1<=n+k<=500)

출력 형식
각 테스트 케이스에 대해서 거인이 먹어야 되는 가장 적은 양의 사과의 무게를 예제와 같은 형식으로 출력한다.

입력 예제
5
2 0
3 0
4 0
5 0
10 20

출력 예제
Case 1: 2
Case 2: 6
Case 3: 13
Case 4: 22
Case 5: 605




2008년 1월 19일 이후 작성된 모든 글에 대해서 퍼가는 것을 금지합니다.
퍼가고자 하시는 분은 링크를 달아 주시기 바랍니다.
Posted by Harry

설명
n종류의 페인트가 주어진다. 당신은 이 페인트들을 이용해서 정육면체를 칠해야 한다. 이 때, 서로 다른 방법으로 페인트를 칠하는 방법의 가지수를 구하여야 한다. 두 정육면체가 있을 때 한 정육면체를 돌려서 다른 정육면체와 같은 모양이 되지 못하면 두 정육면체는 다른 방법으로 칠해져 있다고 할 수 있다.

입력 형식
한 줄에 페인트의 종류 수를 나타내는 n(0<n<1000)이 하나씩 주어진다. 입력은 0으로 끝난다.

출력 형식
주어진 페인트의 종류로 정육면체를 칠할 수 있는 방법의 가지수를 출력한다.

입력 예제
1
2
0

출력 예제
1
10




2008년 1월 19일 이후 작성된 모든 글에 대해서 퍼가는 것을 금지합니다.
퍼가고자 하시는 분은 링크를 달아 주시기 바랍니다.
Posted by Harry

설명
N진수의 M자리 수 중에는 2, 3, ...M을 각각 곱해서 나온 결과가 처음 수의 애너그램인, 놀라운 수가 존재한다. 예를 들어 142857은 6자리의 10진수인데, 2, 3, ...6을 곱할 경우 다음과 같은 결과가 나온다.

2 x 142,857 = 285,714
3 x 142,857 = 428,571
4 x 142,857 = 571,428
5 x 142,857 = 714,285
6 x 142,857 = 857,142

M과 N이 주어졌을 때, 이러한 수를 찾아야 한다. 주어진 M, N에서 꼭 가능한 수가 나온다고 보장할 수 없다. 

입력 형식
입력은 최대 30줄로 이루어져 있다. 각 줄은 두 개의 정수 M(3<=M<=6)과 N(4<=N<=400)으로 되어 있다.
M=N=0일 경우 입력을 종료한다.

출력 형식
입력의 각 줄에 대해서 한 줄씩 출력한다. 각 줄에 M개의 정수를 출력하되, 각 정수는 공백으로 구분한다. 출력되는 모든 정수는 0과 N-1 사이의 수여야 한다. 이 정수들은 문제의 조건을 만족하는 N진수의 각 자리를 의미한다. 가장 왼 쪽에 가장 큰 자리수를 출력하며 오른쪽으로 갈수록 작은 자리의 수를 출력한다. 주어진 N, M에서 만족하는 수가 없을 경우 "Not found"를 출력한다.(따옴표 제외)

입력 예제
6 10
6 100
0 0

출력 예제
1 4 2 8 5 7
Not found.




2008년 1월 19일 이후 작성된 모든 글에 대해서 퍼가는 것을 금지합니다.
퍼가고자 하시는 분은 링크를 달아 주시기 바랍니다.
Posted by Harry

설명

Ocean deep
I'm so afraid to show my feelings,
I have sailed a million ceilings
In my solitary room
Ocean deep

위는 클리프 리차드의 유명한 노래의 가사이다. 이 문제에서 당신은 비슷한 사람을 보게 된다. 그의 이름은 Rampell-Stilt-Skin이고, 중요한 것은 그는 죽었다는 것이다. 누군가가 며칠 전에 그를 죽였고, 당신은 그 미스테리를 풀어야 한다. 문제는 그는 그에 관한 모든 정보와 감정을 숨기려고 했다는 것이다. 그는 일기를 썼는데, 거기에는 몇 문장과 함께 엄청나게 큰 이진수가 있다. 만약 이 이진수가 큰 소수인 131071로 나누어진다면 같이 쓰여 있던 문장은 참인 문장이며, 그렇지 않으면 거짓이다. 이 문제에서 당신에게는 큰 이진수가 주어질 것이며 당신은 이 수가 131071로 나누어지는지 판별해야 한다. 알고리즘이 효율적이어야 문제를 해결할 수 있다.

입력 형식
입력은 1개 이상의 이진수로 이루어져 있다. 각각의 이진수는 한 줄씩을 차지하지만 길어지면 몇 줄을 차지할 수도 있다. 때문에 각 이진수끼리의 구별은 '#' 문자로 한다. 각각의 이진수는 100자리를 넘지 않는다.

출력 형식
각각의 이진수에 대해서 131071로 나누어지면 YES를, 나누어지지 않으면 NO를 출력한다.

입력 예제
0#
1010101#

출력 예제
YES
NO




2008년 1월 19일 이후 작성된 모든 글에 대해서 퍼가는 것을 금지합니다.
퍼가고자 하시는 분은 링크를 달아 주시기 바랍니다.
Posted by Harry

설명
피보나치 수열은 1, 1, 2, 3, 5, 8, 13... 과 같다. 수열에서, 맨 앞의 두 수를 제외한 모든 수는 그 이전에 있는 두 수를 더한 것과 같다. 피보나치 소수는 피보나치 수 중 약수에 자신을 제외한 피보나치 수가 없는 수를 의미한다. 첫 번째 피보나치 소수는 2이고, 두 번째는 3, 세 번째는 5, 네 번째는 13이다. N이 주어질 때, N번째 피보나치 소수를 출력하는 프로그램을 작성하여라. 단, 결과가 9자리를 넘을 경우 처음의 9자리만 출력한다.

입력 형식
입력은 여러 줄로 되어 있으며 EOF로 종료된다. 각 줄에는 N(0<N<=22000)이 주어진다.

출력 형식
문제에 맞는 결과값을 첫 9자리만 출력한다.

입력 예제
1
2
3

출력 예제
2
3
5




2008년 1월 19일 이후 작성된 모든 글에 대해서 퍼가는 것을 금지합니다.
퍼가고자 하시는 분은 링크를 달아 주시기 바랍니다.
Posted by Harry
직업 선호도 테스트는 성격 테스트와는 다르게, 테스트를 받는 사람이 만족할 만한 직업을 찾는 것을 도와준다. 무의미해 보이는 5지선다형 질문으로 이루어진 이 테스트는, 그 사람의 성격에 가장 잘 맞는 직업을 골라준다. 질문은 다음과 같다.

Q. 다음 중 오후에 하고 싶은 일은 ?

(a) 닭에게 모이를 준다.
(b) 레이싱 카를 몬다.
(c) TV에서 심슨을 본다.
(d) 선탠을 한다.
(e) 개 집을 만든다.


각 질문은 참가자에게 다섯 가지 보기 중 가장 좋아하는 것을 고르도록 한다. 또한, 각 보기는 여러 질문에서 나타날 수 있다.

만약 참가자가 A, B, C, D, E의 보 기 중 A를 선택했다면, 이는 참가자가 각 B, C, D, E의 활동보다 A 를 좋아한다는 것을 의미한다. 또한 만약 참가자가 X를 Y보다 좋아하고, Y를 Z보다 좋아한다면 X를 Z 보다 좋아하는 것이 된다.

참가자는 모순되게 답을 할 수도 있다. 즉, 어떤 질문에서는 X가 Y 보다 좋다고 했다가, 다른 질문에 서는 Y가 X보다 좋다고 하는 것이 다. 이렇게 모순된 답을 제공하는 참가자는 정치가나 자동차 판매원 정도가 어울린다.(-_-)

직업 선호도 테스트에서 사용자가 쓴 답이 주어질 때, 당신은 이를 가장 적은 개수의 집합으로 나누어야 한다. 각 집합 안의 답들은 서로 모순되어야 한다.

입력은 0을 포함하는 여러 개의 테스트 케이스로 이루어진다. 각 테스트 케이스는 질문의 개수를 나타내는 n으로 시작한다. 그 뒤에는 n줄이 오는데, 각 줄에는 다섯 개의 서로 다른 질문과 참가자가 쓴 답이 공백을 두고 주어진다.

각 보기와 답은 하나의 알파벳 대문자로 주어진다. 각 테스트 케이스에 대해서, 한 줄에 하나씩 나누어진 집합을 출력한 다. 하나의 집합 내에서는 원소들을 알파벳 순으로 정렬하고, 집합끼리는 각 집합에서의 가장 작은 원소를 기준으로 알파벳 순 정렬한 다. 각 테스트 케이스 사이에는 빈 줄을 출력한다.

입력 예제
4
A B C D E C
F C H I J J
K B H I F I
K C E B J K
0

출력 예제
A
B
C
D
E
F
H
I J K




2008년 1월 19일 이후 작성된 모든 글에 대해서 퍼가는 것을 금지합니다.
퍼가고자 하시는 분은 링크를 달아 주시기 바랍니다.
Posted by Harry
TAG ACM, UVA

  8 Queens 체스 


체스에서, 퀸 8개를 서로가 서로를 공격하지 못하도록 배치할 수 있다. 퀸 하나의 위치가 주어질 때, 퀸 8개를 배치하는 모든 방법을 구하는 프로그램을 작성하여라.

8개의 퀸에 대해 8개의 배치 모두를 계산하려고 하지 않도록 한다. 그렇게 하면 88번 연산해야되고, 시스템 과부하를 불러올 수 있다. 더 효율적인 방법을 찾도록 하여라.

입력 형식 

입력의 첫 번째 줄은 데이터셋의 개수를 나타낸다. 두 번째 줄은 빈 줄이다. 각각의 데이터셋은 빈 칸으로 구분된 두 수를 가진다. 이 두 수는 8개의 퀸 중 한 개의 퀸이 무조건 있어야 할 칸의 위치를 나타낸다. 입력 데이터를 검사할 필요는 없다.

좌표계는 맨 왼쪽 위의 칸을 (1,1)로 하고, 줄은 아래쪽으로 증가하며 칸은 오른쪽으로 증가한다. 모든 좌표는 (줄,칸)으로 나타내어진다. 예를 들어 (4,6)은 4번째 줄 6번째 칸을 의미한다.

각 데이터셋은 빈 줄로 구분한다.

출력 형식 

각각의 데이터셋에 대한 출력은 여러 줄로 이루어질 수 있다. 퀸을 배치할 수 있는 각각의 경우에 대해서 한 줄씩 출력한다.

가능한 경우에 대해 순차적으로 1부터 N까지 번호를 붙인다. 각각의 경우는 8개의 숫자로 이루어진다.
1 5 8 6 3 7 2 4
이와 같은 출력은 (1,1)(5,2)(8,3)(6,4)(3,5)(7,6)(2,7)(4,8)의 위치에 퀸이 있음을 나타낸다. 즉, 각 칸에 대해서 퀸이 있는 줄 번호를 출력하는 것이다.

아래 행렬을 출력하는 것이 아닙니다!

     경우 1               경우 2                경우 3                경우 4

1 0 0 0 0 0 0 0      1 0 0 0 0 0 0 0      1 0 0 0 0 0 0 0      1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0      0 0 0 0 0 0 1 0      0 0 0 0 0 1 0 0      0 0 0 0 1 0 0 0
0 0 0 0 1 0 0 0      0 0 0 1 0 0 0 0      0 0 0 0 0 0 0 1      0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 1      0 0 0 0 0 1 0 0      0 0 1 0 0 0 0 0      0 0 0 0 0 1 0 0
0 1 0 0 0 0 0 0      0 0 0 0 0 0 0 1      0 0 0 0 0 0 1 0      0 0 1 0 0 0 0 0
0 0 0 1 0 0 0 0      0 1 0 0 0 0 0 0      0 0 0 1 0 0 0 0      0 0 0 0 0 0 1 0
0 0 0 0 0 1 0 0      0 0 0 0 1 0 0 0      0 1 0 0 0 0 0 0      0 1 0 0 0 0 0 0
0 0 1 0 0 0 0 0      0 0 1 0 0 0 0 0      0 0 0 0 1 0 0 0      0 0 0 1 0 0 0 0

퀸은 한 칸에 한 개밖에 있을 수 없으므로, 각 경우에 대해 한 줄만 출력하도록 한다.

각 데이터셋 사이에는 빈 줄을 출력한다.

입력 예시 

1

1 1

출력 예시

SOLN       COLUMN
 #      1 2 3 4 5 6 7 8

 1      1 5 8 6 3 7 2 4
 2      1 6 8 3 7 4 2 5
 3      1 7 4 6 8 2 5 3
 4      1 7 5 8 2 4 6 3



2008년 1월 19일 이후 작성된 모든 글에 대해서 퍼가는 것을 금지합니다.
퍼가고자 하시는 분은 링크를 달아 주시기 바랍니다.
Posted by Harry

 원의 원주 


원의 원주를 구하는 것은 매우 쉬운 일이다. 지름을 알 때 말이다. 하지만 그렇지 않다면?

평면상의 세 점이 데카르트 좌표계로 주어진다. 세 점은 일직선상에 있지 않다.

당신은 세 점을 지나는 원의 원주를 구해야 한다.

입력 형식

입력 파일은 1개 이상의 테스트 케이스로 이루어진다. 각각의 테스트 케이스는 6개의 실수(tex2html_wrap_inline26)로 이루어진 한 줄이다. 각각의 실수는 세 점의 좌표를 나타낸다. 원의 지름은 1,000,000을 넘지 않으며 입력은 EOF로 끝난다.

출력 형식

각각의 테스트 케이스에 대해서, 세 점으로 이루어진 원의 원주를 나타내는 실수를 소수점 이하 3자리에서 반올림하여 출력하라. tex2html_wrap_inline28의 값은 3.141592653589793이다.

입력 예시

0.0 -0.5 0.5 0.0 0.0 0.5
0.0 0.0 0.0 1.0 1.0 1.0
5.0 5.0 5.0 7.0 4.0 6.0
0.0 0.0 -1.0 7.0 7.0 7.0
50.0 50.0 50.0 70.0 40.0 60.0
0.0 0.0 10.0 0.0 20.0 1.0
0.0 -500000.0 500000.0 0.0 0.0 500000.0

출력 예시

3.14
4.44
6.28
31.42
62.83
632.24
3141592.65



2008년 1월 19일 이후 작성된 모든 글에 대해서 퍼가는 것을 금지합니다.
퍼가고자 하시는 분은 링크를 달아 주시기 바랍니다.
Posted by Harry
아래 4문제를 풀어,12월09일(금) 오후 2시까지
*******@nexon.co.kr로 전달 해주시면 됩니다.
기한내 미 제출시, 자동으로 탈락처리 됩니다.
아울러, 정답은 메일내용에 기재하신 후 소스와 함께 첨부 부탁드립니다.
기타 문의사항은 02-2185-****로 연락부탁드립니다.


다음 네 문제는 컴퓨터로 알고리즘을 작성하여 풀 수 있는 문제입니다.
(프로그래밍 언어는 C++ 또는 C를 사용하셔야 합니다.)
네 문제 모두 단답형이므로, 풀이 과정이나 설명을 적을 필요는 없고,
답을 적고 작성한 프로그램 소스 파일을 첨부해서 보내주시면 됩니다.
또, 넥슨에서 본 문제 메일을 발송한 시점에서 만 이틀이 지나기 전에
귀하의 답이 넥슨에 도착하지 않으면 불합격이며 보내주신 소스 파일은 채용 과정에서 검토됩니다.

문제의 설명과 예는 답을 구하기에 충분하므로, 추가적인 질문은 받지 않습니다.

========================== 과제물===============================


1번



<설명>

어떤 자연수 n이 있을 때, d(n)을 n의 각 자릿수 숫자들과 n 자신을 더한 숫자라고 정의하자.
예를 들어 d(91) = 9 + 1 + 91 = 101
이 때, n을 d(n)의 제네레이터(generator)라고 한다. 위의 예에서 91은 101의 제네레이터이다.
어떤 숫자들은 하나 이상의 제네레이터를 가지고 있는데, 101의 제네레이터는 91 뿐 아니라 100도 있다.
그런데 반대로, 제네레이터가 없는 숫자들도 있으며, 이런 숫자를 인도의 수학자 Kaprekar가
셀프 넘버(self-number)라 이름 붙였다.
예를 들어 1,3,5,7,9,20,31 은 셀프 넘버 들이다.

<문제>

1 이상이고 5000 보다 작은 모든 셀프 넘버들의 합을 구하라.

1번 답 : ________

2번



<설명>

가로 세로의 네모 칸들로 이루어진 방에 총잡이들이 있다고 하자.
총잡이들은 가로 혹은 세로 방향으로 다른 총잡이가 보이면 총격전을 벌여 한 쪽만 살아 남는다.
칸 중에는 벽으로 막힌 곳이 있어서 총잡이들이 벽 너머로는 볼 수 없으며, 대각선 방향도 볼 수 없게 되어 있다.

■: 벽
□: 빈 칸
♂: 총잡이

에를 들어, 다음과 같은 가로 세로 네 칸 씩으로 된 방이 있다고 하면,

■■■□
□□□□
□■□□
■■■□


총잡이 세 명을 다음과 같이 배치해볼 수 있을 것이다.

■■■□
□□□♂
♂■♂□
■■■□


가로 혹은 세로 방향에서 다른 총잡이에 노출되는 총잡이는 어느 한쪽이라도 죽게 되므로,
다음과 같은 배치는 할 수 없다.

■■■□
□♂□♂
□■□□
■■■□


위와 같이 생긴 방에 최대한 많은 총잡이를 배치하는 경우, 최대 네 명까지 가능하며,
네 명을 배치하는 경우의 수는 다음과 같은 두 가지 방법이 존재한다.

■■■♂
□♂□□
♂■♂□
■■■□



■■■□
□♂□□
♂■♂□
■■■♂


또 한가지 예로, 만약 벽이 전혀 없는 가로 세로 네 칸씩으로 된 방이 있다면, 최대 네 명의 총잡이를 24 가지의 방법으로 배치할 수 있을 것이다.

<문제>

다음과 같이 생긴 가로 세로 여덟 칸씩으로 된 방에는 최대 몇 명의 총잡이를 배치할 수 있으며, 그 경우, 몇 가지 방법으로 배치할 수 있겠는가?

□■□■□■□■
□□□□□■□□
■□■□□■□■
□□□□□□□□
□□□■□□□□
□□□□□■□■
□■□□□□□□
□□□□■□■□


2번 답 : 최대 ____ 명, ____ 가지.


3번


<설명>

RLE(Run Length Encoding)란, 임의의 수열을 (반복 수, 숫자)의 쌍으로 된 수열로 만드는 부호화 방법이다.
예를 들어 다음과 같은 열 개의 숫자로 된 수열이 있다고 할 때,

9, 9, 9, 5, 7, 7, 7, 7, 7, 7

RLE를 이용하여 다음과 같이 여섯 개의 숫자로 부호화할 수 있다.

(3,9), (1,5), (6,7)

해석하면, 9가 세 개 있고, 그 다음에 5가 한 개, 그 다음에 7이 여섯 개 나오는 수열이라는 뜻이다.
이 때, (원래 수열의 갯수) / (부호화 수열의 갯수) 를 압축률이라 하며, 위의 경우에서 압축률은 10 / 6 = 1.666 이다.
이렇게 부호화된 값은 쉽게 원래 값으로 복원할 수 있음을 알 수 있을 것이다.

그런데, 원래 값으로 되돌리는 것을 보장하지 않는 RLE 방법을 '손실 RLE'라 하자.
이 경우는 복원했을 때 오차가 생기게 되는데, 원래 수열과의 RMSE (Root Mean Square Error) 를 오차로서 정의한다.
크기가 n인 A 수열과 B 수열 사이의 RMSE는 다음과 같이 계산한다

RMSE(A,B) = sqrt( ( (A1-B1)^2 + (A2-B2)^2 + ... + (An-Bn)^2 ) / n)

'손실 RLE' 방법은 다양하게 존재하므로, 같은 수열이라도 다양하게 '손실 RLE' 부호화 할 수 있는데, 예를 들어, 위와 같은 수열의 경우 (10,9) 혹은, (10, 7) 혹은 (3, 9), (7, 7) 등으로 '손실 RLE' 부호화할 수 있을 것이다.

만약 (10,9) 으로 부호화했다면, 압축률은 5 이며, RMSE는 2 이다.
(10,7) 로 부호화했다면, 압축률은 5 이며, RMSE는 1.26 이다.
(3,9), (7,7) 로 부호화했다면, 압축률은 2.5 이며, RMSE는 0.63 이다.

<문제>

다음과 같이 128개의 정수로 된 수열이 있을 때,

49, 49, 50, 52, 49, 47, 47, 46, 44, 42, 42, 38, 38, 38, 36, 34,
33, 33, 33, 32, 34, 38, 42, 41, 42, 42, 40, 41, 40, 38, 38, 37,
37, 39, 41, 40, 40, 40, 40, 42, 45, 47, 47, 46, 46, 46, 47, 47,
47, 47, 46, 44, 43, 39, 36, 34, 34, 32, 30, 29, 30, 31, 31, 31,
30, 28, 25, 23, 24, 22, 22, 25, 25, 27, 31, 33, 35, 37, 38, 39,
39, 40, 40, 41, 40, 40, 40, 40, 39, 38, 37, 35, 35, 34, 33, 32,
31, 30, 30, 29, 29, 28, 27, 27, 28, 27, 25, 26, 0, 0, 90, 90,
90, 90, 90, 91, 90, 88, 87, 84, 80, 78, 83, 89, 91, 90, 89, 92


오차를 가능한 한, 작게 억제하면서 32개의 정수(압축률 4)로 압축하는
자신만의 '손실 RLE' 알고리듬을 만들고, 그 알고리듬에 의한 부호화 결과 수열과 RMSE를 적어라.
(RMSE 가 1.8 미만이면 정답으로 간주하며, RMSE가 1.6보다 작을 수록 가산점 있음.)

주의; 답은 정확히 32개의 정수로 나와야 하며 32개보다 적거나 많으면 오답으로 처리 됩니다.

오답 예 1)

( 8, 49), ( 3, 44), ( 5, 38), ( 5, 33), ( 1, 38), ( 8, 42), ( 6, 38), ( 4, 40),
( 8, 45), ( 4, 47), ( 1, 43), ( 1, 39), ( 3, 36), ( 2, 32), ( 7, 29), ( 3, 25),
( 3, 22), ( 2, 25), ( 2, 31), ( 2, 35), ( 5, 38), ( 7, 41), ( 3, 37), ( 3, 34),
( 5, 31), ( 7, 28), ( 2, 0 ), ( 9, 90), ( 1, 84), ( 2, 80), ( 1, 83), ( 5, 89)
-> 64개의 정수로 오답


오답 예 2)

(8, 47), (7, 38), (6, 33), (8, 42), (11, 40), (14, 47), (12, 31), (8, 24)
(20, 39), (8,30), (6, 26), (2, 0), (9, 90), (1, 84), (8, 83)
-> 30개의 정수로 오답


3번 답

(__, __), (__, __), (__, __), (__, __), (__, __), (__, __), (__, __), (__, __),
(__, __), (__, __), (__, __), (__, __), (__, __), (__, __), (__, __), (__, __)

RMSE = ____

4번


<설명>

다음과 같은 배열(array)이 있다고 가정할 때
A = { 30, 1, 18, 2, 5, 10, 15, 9, 5, 25, 5 }
B = { 2, 4, 11, 5, 24, 18, 8, 4, 13, 18 }
:*: 는
"A 배열과 B 배열에 동시에 존재하는 수의 갯수를 구하는 연산" 이고
|*| 는
"A 배열과 B 배열에 동시에 존재하는 수의 집합(set)의 크기를 구하는 연산"이라고 정의하면

A :*: B = 9 이고 ( A' = { 18, 2, 5, 5, 5 }, B' = { 2, 5, 18, 18 } )
A |*| B = 3 이다. ( { 2, 5, 18 } )

문제

첨부된 Problem4Data.exe를 실행하면 work folder에 array1.dat, array2.dat 파일이
생성되며 각 파일의 크기는 4GByte 이다. ( 실행 전 디스크 용량 체크 필요 )

각 파일은 64 bit unsigned integer 값이 Little Endian 형식으로 차례로 기록되어 있으며 해당 array 내용은 다음과 같다.

array1.dat =
{
0b9cba234dfa382b, 39a3a0d4d852f190, b9327f793917ff50, 1616a4aabd698224
...
fa042ea941e23e5f, 3b822f8e29debd79, 10c3149ac586d931, ff7010cd11748990
}


array2.dat =
{
c801c1d4fa7aa667, 354950b8ddf236d5, b2cd486f07bf5480, 87bd78f1a50ce1e8
...
751cb8fad5eb894e, b0e9830fdf5b86d4, fc0a9158f62abfc6, 4f178f9413158f9c
}


array1 = A, array2 = B 라고 했을 때
A :*: B 값과
A |*| B 값을 구하여라.

4번 답 : A :*: B 값 __________ , A |*| B 값 __________

생각보다 쉽네요. 입사 문제가 이정도라니...;;;
언제 시간 나면 한번 고민해보아야겠네요.
(4번은 첨부파일을 구하지 못했습니다. 랜덤 찍는 프로그램 돌려서 해도 무방할 듯 합니다.)



2008년 1월 19일 이후 작성된 모든 글에 대해서 퍼가는 것을 금지합니다.
퍼가고자 하시는 분은 링크를 달아 주시기 바랍니다.
Posted by Harry