2019. 8. 19. 17:30
728x90

문제 번호: 1003

문제 제목: 피보나치 함수

문제 주소: https://www.acmicpc.net/problem/1003


문제 내용

int fibonacci(int n) {
    if (n == 0) {
        printf("0");
        return 0;
    } else if (n == 1) {
        printf("1");
        return 1;
    } else {
        return fibonacci(n‐1) + fibonacci(n‐2);
    }
}

n을 입력 받아 위 함수를 실행하였을 때 0이 출력되는 횟수와 1이 출력되는 횟수를 출력한다.


테스트 케이스

3
0
1
3
40


1 0
0 1
1 2
63245986 102334155


문제 풀이

하나의 결과를 출력하는데 소요되는 시간은 얼마 걸리지 않지만, T회의 테스트케이스를 진행하는 과정에서 매번 계산을 새로 하게 될 경우 그만큼 연산을 낭비하게 된다.

n이 입력되는 경우 0이 출력된 횟수는 n-1번째 피보나치 수와 동일하고, 1이 출력된 횟수는 n번째 피보나치 수와 동일하다. 따라서 n번째까지의 피보나치 수를 구하면 각각의 결과를 파악할 수 있다.

다만 T개의 테스트 케이스를 수행하는 것이 이번 문제의 특징이고, 첫 번째 테스트 케이스로 n이 입력된 경우 1~n까지의 결과가 40을 구하는 과정에서 이미 구해지게 되므로, 이들에 대한 정보를 별도로 저장하여 다른 테스트 케이스에서 활용한다면 연산 낭비를 줄일 수 있다. n보다 작은 수인 경우에는 바로 결과가 나오고, n보다 큰 수는 n번째까지의 연산 과정을 생략할 수 있기 때문이다.

1. [0]~[40]까지를 저장할 수 있도록 배열을 생성한다.
2. [0] = 0, [1] = 1로 대입한다.
3. n을 입력받는다.
4. 2~n까지 진행하면서 [i] == 0인 경우에는 [i] = [i - 1] + [i - 2]를 대입한다. 아닌 경우에는 다음으로 넘어간다.
5. 0 호출 횟수와 1 호출 횟수를 출력한다.
6. T회동안 3~5를 반복한다.


풀이 코드


728x90

'공부 > 문제풀기' 카테고리의 다른 글

백준 9461 - 파도반 수열  (0) 2019.08.21
백준 1904 - 01타일  (0) 2019.08.21
백준 2748 - 피보나치 수 2  (0) 2019.08.19
백준 10814 - 나이순 정렬  (0) 2019.08.19
백준 1181 - 단어 정렬  (0) 2019.08.19
Posted by 아야카
2019. 8. 19. 16:50
728x90

문제 번호: 2748

문제 제목: 피보나치 수 2

문제 주소: https://www.acmicpc.net/problem/2748


문제 내용

입력에 n번째에 해당하는 피보나치 수를 출력한다.


테스트 케이스

1

1

2

1

3

2

10

55

90

2880067194370816120


문제 풀이

입력 범위인 90번째의 수가 매우 크므로 결과 출력에는 64bit 변수가 필요하다.
피보나치 수열의 경우 f(n-1) + f(n-2)로 표현되는 것이 일반적이지만 이를 재귀함수로 구현할 경우 같은 중복 계산이 매우 많아지므로 수가 커질수록 성능이 크게 저하된다. 차라리 for를 이용한 반복문을 이용하는 편이 빠르다.

동적 계획법으로 풀 경우에는 해당하는만큼 배열을 생성하고 아래와 같이 진행하면 된다.
1. n + 1개짜리 배열을 생성하고 [1]과 [2]에는 각각 1을 대입한다.
2. [2]~[n]까지 [n-1], [n-2]를 합한 수를 대입한다.
3. n번째 값을 출력한다.


풀이 코드


728x90

'공부 > 문제풀기' 카테고리의 다른 글

백준 1904 - 01타일  (0) 2019.08.21
백준 1003 - 피보나치 함수  (0) 2019.08.19
백준 10814 - 나이순 정렬  (0) 2019.08.19
백준 1181 - 단어 정렬  (0) 2019.08.19
백준 11651 - 좌표 정렬하기 2  (0) 2019.08.19
Posted by 아야카
2019. 8. 19. 16:02
728x90

문제 번호: 10814

문제 제목: 나이순 정렬

문제 주소: https://www.acmicpc.net/problem/10814


문제 내용

나이와 이름순으로 입력받은 N의 멤버 정보를 나이순으로 정렬하여 출력한다. 나이가 동일한 경우에는 먼저 입력받은 순서대로 출력한다.


테스트 케이스

3
21 Junkyu
21 Dohyun
20 Sunyoung


20 Sunyoung
21 Junkyu
21 Dohyun


문제 풀이

나이는 1~200까지의 범위이고, 같은 나이일 경우 입력받은 순서대로 출력하므로 나이 입력 범위에 해당하는 인덱스 배열을 만든 후 해당 인덱스에 입력받은 이름들을 추가해주는 방식으로 풀면 된다.
C++ 같은 경우에는 vector가 이러한 방식으로 풀기에 용이하다. key의 중복 입력을 허용하는 multimap을 이용해 풀 경우에는 반복자를 이용해 바로 출력해주면 된다. 다만 이 경우 vector보다 느리고 메모리 사용량이 많다는 단점이 있다.


풀이 코드


728x90

'공부 > 문제풀기' 카테고리의 다른 글

백준 1003 - 피보나치 함수  (0) 2019.08.19
백준 2748 - 피보나치 수 2  (0) 2019.08.19
백준 1181 - 단어 정렬  (0) 2019.08.19
백준 11651 - 좌표 정렬하기 2  (0) 2019.08.19
백준 11650 - 좌표 정렬하기  (0) 2019.08.19
Posted by 아야카
2019. 8. 19. 15:45
728x90

문제 번호: 1181

문제 제목: 단어 정렬

문제 주소: https://www.acmicpc.net/problem/1181


문제 내용

입력받은 N개의 문자를 길이가 짧은 순서대로 출력한다. 길이가 동일할 경우 사전순으로 출력한다. 단, 같은 단어를 한 번만 출력한다.


테스트 케이스

13
but
i
wont
hesitate
no
more
no
more
it
cannot
wait
im
yours


i
im
it
no
but
more
wait
wont
yours
cannot
hesitate



문제 풀이

문제에서 제시한 규칙에 맞춰 algorithm의 sort 함수에 사용할 비교용 함수를 만들면 된다.
비교용 함수를 만들기 싫다면 문자열 길이별로 묶어서 각 길이마다 sort 하는 방식을 사용해도 된다.
출력 시에는 현재 문자열과 이전 or 다음 문자열과 비교하여 동일하지 않으면 출력하도록 한다.


풀이 코드


728x90

'공부 > 문제풀기' 카테고리의 다른 글

백준 2748 - 피보나치 수 2  (0) 2019.08.19
백준 10814 - 나이순 정렬  (0) 2019.08.19
백준 11651 - 좌표 정렬하기 2  (0) 2019.08.19
백준 11650 - 좌표 정렬하기  (0) 2019.08.19
백준 1427 - 소트인사이드  (0) 2019.08.19
Posted by 아야카
2019. 8. 19. 15:04
728x90

문제 번호: 11651

문제 제목: 좌표 정렬하기 2

문제 주소: https://www.acmicpc.net/problem/11651


문제 내용

N개의 입력받은 좌표들을 y 기준으로 오름차순하여 정렬한다. y가 동일할 경우 x값이 작은 것을 우선한다.


테스트 케이스

5
0 4
1 2
1 -1
2 2
3 3


1 -1
1 2
2 2
3 3
0 4


문제 풀이

핵심 내용은 11650 문제와 동일하다. 단지 x를 기준으로 하냐, y를 기준으로 하냐의 차이만 있을 뿐이다.
second, first 순서로 입력받은 뒤, algorithm의 sort 함수로 정렬하고, 출력할 때도 second, first 순서로 출력한다.


풀이 코드

728x90

'공부 > 문제풀기' 카테고리의 다른 글

백준 10814 - 나이순 정렬  (0) 2019.08.19
백준 1181 - 단어 정렬  (0) 2019.08.19
백준 11650 - 좌표 정렬하기  (0) 2019.08.19
백준 1427 - 소트인사이드  (0) 2019.08.19
백준 2108 - 통계학  (0) 2019.08.19
Posted by 아야카
2019. 8. 19. 14:55
728x90

문제 번호: 11650

문제 제목: 좌표 정렬하기

문제 주소: https://www.acmicpc.net/problem/11650


문제 내용

N개의 x, y 좌표를 오름차순으로 정렬하여 출력한다. x값이 동일할 경우에는 y값이 작은 것을 우선한다.


테스트 케이스

5
3 4
1 1
1 -1
2 2
3 3


1 -1
1 1
2 2
3 3
3 4


문제 풀이

pair로 x, y 값을 입력받은 후 algorithm의 sort를 이용해 정렬한 뒤 출력한다.
개행 출력으로 endl을 사용할 경우 시간초과 처리되므로 다른 방법을 사용해 출력해야 한다.


풀이 코드


728x90

'공부 > 문제풀기' 카테고리의 다른 글

백준 1181 - 단어 정렬  (0) 2019.08.19
백준 11651 - 좌표 정렬하기 2  (0) 2019.08.19
백준 1427 - 소트인사이드  (0) 2019.08.19
백준 2108 - 통계학  (0) 2019.08.19
백준 10989 - 수 정렬하기 3  (0) 2019.08.13
Posted by 아야카
2019. 8. 19. 12:57
728x90

문제 번호: 1427

문제 제목: 소트인사이드

문제 주소: https://www.acmicpc.net/problem/1427


문제 내용

N의 각 자리수를 내림자순으로 정렬하여 출력한다.


테스트 케이스

2143

4321

999999999

999999999

123456789

987654321

1000000000

1000000000


문제 풀이

각 자리수에 대한 인덱스로 숫자의 수를 기록한 뒤 감산식으로 9~0까지 순서대로 숫자 개수만큼 출력한다.
수가 10억 이하이므로 int로 입력받아도 무방하다.


풀이 코드

728x90

'공부 > 문제풀기' 카테고리의 다른 글

백준 11651 - 좌표 정렬하기 2  (0) 2019.08.19
백준 11650 - 좌표 정렬하기  (0) 2019.08.19
백준 2108 - 통계학  (0) 2019.08.19
백준 10989 - 수 정렬하기 3  (0) 2019.08.13
백준 2751 - 수 정렬하기 2  (0) 2019.08.13
Posted by 아야카
2019. 8. 19. 12:45
728x90

문제 번호: 2108

문제 제목: 통계학

문제 주소: https://www.acmicpc.net/problem/2108


문제 내용

입력된 N개의 수에 대한 산술평균, 중앙값, 최빈값, 범위를 출력한다.
산술평균 - 소수 첫째 자리에서 반올림
중앙값 - 요소가 홀수 일 때는 중앙에 위치한 값, 짝수일 때는 중앙에 위치한 두 수의 평균
최빈값 - 가장 많이 출현한 수. 여러 개 있을 경우 두 번째로 작은 값


테스트 케이스

5
1
3
8
-2
2

2
2
1
10

1
4000

4000
4000
4000
0

5
-1
-2
-3
-1
-2

-2
-2
-1
2


문제 풀이

입력하는 횟수가 50만개로 많고, 반대로 정수의 범위는 -4000 ~ 4000으로 좁은 편이다. 
입력 순서를 고려하지 않아도 되고 중복값이 존재하므로 인덱스를 만들고 이를 바탕으로 계산하는 것이 좋다.

산술평균 - 합계가 양수일 경우에는 +0.5를, 음수일 경우에는 -0.5를 한 후에 int로 형변환하면 된다.
중앙값 - N / 2개에 해당하는 인덱스 값을 출력한다.
최빈값 - 오름차순으로 인덱스를 탐색한다. 현재 최빈값과 같을 경우 중복 여부를 확인하고, 더 높은 수가 나오면 중복 체크를 초기화한다.
최빈값 - 입력받는 시점에 min, max를 구하고 max - min을 출력한다.


풀이 코드


728x90

'공부 > 문제풀기' 카테고리의 다른 글

백준 11650 - 좌표 정렬하기  (0) 2019.08.19
백준 1427 - 소트인사이드  (0) 2019.08.19
백준 10989 - 수 정렬하기 3  (0) 2019.08.13
백준 2751 - 수 정렬하기 2  (0) 2019.08.13
백준 2750 - 수 정렬하기  (0) 2019.08.13
Posted by 아야카