문제 설명

A 의 수열이 있을 때, |Ai - Ai+1| ~ |An-2 - An-1| 의 합 중 최대값을 구하면 된다.

풀이

완전 탐색으로 다 확인했다.
1. O(N!) 이여서 그렇게 오래 걸리지도 않는다.
사용한지 안한지는 비트마스크를 이용해서 했다.

코드

시간 제한메모리 제한제출정답맞은 사람정답 비율
1 초256 MB47832862226761.303%

문제

N개의 정수로 이루어진 배열 A가 주어진다. 이 때, 배열에 들어있는 정수의 순서를 적절히 바꿔서 다음 식의 최대값을 구하는 프로그램을 작성하시오.

|A[0] - A[1]| + |A[1] - A[2]| + ... + |A[N-2] - A[N-1]|

입력

첫째 줄에 N (3 ≤ N ≤ 8)이 주어진다. 둘째 줄에는 배열 A에 들어있는 정수가 주어진다. 배열에 들어있는 정수는 -100보다 크거나 같고, 100보다 작거나 같다.

출력

첫째 줄에 배열에 들어있는 수의 순서를 적절히 바꿔서 얻을 수 있는 식의 최댓값을 출력한다.

예제 입력 1 

6
20 1 15 8 4 10

예제 출력 1 

62

출처


문제 설명

1. LIS 의 기본문제
2. LIS 는 가장 긴 증가하는 부분수열을 구하는 알고리즘이다.

풀이

dp 와 arr 배열을 둬서 그 전의 박스들을 모두 확인한다.
1. dp 배열에는 현재 그 박스위치에서 가장 많은 박스의 개수를 저장하고
2. arr 배열에서는 박스의 크기를 저장한다.
3. arr[현재 박스위치] > arr[이전의 박스 모두들] 을 해서 가장 높은 dp[이전의 박스 모두들] 를 골라 + 1 해준게 dp[현재 박스위치] 에 들어간다.

증명

1. dp[0] = 1
풀이의 3을 0 ~ N 까지 한게 증명의 설명이 되겠다.

코드

문제

정육면체 모양의 상자들이 일렬로 늘어서 있다. 상자들마다 크기가 주어져 있는데, 앞에 있는 상자의 크기가 뒤에 있는 상자의 크기보다 작으면, 앞에 있는 상자를 뒤에 있는 상자 안에 넣을 수가 있다. 예를 들어 앞에서부터 순서대로 크기가 (1, 5, 2, 3, 7)인 5개의 상자가 있다면, 크기 1인 상자를 크기 5인 상자에 넣고, 다시 이 상자들을 크기 7인 상자 안에 넣을 수 있다. 하지만 이렇게 상자를 넣을 수 있는 방법은 여러 가지가 있을 수 있다. 앞의 예에서 차례대로 크기가 1, 2, 3, 7인 상자들을 선택하면 총 4개의 상자가 한 개의 상자에 들어가게 된다.

상자들의 크기가 주어질 때, 한 번에 넣을 수 있는 최대의 상자 개수를 출력하는 프로그램을 작성하시오.

입력

파일의 첫 번째 줄은 상자의 개수 n (1≤n ≤1000)을 나타낸다. 두 번째 줄에는 각 상자들의 크기가 순서대로 주어진다.

출력

첫째 줄에 한 줄에 넣을 수 있는 최대의 상자 개수를 출력한다.

예제 입력 1 

8
1 6 2 5 7 3 5 6

예제 출력 1 

5


문제 설명

0, 0 에서 N - 1, N -1 로 가는 경우의 수를 모두 구하면 된다.
이동은 오른쪽 또는 아래로만 가능하다.

풀이, 증명

입력과 동시에 답을 구했다. O(N^2)
1. dp[0][0] 은 1 로 초기화 한다.
2. 0,0 에서 오른쪽 또는 아래로 갈 수 있다면 이동한 곳에 값을 dp[0][0] 을 넣어준다.
그러면 각각 1 이 들어가게 된다.
3. for loop 이 돌면서 2 번 0,0 에 i,j 를 대입해서 순서대로 실행하게 되면 마지막 dp[N-1][N-1] 에는 답이 들어가게 된다.
위로 또는 왼쪽으로 못가기 때문에 순서대로 for loop 을 돌면서 답을 구할 수 있다.
왜냐하면 미리 답을 넣어놓고 거기에 도착하는 순간은 모든 경로를 다 확인했기 때문이다. 오른쪽 또는 아래로 갈 수 있는것은 j, i 를 더한다는게 된다.

설명이 부족했지만 알아서 이해하시면 됩니다.

코드

문제

N×N 게임판에 수가 적혀져 있다. 이 게임의 목표는 가장 왼쪽 위 칸에서 가장 오른쪽 아래 칸으로 규칙에 맞게 점프를 해서 가는 것이다.

각 칸에 적혀있는 수는 현재 칸에서 갈 수 있는 거리를 의미한다. 반드시 오른쪽이나 아래쪽으로만 이동해야 한다. 0은 더 이상 진행을 막는 종착점이며, 항상 현재 칸에 적혀있는 수만큼 오른쪽이나 아래로 가야 한다. 한 번 점프를 할 때, 방향을 바꾸면 안된다. 즉, 한 칸에서 오른쪽으로 점프를 하거나, 아래로 점프를 하는 두 경우만 존재한다.

가장 왼쪽 위 칸에서 가장 오른쪽 아래 칸으로 규칙에 맞게 이동할 수 있는 경로의 개수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 게임 판의 크기 N (4 ≤ N ≤ 100)이 주어진다. 그 다음 N개 줄에는 각 칸에 적혀져 있는 수가 N개씩 주어진다. 칸에 적혀있는 수는 0보다 크거나 같고, 9보다 작거나 같은 정수이며, 가장 오른쪽 아래 칸에는 항상 0이 주어진다.

출력

가장 왼쪽 위 칸에서 가장 오른쪽 아래 칸으로 문제의 규칙에 맞게 갈 수 있는 경로의 개수를 출력한다. 경로의 개수는 263-1보다 작거나 같다.

예제 입력 1 

4
2 3 3 1
1 2 1 3
1 2 3 1
3 1 1 0

예제 출력 1 

3

힌트


문자열의 길이를 비교하는 문제이다.

간단하므로 설명은 생략한다.

문제

재환이는 저스틴 비버 콘서트에서 소리를 너무 많이 질러서 인후염에 걸렸다.

의사는 재환이에게 "aaah"를 말해보라고 시켰다. 안타깝게도 재환이는 의사가 원하는만큼 소리를 길게 낼 수 없는 경우가 있었다.

각각의 의사는 재환이에게 특정한 길이의 "aah"를 말해보라고 요청한다. 어떤 의사는 "aaaaaah"를 요구하기도 하고, "h"만 요구하는 의사도 있다.

모든 의사는 자신이 원하는 길이의 "aah"를 듣지 못하면 진단을 내릴 수 없다.

따라서, 재환이는 집에서 자신이 얼마나 길게 "aah"를 낼 수 있는지 알아냈고, 자기가 소리낼 수 있는 길이의 "aah"를 요구하는 의사를 방문하려고 한다.

재환이가 낼 수 있는 "aah"의 길이와 의사가 요구하는 길이가 주어진다. 이 때, 그 병원에 가야하는지 말아야하는지를 알아내는 프로그램을 작성하시오.

입력

입력은 두 줄로 이루어져 있다. 첫째 줄은 재환이가 가장 길게 낼 수 있는 "aaah"이다. 둘째 줄은 의사가 듣기를 원하는 "aah"이다. 두 문자열은 모두 a와 h로만 이루어져 있다. a의 개수는 0보다 크거나 같고, 999보다 작거나 같으며, 항상 h는 마지막에 하나만 주어진다.

출력

재환이가 그 병원에 가야하면 "go"를, 아니면 "no"를 출력한다.

예제 입력 1 

aaah
aaaaah

예제 출력 1 

no

예제 입력 2 

aaah
ah

예제 출력 2 

go


문제 설명

이진 트리를 만들어서
전위 순회, 중위 순회, 후위 순회한 결과를 차례대로 출력하면 된다.

풀이

원래는 배열을 2^N 크기만큼 만들어서 하려했는데, 입력값이 조금 까다롭게 나와서
객체를 만들고 그 객체에 연결되도록 했다.

전위 순회는 root -> l -> r 차례대로 타고 내려간다.
중위 순회는 l -> root -> r 이다.
후위 순회는 l -> r -> root 이다.

root 가 언제 출력되냐에 따라서 전위, 중위, 후위로 결정된다.

코드

문제

이진 트리를 입력받아 전위 순회(preorder traversal), 중위 순회(inorder traversal), 후위 순회(postorder traversal)한 결과를 출력하는 프로그램을 작성하시오.

예를 들어 위와 같은 이진 트리가 입력되면,

  • 전위 순회한 결과 : ABDCEFG // (루트) (왼쪽 자식) (오른쪽 자식)
  • 중위 순회한 결과 : DBAECFG // (왼쪽 자식) (루트) (오른쪽 자식)
  • 후위 순회한 결과 : DBEGFCA // (왼쪽 자식) (오른쪽 자식) (루트)

가 된다.

입력

첫째 줄에는 이진 트리의 노드의 개수 N(1≤N≤26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 영문자 대문자로 매겨지며, 항상 A가 루트 노드가 된다. 자식 노드가 없는 경우에는 .으로 표현된다.

출력

첫째 줄에 전위 순회, 둘째 줄에 중위 순회, 셋째 줄에 후위 순회한 결과를 출력한다. 각 줄에 N개의 알파벳을 공백 없이 출력하면 된다.

예제 입력 1 

7
A B C
B D .
C E F
E . .
F . G
D . .
G . .

예제 출력 1 

ABDCEFG
DBAECFG
DBEGFCA


문제 설명

1. 소인수를 오름차순으로 출력하면 된다.

풀이

1. 에라토스테네스의 체를 사용해서 풀었었다. 하지만 소수들을 구할 필요 없이
2. 2 부터 나눠질 때 마다 연산을 하면 된다.
3. 범위는 i * i >= N 으로 하면 된다. 왜냐하면 합성수 m=ab 일 때, a 또는 b 가 루트m 을 넘을 수 없기 때문이다. a, b 는 양의 정수이다.

코드

문제

정수 N이 주어졌을 때, 소인수분해하는 프로그램을 작성하시오.

입력

첫째 줄에 정수 N (1 ≤ N ≤ 10,000,000)이 주어진다.

출력

N의 인수를 한 줄에 하나씩 증가하는 순서대로 출력한다.

예제 입력 1 

72

예제 출력 1 

2
2
2
3
3

예제 입력 2 

3

예제 출력 2 

3

예제 입력 3 

6

예제 출력 3 

2
3

예제 입력 4 

2

예제 출력 4 

2

예제 입력 5 

9991

예제 출력 5 

97
103

출처


문제 설명

1. 연산자 우선순위와 분배법칙을 알고있는가에 대한 문제

풀이

1. 분배법칙에 의해서 1, 2 번 째 줄이랑 3, 4 번 째 줄이랑 값이 동일하다.
2. 만약 1, 2 그리고 3, 4 를 분배법칙을 풀어서 사용한다면 연산자 우선순위를 고려해야 된다.

코드

문제

(A+B)%C는 (A%C + B%C)%C 와 같을까?

(A×B)%C는 (A%C × B%C)%C 와 같을까?

세 수 A, B, C가 주어졌을 때, 위의 네가지 값을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 A, B, C가 순서대로 주어진다. (2 ≤ A, B, C ≤ 10000)

출력

첫째 줄에 (A+B)%C, 둘째 줄에 (A%C + B%C)%C, 셋째 줄에 (A×B)%C, 넷째 줄에 (A%C × B%C)%C를 출력한다.

예제 입력 1 

5 8 4

예제 출력 1 

1
1
0
0

출처


문제 설명

1. 별 찍기 문제이다. (풀이가 곧 설명)

풀이

1. i 번째 줄에는 N - i 개의 공백이 들어가고 i 개의 "* " 가 들어가면 된다.

코드

문제

예제를 보고 별 찍는 규칙을 유추한 뒤에 별을 찍어 보세요.

입력

첫째 줄에 N (1<=N<=100)이 주어진다.

출력

첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다.

예제 입력 1 

1

예제 출력 1 

*

예제 입력 2 

2

예제 출력 2 

 *
* *

예제 입력 3 

3

예제 출력 3 

  *
 * *
* * *

예제 입력 4 

4

예제 출력 4 

   *
  * *
 * * *
* * * *


문제 설명

1. 각 정점에서의 곧바로 연결된 것은 1 촌 1 개를 걸쳐서 연결된것은 2촌 n 개를 걸쳐서 알게된것은 n + 1촌이다.
2. 최단거리를 구하는 문제이다.

풀이

1. 빠르게 답을 알면 종료하기 위해서 우선순위 큐를 사용했다.
2. 답을 구하지 못해서 무한루프를 도는것을 방지하기 위해 visited 배열을 사용했다.
3. x, y 의 점 중 둘 중 x 로 시작해서 x 로 연결된 점은 bfs 방식으로 모두 탐색해서 최단거리를 구했다. (dijkstra)

코드

문제

우리 나라는 가족 혹은 친척들 사이의 관계를 촌수라는 단위로 표현하는 독특한 문화를 가지고 있다. 이러한 촌수는 다음과 같은 방식으로 계산된다. 기본적으로 부모와 자식 사이를 1촌으로 정의하고 이로부터 사람들 간의 촌수를 계산한다. 예를 들면 나와 아버지, 아버지와 할아버지는 각각 1촌으로 나와 할아버지는 2촌이 되고, 아버지 형제들과 할아버지는 1촌, 나와 아버지 형제들과는 3촌이 된다.

여러 사람들에 대한 부모 자식들 간의 관계가 주어졌을 때, 주어진 두 사람의 촌수를 계산하는 프로그램을 작성하시오.

입력

사람들은 1, 2, 3, …, n (1≤n≤100)의 연속된 번호로 각각 표시된다. 입력 파일의 첫째 줄에는 전체 사람의 수 n이 주어지고, 둘째 줄에는 촌수를 계산해야 하는 서로 다른 두 사람의 번호가 주어진다. 그리고 셋째 줄에는 부모 자식들 간의 관계의 개수 m이 주어진다. 넷째 줄부터는 부모 자식간의 관계를 나타내는 두 번호 x,y가 각 줄에 나온다. 이때 앞에 나오는 번호 x는 뒤에 나오는 정수 y의 부모 번호를 나타낸다.

각 사람의 부모는 최대 한 명만 주어진다.

출력

입력에서 요구한 두 사람의 촌수를 나타내는 정수를 출력한다. 어떤 경우에는 두 사람의 친척 관계가 전혀 없어 촌수를 계산할 수 없을 때가 있다. 이 때에는 -1을 출력해야 한다.

예제 입력 1 

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

예제 출력 1 

3


문제 설명

1. 1씩 증가하는 수열 각 ai 마다 ai 가 i 번 나타나는 수열이다.

풀이

s, e 를 구간으로 생각하고 s 가 왼쪽 끝에 도달하면 값을 더해주기 시작했다.
그러다가 e 도 왼쪽 끝에 도달하면 값을 더하지 않도록 했다.

코드

문제

동호는 내년에 초등학교를 입학한다. 그래서 동호 어머니는 수학 선행 학습을 위해 쉽게 푸는 문제를 동호에게 주었다.

이 문제는 다음과 같다. 1을 한 번, 2를 두 번, 3을 세 번, 이런 식으로 1 2 2 3 3 3 4 4 4 4 5 .. 이러한 수열을 만들고 어느 일정한 구간을 주면 그 구간의 합을 구하는 것이다.

하지만 동호는 현재 더 어려운 문제를 푸느라 바쁘기에 우리가 동호를 도와주자.

입력

첫째 줄에 구간의 시작과 끝을 나타내는 정수 A, B(1≤A≤B≤1,000)가 주어진다. 즉, 수열에서 A번째 숫자부터 B번째 숫자까지 합을 구하면 된다.

출력

첫 줄에 구간에 속하는 숫자의 합을 출력한다.

예제 입력 1 

3 7

예제 출력 1 

15


+ Recent posts