KDHzoot's Github

Code for study, project, etc

자세히보기

알고리즘/정보올림피아드 필기 문제

2008 시도예선 중고등부 문제

kdhzoot 2018. 3. 29. 12:10

수학문제


1. 더해지는 수들의 수열을 보면 1, 2, 3, 4 ... 순으로 커진다.



2. AB에 A를 곱한 것이 AB이니 A는 1이다. 

백의 자리에 있는 수는 B인데 결과는 E가 나온다. 따라서 A+C는 10보다 크다. A가 1이므로 C는 9 

AB*B는 BC이다. C가 9이므로 B는 3

13*31 = 403이 나온다. 따라서 D는 0



3. 1을 7로 나누면 0.14285714... 사이클의 길이가 6이므로 97%6 = 1, 97번째 수는 1이다.



4. 10으로 나누었을 때 나머지가 3이려면 3, 13, 23, 33, 44등의 수가 있다.

3으로 나눴을때 3이 되려면 9, 10, 11

3으로 나눴을때 13이 되려면 39, 40, 41

3으로 나눴을때 23이 되려면 69, 70, 71

3으로 나눴을때 33이 되려면 99, 100, 101

두자리 자연수의 갯수이므로 9개이다.



5. 홍콩 돈을 1로 기준한다면 싱가포르돈은 100/80 -> 5/4

싱가포르 돈이 5/4라면 미국 돈은 5/4*32/40 = 1

따라서 미국 돈 111달러는 홍콩돈 111달러이다.



6. 어떤 달은 31일이었다. 따라서 뒤에는 28, 29, 30, 31이 올 수 있다. 

그러면 다음 달의 말일로 가능한 요일은 금요일, 토요일, 일요일, 월요일이다.



7. 다 해보자. 25원 9개와 12원 2개와 5원 하나면 254원이 된다. 따라서 12개



8. 한사람씩 꼴찌에 두고 참이라고 가정한 뒤 풀어서 모순이 없으면 된다. D는 정직함.



9. N개의 사람들은 K개의 그룹으로 나누는 경우의 수는 

N-1명의 사람들을 K-1개로 나눌경우(그리고 한명을 혼자 그룹에 할당) +

N-1명의 사람들을 K개의 그룹으로 나눌경우(그리고 한명을 한 그룹에 추가)

따라서 점화식을 세우면 A[i-1][j-1] + j * A[i-1][j]

앞에서부터 dp로 해보면 90이 나온다.



10. 그냥 보기대로 하면 나온다.



11. 일일이 다 세보자



12. 이것도 중학교 때 과정에서 하던대로 하면 된다.



13. 트리를 일일이 내려가면서 보면 된다 



14. DFS를 안다면 순서대로 따라가면 된다.



15. 이것도 dp이다. 세가지 dp경우가 존재한다. 마지막이 1일 경우, 마지막에 0이 하나 오는 경우, 마지막에 0이 연속으로 두개 오는 경우.

처음부터 해보면 149가 나온다.



코드문제


16. 모르면 c 공부하러 가자



17. 또 가자



18. 반복되는 구조를 찾고 계산한다.



19. 코드를 보면 A부터 B를 배열 인덱스 0부터 25에 count하므로 본래 알파벳의 문자 값에 A의 아스키값을 빼주어야 한다.

따라서 ㄱ과 ㄴ에 들어갈 문자는 A



20. 위에 문제와 연장선으로 마지막 for문을 보면 출현 횟수가 같으면 알파벳 순으로 마지막인 문자가 출력된다. 따라서 O



21. 코드를 읽어보면 힙인 것 같다. 

첫 번째 if문에서는 오른쪽에 노드가 있는지

있으면 더 작은 쪽을 k로

없으면 왼쪽을 k로

해서 비교후 swap한다.

따라서 hip구조로 불가능한 것은 2번



22. 언뜻보면 제곱수를 찾는 프로그램 같지만 그냥 제곱수가 아니라 소수의 제곱수를 찾는 프로그램이다.

따라서 4, 9, 25, 49해서 4개이다.



23. 코드를 보니 오름차순으로 정렬하는 코드이다. 

두 번째 for문은 i번째 수가 앞에 어디에 들어가야 되는지 찾는 과정이 된다. 

어처피 i-1까지는 오름차순으로 정렬되어 있기 때문에 단순히 앞의 값과 비교하여 바꾸는 것만으로도 가능하다. 

따라서 ㄱ의 수행 횟수는 9회이다.



24. 23번과 연장선상에서 생각해보자.

누가봐도 1번은 아니다. 

2번은 다섯번 바꾼다. 

3번은 두번만 바꾼다. 

4번은 적어도 두번 보다는 많이 바꾼다.

5번도 마찬가지

따라서 정답은 3번이다.



25. 솔직히 무슨 코드인지 모르겠다. a와 m의 값이 바뀌지 않는 것으로 보아 b만 보면 된다.

b는 재귀함수로 내려갈 수록 절반으로 작아지고 r은 제곱한뒤 m으로 나뉘어진다.

지금까지 코드를 읽었다.

그냥 노가다로 해보니 8이 나왔다.



26. 25번과 연장선상의 문제로 사실 이것도 노가다했다.

노가다를 줄이는 방법이라면 곱해도 10으로 나눈 나머지는 똑같으니 나머지 연산은 빼고 한다음 일의 자리 수만 보는 방법이 있다.

그러면 9* (3의 (2의 15승) 승)이 된다. 따라서 계산하면 9



27. 코드를 보니 피보나치다. 함수의 실행횟수는 5번 따라서 1, 1, 2, 3, 5, 8, 13 해서 답은 13



28-29. 아래 코드는 2의 거듭제곱인지를 판별하는 프로그램이라고 한다. 

2의 거듭제곱이라면 비트가 1인 부분이 한개여야한다.

따라서 n과 n-1을 &하면 값이 0이 나온다는 특징이 있다. 따라서 ㄴ은 &이고

ㄱ 과 ㄷ 은 0이다.



30-35. 서울대식 찍기를 한다면 풀 수 있다.