2019. 8. 13. 21:26
728x90

문제 번호: 10989

문제 제목: 수 정렬하기 3

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


문제 내용

최대 1000만개의 숫자를 오름차순으로 출력한다. 입력되는 수는 10000보다 작거나 같은 자연수다.


테스트 케이스

10
5
2
3
1
4
2
3
5
1
7


1
1
2
2
3
3
4
5
5
7


문제 풀이

제목은 정렬하기라고 하지만 처리에는 실제로는 정렬 알고리즘을 사용하지 않는 문제다. 순순히 정렬을 사용해서 풀 경우 매우 오랜 시간이 소요된다. 입력되는 수의 종류가 10000개 이하로 매우 적고, 입력되는 수가 1000만 개까지 되므로 int형 배열 10001개를 선언하여 인덱스를 기록하는 방식으로 진행하여야 한다.

1. int 배열 10001개를 선언한다.
2. 수를 입력 받는다.
3. 입력받의 수의 인덱스에 +1을 한다.
4. 입력이 종료될 때까지 2~3을 반복한다.
5. 1부터 배열에 입력된 수만큼 해당 수를 출력한다.

입출력이 각각 1000만 번씩 이루어지므로 입출력에 소요되는 시간을 최대한 줄여야 한다. 정렬이 아무리 빨라도 입출력이 오래 걸리면 시간 초과가 되기 때문. 빠른 입출력에 대해서는 15552번 문제 설명을 참고하도록 한다.


풀이 코드



728x90

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

백준 1427 - 소트인사이드  (0) 2019.08.19
백준 2108 - 통계학  (0) 2019.08.19
백준 2751 - 수 정렬하기 2  (0) 2019.08.13
백준 2750 - 수 정렬하기  (0) 2019.08.13
백준 1436 - 영화감독 숌  (0) 2019.08.08
Posted by 아야카
2019. 8. 13. 21:05
728x90

문제 번호: 2751

문제 제목: 수 정렬하기 2

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


문제 내용

최대 100만개의 숫자가 주어졌을 때 이를 오름차순으로 출력한다.


테스트 케이스

5
5
4
3
2
1


1
2
3
4
5


문제 풀이

n(log n) 복잡도의 정렬까지 허용되는 문제. algorithm의 sort를 이용해 풀면 된다.
출력이 많으므로 endl은 사용하지 않는다.
algorithm의 sort를 사용하면 ios::ios_base::sync_with_studio(false), cin.tie(NULL)을 적용하여 296ms까지 시간을 줄일 수 있다.


풀이 코드



728x90

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

백준 2108 - 통계학  (0) 2019.08.19
백준 10989 - 수 정렬하기 3  (0) 2019.08.13
백준 2750 - 수 정렬하기  (0) 2019.08.13
백준 1436 - 영화감독 숌  (0) 2019.08.08
백준 1018 - 체스판 다시 칠하기  (0) 2019.08.08
Posted by 아야카
2019. 8. 13. 20:42
728x90

문제 번호: 2750

문제 제목: 수 정렬하기

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


문제 내용

N개의 수가 주어졌을 때 이를 오름차순으로 출력한다.


테스트 케이스

5
5
2
3
4
1


1
2
3
4
5


문제 풀이

버블정렬로 풀어도 0ms로 풀리는 문제다. 적당한 정렬 알고리즘을 사용해서 풀면 된다.
다만, 결과 출력에 줄바꿈을 많이 사용하므로 endl은 사용하지 않도록 한다. 성능저하가 심하다.


풀이 코드


728x90

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

백준 10989 - 수 정렬하기 3  (0) 2019.08.13
백준 2751 - 수 정렬하기 2  (0) 2019.08.13
백준 1436 - 영화감독 숌  (0) 2019.08.08
백준 1018 - 체스판 다시 칠하기  (0) 2019.08.08
백준 7568 - 덩치  (0) 2019.08.08
Posted by 아야카
2019. 8. 8. 14:09
728x90

문제 번호: 1436

문제 제목: 영화감독 숌

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


문제 내용

666을 포함하는 N번째 숫자를 출력한다.


테스트 케이스

1

666

2

1666

10000

2666799


문제 풀이

현재 수 n에 대해 1000으로 나눠서 666이면 횟수를 +1 한다.
아닐 경우 n을 10으로 나눈 몫에 대해 1000으로 나눈 나머지가 666인지 확인한다.
위 과정을 n >= 666인 동안 반복한다.
횟수가 입력받은 N과 동일하면 해당 시점의 숫자를 출력한다.


풀이 코드



728x90

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

백준 2751 - 수 정렬하기 2  (0) 2019.08.13
백준 2750 - 수 정렬하기  (0) 2019.08.13
백준 1018 - 체스판 다시 칠하기  (0) 2019.08.08
백준 7568 - 덩치  (0) 2019.08.08
프로젝트 오일러 문제 18  (0) 2019.08.07
Posted by 아야카
2019. 8. 8. 11:59
728x90

문제 번호: 1018

문제 제목: 체스판 다시 칠하기

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


문제 내용

M * N 크기의 체스판이 주어졌을 때 8*8 크기로 자른 후 흑백이 교대로 나오도록 칸을 교체해야 하는 갯수가 가장 적은 경우는 몇 개인지 출력한다.


테스트 케이스

8 8
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBBBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW

1

8 8
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW

0

8 8
BWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB

0

11 8
BBBBBBBB
BBBBBBBB
BBBBBBBB
BBBBBBBB
BBBBBBBB
BBBBBBBB
BBBBBBBB
BBBBBBBB
BBBBBBBB
BBBBBBBB
BBBBBBBB

32

8 11
BBBBBBBBBBB
BBBBBBBBBBB
BBBBBBBBBBB
BBBBBBBBBBB
BBBBBBBBBBB
BBBBBBBBBBB
BBBBBBBBBBB
BBBBBBBBBBB

32 


문제 풀이

1. 데이터를 입력 받는다. N을 먼저 입력 받고, M을 그 다음에 입력 받는다.
2. 기준이 되는 8 * 9 사이즈 체스판 배열을 만들어 아래와 같이 초기화한다.
WBWBWBWB - WB 판일 때의 비교 시작
BWBWBWBW - BW 판일 때의 비교 시작
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB

3. 입력받은 데이터와 체스판을 !=으로 비교연산 하여 그 합계와 현재 값을 비교한다.
4. 3을 통해 구한 가장 적은 합계를 출력한다.
※ 다른 테스트 케이스는 다 맞는데 11 8, 8 11이 틀린다면 반복문을 돌리는 기준이 잘못됐을 가능성이 높다.


풀이 코드



728x90

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

백준 2750 - 수 정렬하기  (0) 2019.08.13
백준 1436 - 영화감독 숌  (0) 2019.08.08
백준 7568 - 덩치  (0) 2019.08.08
프로젝트 오일러 문제 18  (0) 2019.08.07
백준 2231 - 분해합  (0) 2019.08.07
Posted by 아야카
2019. 8. 8. 09:43
728x90

문제 번호: 7568

문제 제목: 덩치

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


문제 내용

몸무게와 키로 이루어진 덩치값이 주어졌을 때 A가 B보다 몸무게, 키 값이 모두 크면 A는 B보다 덩치가 크다고 한다.
알 수 없을 때는 동일한 덩치라고 한다.
자신보다 덩치가 큰 사람보다는 등수가 낮지만, 자신과 동일한 덩치끼리는 등수가 같다.
덩치값 배열이 주어졌을 때 각자의 등수를 입력된 순서대로 출력한다.


테스트 케이스

5
55 185
58 183
88 186
60 175
46 155

2 2 1 2 5

2
10 10
10 10

1 1

5
10 10
20 20
30 30
40 40
50 50

5 4 3 2 1

5
50 50
40 40
30 30
20 20
10 10

1 2 3 4 5

5
10 50
20 40
30 30
40 20
50 10

1 1 1 1 1


문제 풀이

각 인원에 대해 배열을 할 때 몸무게, 키와 더불어 N으로 초기화 되는 랭킹 변수를 선언한다.
이후 각 인원간에 비교를 진행하면서 A.weight > B.weight && A.height > B.height 처럼 명확한 경우에는 우위가 있는 쪽의 랭킹 값을 1 낮추고, 우위를 가릴 수 없는 경우에는 양쪽 모두의 랭킹값을 낮춘다.
조정이 모두 완료되면 입력된 순서대로 랭킹 값을 출력해준다.


풀이 코드

728x90

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

백준 1436 - 영화감독 숌  (0) 2019.08.08
백준 1018 - 체스판 다시 칠하기  (0) 2019.08.08
프로젝트 오일러 문제 18  (0) 2019.08.07
백준 2231 - 분해합  (0) 2019.08.07
백준 2798 - 블랙잭  (0) 2019.08.07
Posted by 아야카
2019. 8. 7. 18:50
728x90

Maximum path sum I

Problem 18

By starting at the top of the triangle below and moving to adjacent numbers on the row below, the maximum total from top to bottom is 23.

3
7 4
4 6
8 5 9 3

That is, 3 + 7 + 4 + 9 = 23.

Find the maximum total from top to bottom of the triangle below:

75
95 64
17 47 82
18 35 87 10
20 04 82 47 65
19 01 23 75 03 34
88 02 77 73 07 63 67
99 65 04 28 06 16 70 92
41 41 26 56 83 40 80 70 33
41 48 72 33 47 32 37 16 94 29
53 71 44 65 25 43 91 52 97 51 14
70 11 33 28 77 73 17 78 39 68 17 57
91 71 52 38 17 14 91 43 58 50 27 29 48
63 66 04 68 89 53 67 30 73 16 69 87 40 31
04 62 98 27 23 09 70 98 73 93 38 53 60 04 23

NOTE: As there are only 16384 routes, it is possible to solve this problem by trying every route. However, Problem 67, is the same challenge with a triangle containing one-hundred rows; it cannot be solved by brute force, and requires a clever method! ;o)

최상단 시작 지점에서 가장 아래층까지 내려가면서 거치는 경로 중 값의 합이 가장 큰 값은 몇인가.

목적지가 어디가 될지 알 수 없으므로 목적이 후보에서부터 출발지로 거슬러 올라가는 방식으로 구해야 한다. i + 1의 값과 i의 값을 합하여 합계가 큰 쪽은 남겨두는 방식으로 출발지점까지 거슬러 올라가면 합계가 가장 큰 값을 빠르게 구할 수 있다.
설명으로 나온 숫자 배열을 예로 들면 아래와 같이 진행된다.

이와 같은 방식으로 진행하면 결과 값을 빠르게 얻을 수 있다.



728x90

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

백준 1018 - 체스판 다시 칠하기  (0) 2019.08.08
백준 7568 - 덩치  (0) 2019.08.08
백준 2231 - 분해합  (0) 2019.08.07
백준 2798 - 블랙잭  (0) 2019.08.07
백준 1002 - 터렛  (0) 2019.08.06
Posted by 아야카
2019. 8. 7. 18:01
728x90

문제 번호: 2231

문제 제목: 분해합

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


문제 내용

분해합은 숫자 i에 i의 각 자리 수를 모두 합한 값을 의미한다. i를 분해합하여 N이 나오는 경우 i는 N의 생성자라 한다.
입력된 수 N의 생성자를 출력한다.


테스트 케이스

1

0

2

1

216

198

999999

999954

1000000

0


문제 풀이

브루트 포스로 푸는 문제지만, 1부터 시작하는건 매우 비효율적이므로 범위를 어느 정도 좁힐 필요가 있다.
생성자 수 + 생성자의 각 숫자를 모두 합해서 N이 나와야 하므로 (N - 자리수 * 9) ~ (N - 1) 이 탐색 범위가 된다.
10 이하인 수는 짝수에게만 생성자가 있으므로 그에 맞춰 코드를 작성하면 된다.


풀이 코드



728x90

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

백준 7568 - 덩치  (0) 2019.08.08
프로젝트 오일러 문제 18  (0) 2019.08.07
백준 2798 - 블랙잭  (0) 2019.08.07
백준 1002 - 터렛  (0) 2019.08.06
백준 3053 - 택시 기하학  (0) 2019.08.06
Posted by 아야카