본문 바로가기

알고리즘/Baekjoon

탐욕법. [1789, 10162, 10610]

[1. 문제 설명]

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

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

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


[2. 풀이 접근]

=== 문제 10162 ===

이 문제는 아래 링크에서 5585 와 비슷한 방식으로 접근하면 된다.

버튼을 최소한으로 눌러야 하므로, 동작 시간이 긴 전자레인지를 최대한 많이 사용하는 것이다.


=== 문제 1789 ===

서로 다른 자연수를 최대한 많이 사용하려면, 가장 작은 자연수부터 사용하면 된다.

1 부터 계속 더해나가다가, 그 합이 S 이상이 된 경우를 멈춘다.

이 때 두가지 경우가 있다.

  1. 그 합이 정확히 S 인 경우,
    => 지금까지 사용한 자연수 개수가 답이 된다.

  2. 그 합이 S 를 초과하는 경우,
    => 이번에 더한 자연수로 인해 합이 S 를 초과하였으므로
    => 바로 이전까지 사용한 자연수 개수가 답이된다.
    => 만약, 자연수들을 출력해야 한다면
    => 초과하기전 합과 S 의 차이를 구한 뒤, 이 차이(diff) 를 가장 마지막에 더한 자연수에 더해주면 된다.
    => 1 ~ K 까지는 서로 겹치지 않는다. 
    => 따라서 (K + diff) 역시 1 ~ (K-1) 과 겹치지 않는다.

=== 문제 10610 ===

30은  2*5*3 이므로, 30의 배수는 2의 배수이면서, 5의 배수이기도 하고 3의 배수가 되기도 한다. 

2*5 는 10이므로 10의 배수는 항상 0으로 끝나야 한다.

  • 입력으로 받는 숫자에서 0 이 없으면, 30의 배수를 만들 수 없다.

3 의 배수는 그 숫자들의 합이 항상 3의 배수가 된다.

  • 111 의 각 자리의 합이 3 이며, 3으로 나누어 떨어진다.
  • 즉, 입력으로 받는 숫자에서 0을 제외한 각 자리의 합이 3의 배수가 아니면, 30의 배수를 만들 수 없게 된다.

위 두가지 경우를 모두 만족하면, 어떻게 배치해도 30의 배수를 만들 수 있다.

문제에서 원하는 값은 가장 큰 30의 배수이므로, 큰 값이 가장 큰 자리수에 와야 한다.

  • 탐욕법을 적용하여, 큰 값이 가장 큰 자리수에 오도록 코드를 작성한다.

주의사항

  • 입력으로 주어지는 숫자의 길이는 100,000 이다.
    => 정수형 범위의 데이터가 아니다.
  • 문자열로 입력을 받아야한다.

[3. 코드 - 10162]


[3. 코드 - 1789]


[3. 코드 - 10610]

 

 

'알고리즘 > Baekjoon' 카테고리의 다른 글

이분 탐색. [1072]  (0) 2023.01.26
탐욕법. [1946]  (0) 2023.01.19
탐욕법. [5585 / 2217]  (0) 2023.01.16
동적계획법. [11055]  (0) 2023.01.14
동적계획법. [11057]  (0) 2023.01.12