https://www.acmicpc.net/problem/10610

 

10610번: 30

문제 어느 날, 미르코는 우연히 길거리에서 양수 N을 보았다. 미르코는 30이란 수를 존경하기 때문에, 그는 길거리에서 찾은 수에 포함된 숫자들을 섞어 30의 배수가 되는 가장 큰 수를 만들고 싶어한다. 미르코를 도와 그가 만들고 싶어하는 수를 계산하는 프로그램을 작성하라. 입력 N을 입력받는다. N는 최대 105개의 숫자로 구성되어 있으며, 0으로 시작하지 않는다. 출력 미르코가 만들고 싶어하는 수가 존재한다면 그 수를 출력하라. 그 수가 존재하지 않는

www.acmicpc.net

- 일단 정수론을 저도 잘하지 않았지만 아주 기본인 3의배수 이려면 각자리 숫자의 합이 3의 배수여야 한다는 것.

 

- 그리고 출력 부분에 있어서 그리디 를 통해서 큰수부터 내림 차순으로 출력하면 된다는 것

  

- 그리고 입력은 매우 큰 숫자일 수 있으므로 문자열을 이용해야 한다는 것 

(정수 형을 나타내는 기본 자료형으로는 입력을 받을 수 없다.)

 

<필기>

<코드>

'알고리즘 문제풀이 > 그리디' 카테고리의 다른 글

백준 1541  (0) 2020.02.20
백준 2875  (0) 2020.02.11
백준 2217  (0) 2020.02.10
백준 1931  (0) 2020.02.05
백준 11047  (0) 2020.02.05

https://www.acmicpc.net/problem/2217

 

2217번: 로프

N(1≤N≤100,000)개의 로프가 있다. 이 로프를 이용하여 이런 저런 물체를 들어올릴 수 있다. 각각의 로프는 그 굵기나 길이가 다르기 때문에 들 수 있는 물체의 중량이 서로 다를 수도 있다. 하지만 여러 개의 로프를 병렬로 연결하면 각각의 로프에 걸리는 중량을 나눌 수 있다. k개의 로프를 사용하여 중량이 w인 물체를 들어올릴 때, 각각의 로프에는 모두 고르게 w/k 만큼의 중량이 걸리게 된다. 각 로프들에 대한 정보가 주어졌을 때, 이 로프들을

www.acmicpc.net

-문제를 읽어보고 예시를 한번 그려보았더니 로프가 버틸 수 있는 중량의 

 

-입력 값이 어떻게 주어지냐에 따라서 들 수 있는 최대 무게가 많이 달라질 수 있는 문제였습니다.

 

-몇개의 로프를 선택 하던 간에 그 로프들로 들 수 있는 중량의 최대 무게는

 

- (로프 중 가장적은 무게를 들수 있는 중량) * (로프의 개수) 입니다.

 

-로프  n개 선택 한다고 치면 큰 무게를 들 수 있는 로프를 두고 적은 무게를 들 수 있는 로프를 선택할 이유 가 없으므로

 

-큰것들 부터 n개를 선택 해 가면서 반복문을 1회 돌면서 그 값들을 비교하면 되는 문제 였습니다.

 

- 내림차순으로 정렬 후 앞에서 부터 로프의 개수를 하나씩 늘려가며 최대값만 저장 후 출력하였습니다.

 

<필기>

 

<코드>

 

 

'알고리즘 문제풀이 > 그리디' 카테고리의 다른 글

백준 2875  (0) 2020.02.11
백준 10610  (0) 2020.02.10
백준 1931  (0) 2020.02.05
백준 11047  (0) 2020.02.05
백준 11399  (0) 2020.02.05

https://www.acmicpc.net/problem/1931

 

1931번: 회의실배정

(1,4), (5,7), (8,11), (12,14) 를 이용할 수 있다.

www.acmicpc.net

회의실 배정에 관한 문제이다.

 

그리디 알고리즘 에 해당하는 문제이다

 

(기준은 끝나는 시간!) 빨리 끝내고 다른 회의를 최대한 넣어야 하기 때문이다. 이는 조금만 생각해도 알수 있었다.

 

하지만 처음짠 코드에서 채점 87%정도에서 틀렸습니다 ! 를 많이 보았는데

 

내가 고려하지 않은 반례가 테스트케이스에 있다는 것이였는데... 찾는데 꽤 오래걸렸다.

 

그것은 바로 끝나는 시간만을 기준으로 정렬을 했기 때문 이였다.

 

예를 들면 시작/끝이 3/3 3/3 1/3 같은 경우 회의 3개를 진행할 수 있는 것인데

 

조건에서 파악하여 앞에 두개 3/3 3/3은 카운트 할 수 있었으나

 

3/3을 해버리면 currenttime을 3으로 바꾸어 버리기 때문에 1/3이 카운트 되지 않는다.

 

즉 끝나는 시간이 같다면 시작시간이 먼저인것을 앞에 두게 정렬을 하여야 한다.

 

<필기>

 

<코드>

 

 

'알고리즘 문제풀이 > 그리디' 카테고리의 다른 글

백준 2875  (0) 2020.02.11
백준 10610  (0) 2020.02.10
백준 2217  (0) 2020.02.10
백준 11047  (0) 2020.02.05
백준 11399  (0) 2020.02.05

동전 문제입니다.

 

처음에 입력조건을 꼼꼼하게 파악하지 않아 다른 경우의 수 를 생각 하다가

 

다시 문제를 보니 생각보다 훨씬 쉬운 문제였습니다..

 

필기노트에 기재되어 있습니다.

 

<필기>

 

<코드>

'알고리즘 문제풀이 > 그리디' 카테고리의 다른 글

백준 2875  (0) 2020.02.11
백준 10610  (0) 2020.02.10
백준 2217  (0) 2020.02.10
백준 1931  (0) 2020.02.05
백준 11399  (0) 2020.02.05

https://www.acmicpc.net/problem/11399

 

11399번: ATM

첫째 줄에 사람의 수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어진다. (1 ≤ Pi ≤ 1,000)

www.acmicpc.net

그리디 알고리즘 기본문제 인 것 같다.

 

대기시간이 최소로 되게끔( 대기시간의 총합)

 

어쩌면 형평성 측면에서는 잘못되었다고도 할 수 있겠다..... 오직 효율성 만을.....

 

문제자체는 간단하고 쉽습니다.

 

오름차순 정렬을 시킨후 이전까지 걸렸던 시간과 그 사람이 걸리는 시간을 합을 더해서 

 

총 결과(합) 에 더해주고 그 자신이 걸리는 시간이 들어있던 배열에 그 자신을 포함한 걸린 시간을 넣어주면 되겠습니다.

 

<필기>

 

<코드>

'알고리즘 문제풀이 > 그리디' 카테고리의 다른 글

백준 2875  (0) 2020.02.11
백준 10610  (0) 2020.02.10
백준 2217  (0) 2020.02.10
백준 1931  (0) 2020.02.05
백준 11047  (0) 2020.02.05

https://www.acmicpc.net/problem/1966

 

1966번: 프린터 큐

문제 여러분도 알다시피 여러분의 프린터 기기는 여러분이 인쇄하고자 하는 문서를 인쇄 명령을 받은 ‘순서대로’, 즉 먼저 요청된 것을 먼저 인쇄한다. 여러 개의 문서가 쌓인다면 Queue 자료구조에 쌓여서 FIFO - First In First Out - 에 따라 인쇄가 되게 된다. 하지만 상근이는 새로운 프린터기 내부 소프트웨어를 개발하였는데, 이 프린터기는 다음과 같은 조건에 따라 인쇄를 하게 된다. 현재 Queue의 가장 앞에 있는 문서의 ‘중요도’를

www.acmicpc.net

큐를 이용한 문제입니다.

 

문제조건은 상세하게 나와있는 편입니다.

 

다만 입력조건 중 말이 헷갈리는 부분이 나와서 이는 필기노트에 제가 이해하기 쉬운 말로 바꾸어 놓았습니다.

 

그리고 queue는 순회가 안되므로( for문을 이용하여 배열처럼 쉽게 탐색이 안됨)

 

어떻게 할까 생각을 하다가 중요도를 따로 담은 vector를 소팅을 시키고

 

현재 중요도를 가리키는 변수 n을 선언하여 가장 높은 중요도를 가진 문서가 queue에서 pop()

 

되어 프린트가 되면 n을 1증가시켜 두번쨰 높은 중요도를 가리키게끔 하였습니다.

 

필기노트를 보시면 이해가 빠르리라 생각합니다.

 

다른분들은 어떻게 푸셨는지 모르겠네요. 한번 찾아봐야겠네요!.

<필기>

<코드>

'알고리즘 문제풀이 > ' 카테고리의 다른 글

백준 1655 [C++]  (0) 2020.11.29
백준 1715 [C++]  (0) 2020.10.25

https://www.acmicpc.net/problem/6603

 

6603번: 로또

문제 독일 로또는 {1, 2, ..., 49}에서 수 6개를 고른다. 로또 번호를 선택하는데 사용되는 가장 유명한 전략은 49가지 수 중 k(k>6)개의 수를 골라 집합 S를 만든 다음 그 수만 가지고 번호를 선택하는 것이다. 예를 들어, k=8, S={1,2,3,5,8,13,21,34}인 경우 이 집합 S에서 수를 고를 수 있는 경우의 수는 총 28가지이다. ([1,2,3,5,8,13], [1,2,3,5,8,21], [1,2,3,5,8,34], [1,2

www.acmicpc.net

dfs라고 보면 dfs인 것 같기도 한데

 

많은 분들이 dfs와 백트래킹 이라고 많이 하시던데 그렇게들 푸시고

 

아직 이에대한 개념이 충분치 않아서....... 좀 오래걸리기도 했고 사실 아직도 잘 모르겠습니다...

 

다른분들의 코드도 보고 참고 하였습니다. 

 

일단은 이해를 하는 것을 우선으로 두기로 하였습니다........... 공부 해야겠네요....

 

저처럼 이해가 안되실 분 들을 위해 가능한 쉽게 제가 이해한 방식을 올리겠습니다.

 

<필기>

 

<코드>

 

'알고리즘 문제풀이 > 완탐' 카테고리의 다른 글

백준 1748 : 수 이어 쓰기 1  (0) 2020.03.24
완전탐색(경우의 수) , 순열, 재귀를 통한 구현, 모든 카드 경우의 수  (0) 2020.02.28
백준 14889  (0) 2020.02.24
백준 14888  (0) 2020.02.21
백준 7568  (0) 2020.02.21

https://www.acmicpc.net/problem/2579

 

2579번: 계단 오르기

계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. <그림 1>과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점수를 얻게 된다. 예를 들어 <그림 2>와 같이 시작점에서부터 첫 번째, 두 번째, 네 번째, 여섯 번째 계단을 밟아 도착점에 도달하면 총 점수는 10 + 20 + 25 + 20 = 75점이 된다. 계단 오르는 데는 다음과 같은 규칙이 있다. 계단은 한 번에 한 계단씩

www.acmicpc.net

다이나믹 프로그래밍을 이용하였습니다.

 

조건3개를 잘 파악한 후 고민을 좀 했는데

 

2번째 문제 조건을 잘 이용해야 했습니다.

 

목표계단을 무조건 밟아야 한다는 가정하에(조건3)

 

두가지 경우의 수가 나옵니다 (조건1)

 

1) 바로 전계단을 밟고 목표계단을 밟는경우

 

2) 전전계단을 밟고 목표계단을 밟는 경우

 

하지만 1번 조건을 그대로 적용할 경우 3번연속된 계단을 밟게 되는 경우가 생길수 있습니다.(즉 조건2 를 무시한 상태)

 

즉 전계단을 밟기전에는 전전전계단을 밟았어야 한다는 조건이 들어가야 합니다.(조건추가)

 

dp는 최대값을 저장한 배열이고 stairvalue는 각 계단의 값을 넣어놓은 배열 입니다.

 

<필기>

<코드>

'알고리즘 문제풀이 > 다이나믹 프로그래밍' 카테고리의 다른 글

백준 11726 [C++]  (0) 2020.12.14
백준 7570 [C++]  (0) 2020.12.02
백준 12865 [C++]  (0) 2020.11.29
백준 1932  (0) 2020.03.02
백준 9095  (0) 2020.02.01

+ Recent posts