Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

알고리즘 공부방

백준 1744 수 묶기(JAVA) 본문

알고리즘

백준 1744 수 묶기(JAVA)

head89 2022. 12. 12. 21:07

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

 

1744번: 수 묶기

길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에

www.acmicpc.net

 

알고리즘 분류: 그리디 알고리즘, 정렬

 

문제 풀이

먼저 이 문제를 보자마자 생각난 문제가 있었는데, 백준 1461 문제와 비슷하다 생각했다.

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

 

1461번: 도서관

세준이는 도서관에서 일한다. 도서관의 개방시간이 끝나서 세준이는 사람들이 마구 놓은 책을 다시 가져다 놓아야 한다. 세준이는 현재 0에 있고, 사람들이 마구 놓은 책도 전부 0에 있다. 각 책

www.acmicpc.net

왜냐하면, 이 문제에서 양수와 음수가 존재하고, 수를 묶었을 때 최대로 낼 수 있는 값을 찾아야 하기에,

양수는 양수끼리, 음수는 음수끼리 계산하는 것이 가장 큰 수일 것이라는 결론을 내렸기 때문이다.

그래서 처음엔 양수 리스트, 음수 리스트로 나누어 수를 저장한 뒤, 양수는 내림차순, 음수는 오름차순으로 정렬하여

상위 2개를 곱하고, 결과에 더하고, 2개를 못 빼면 그냥 더하고 루프 종료.

이렇게 알고리즘을 생각했었다.

 int index = 0;
        while (index<list.size()){
            if(index + 1 < list.size()){
                sum += (list.get(index) * list.get(index + 1));
                index +=2;
            }
            else{
                sum += list.get(index);
                break;
            }
        }

하지만, 틀렸다.

여기서 놓친것이 하나 있었는데, 2개를 뽑았을 때, 하나라도 1이라면, 곱하는 것보다는 더하는 것이

더 크다는 것을 놓쳤었다.

그래서 다시 수정하여

while (index < list.size()) {
            if (index + 1 < list.size() && list.get(index) != 1 && list.get(index + 1) != 1) {
                sum += (list.get(index) * list.get(index + 1));
                index += 2;
            }
            else {
                sum += list.get(index);
                index++;
            }
        }

이렇게 짜게 되었다.

 

그리고 1을 체크하는 부분은 음수에서는 할 필요가 없다.

음수는 무조건 곱하는 것이 이득이기 때문이다.

 

전체 코드

import java.io.*;
import java.util.*;


public class Main {
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        List<Integer> list = new ArrayList<>();
        List<Integer> reverselist = new ArrayList<>();

        for(int i = 0;i<n;i++){
            int k = Integer.parseInt(br.readLine());
            if(k<=0) reverselist.add(k);
            else list.add(k);
        }

        Collections.sort(list, Collections.reverseOrder());
        Collections.sort(reverselist);

        int sum = 0;

        int index = 0;
        while (index < list.size()) {
            if (index + 1 < list.size() && list.get(index) != 1 && list.get(index + 1) != 1) {
                sum += (list.get(index) * list.get(index + 1));
                index += 2;
            }
            else {
                sum += list.get(index);
                index++;
            }
        }
        index = 0;
        while (index < reverselist.size()){
            if(index + 1 < reverselist.size()){
                sum+= (reverselist.get(index) * reverselist.get(index + 1));
                index +=2;
            }
            else{
                sum+=reverselist.get(index);
                break;
            }
        }
        System.out.println(sum);
    }
}

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

백준 26153 로하의 농사  (0) 2022.12.15
백준 6087 레이저 통신(JAVA)  (0) 2022.12.14
백준 1719 택배(JAVA)  (0) 2022.12.10
백준 14938 서강그라운드(JAVA)  (0) 2022.07.03
백준 2206 벽 부수고 이동하기(JAVA)  (0) 2022.07.01