문제 설명

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

풀이

원래는 배열을 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


 N - a수열 = x

a수열은 가격을 읽어볼 수 있는 책의 가격

문제

새 학기를 맞아 상근이는 책을 10권 구입했다. 상근이는 의욕이 너무 앞서서 가격을 조사하지 않고 책을 구입했다. 이제 각 책의 가격을 알아보려고 한다.

하지만, 영수증에는 얼룩이 묻어있었고, 상근이는 책 10권 중 9권의 가격만 읽을 수 있었다.

책 10권의 총 가격과 가격을 읽을 수 있는 9권 가격이 주어졌을 때, 가격을 읽을 수 없는 책의 가격을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 10권의 총 가격이 주어진다. 둘째 줄부터 9개 줄에는 가격을 읽을 수 있는 책 9권의 가격이 주어진다. 책의 가격은 10000이하이다.

출력

첫째 줄에 가격을 읽을 수 없는 책의 가격을 출력한다.

예제 입력 1 

9850
1050
800
420
380
600
820
2400
1800
980

예제 출력 1 

600


10000001000000 을 조심해야 된다. (자료형이 long)

그것만 조심하면 풀기 쉬운 문제다.

문제

네 자연수 A, B, C, D가 주어진다. 이 때, A와 B를 붙인 수와 C와 D를 붙인 수의 합을 구하는 프로그램을 작성하시오.

두 수 A와 B를 합치는 것은 A의 뒤에 B를 붙이는 것을 의미한다. 즉, 20과 30을 붙이면 2030이 된다.

입력

첫째 줄에 네 자연수 A, B, C, D가 주어진다. (1 ≤ A, B, C, D ≤ 1,000,000)

출력

A와 B를 붙인 수와 C와 D를 붙인 수의 합을 출력한다.

예제 입력 1 

10 20 30 40

예제 출력 1 

4060


i  번째 자리는 (16 ^ i - 1) * ni 이다.

시간 제한메모리 제한제출정답맞은 사람정답 비율
2 초128 MB37222384214465.747%

문제

16진수 수를 입력받아서 10진수로 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 16진수 수가 주어진다. 이 수의 최대 길이는 6글자이다. 16진수 수는 0~9와 A~F로 이루어져 있고, A~F는 10~15를 뜻한다. 또, 이 수는 음이 아닌 정수이다.

출력

첫째 줄에 입력으로 주어진 16진수 수를 10진수로 변환해 출력한다.

예제 입력 1 

A

예제 출력 1 

10


문제 설명

1. Connected Component 의 개수를 구하면 된다.
즉 연결되있는 Vertex 끼리 그룹화 시켜서 그룹의 개수를 구하면 됨.

풀이

BFS 를 사용해도 풀 수 있지만, 더 많은 코드가 필요할 것 같아서 dfs 를 사용해서 풀었다.
well-known 문제이기 때문에 설명은 필요없을 것 같다.
1. visited, edges 를 이용해서 품

코드

문제

방향 없는 그래프가 주어졌을 때, 연결 요소 (Connected Component)의 개수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주어진다.

출력

첫째 줄에 연결 요소의 개수를 출력한다.

예제 입력 1 

6 5
1 2
2 5
5 1
3 4
4 6

예제 출력 1 

2

예제 입력 2 

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

예제 출력 2 

1

출처


+ Recent posts