이 영역을 누르면 첫 페이지로 이동
codesche's blog 블로그의 첫 페이지로 이동

codesche's blog

페이지 맨 위로 올라가기

codesche's blog

1940. 주몽

  • 2022.12.25 14:30
  • Algorithm/백준

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

 

1940번: 주몽

첫째 줄에는 재료의 개수 N(1 ≤ N ≤ 15,000)이 주어진다. 그리고 두 번째 줄에는 갑옷을 만드는데 필요한 수 M(1 ≤ M ≤ 10,000,000) 주어진다. 그리고 마지막으로 셋째 줄에는 N개의 재료들이 가진 고

www.acmicpc.net

이 문제는 투 포인터와 정렬을 개념을 활용하여 푸는 문제입니다. N의 최대 범위가 15000까지이기 때문에 시간 복잡도에 있어서 다소 자유도가 있는 편입니다. 정렬을 사용해도 크게 문제가 없습니다. 입력받은 N개의 재룟값을 정렬한 후에 양쪽 끝의 위치를 투 포인터로 지정해 문제에 접근해주시면 됩니다.

 

*풀이

1. 재료 데이터를 배열에 저장한 후 오름차순 정렬합니다. 여기서 Arrays.sort를 써도 시간 복잡도상 크게 문제가 되지는 않습니다.

 

 

 

2. 투 포인터 i와 j를 양쪽 긑에 위치시킨 후 문제의 조건에 적합한 포인터 이동 원칙을 활용하여 탐색을 수행합니다. 일단 투 포인터 이동 원칙을 간단하게 정리해보자면 이렇습니다.

 

** 투 포인터 이동 원칙 **

* arr[i] + arr[j] > M: j--;

=> 번호의 합이 M보다 크므로 큰 번호 index를 감소시켜줍니다.

 

* arr[i] + arr[j] < M; i+=;

=> 번호의 합이 M보다 작으므로 작은 번호 index를 증가시켜줍니다.

 

* arr[i] + arr[j] == M; i++; j--; count++;

=> 양쪽 포인터를 모두 이동시키고 count를 증가시켜줍니다.

 

3. 2단계를 i와 j가 만날 때까지 반복합니다. 반복이 끝나면 count를 출력해줍니다.

 

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
32
33
34
35
36
37
38
39
40
41
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
 
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
        int N = Integer.parseInt(br.readLine());
        int M = Integer.parseInt(br.readLine());
 
        int arr[] = new int[N];
 
        StringTokenizer st = new StringTokenizer(br.readLine());
        for (int i = 0; i < N; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }
 
        Arrays.sort(arr);
 
        int i = 0;
        int j = arr.length - 1;
        int count = 0;
 
        while (i < j) {
            if (arr[i] + arr[j] < M) {
                i++;
            } else if (arr[i] + arr[j] > M) {
                j--;
            } else {
                i++;
                j--;
                count++;
            }
        }
        System.out.println(count);
    }
}
 
Colored by Color Scripter
cs

'Algorithm > 백준' 카테고리의 다른 글

11720. 숫자의 합 구하기  (0) 2022.12.23
1110. 더하기 사이클  (0) 2022.12.08

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • 11720. 숫자의 합 구하기

    11720. 숫자의 합 구하기

    2022.12.23
  • 1110. 더하기 사이클

    1110. 더하기 사이클

    2022.12.08
다른 글 더 둘러보기

정보

codesche's blog 블로그의 첫 페이지로 이동

codesche's blog

  • codesche's blog의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 방명록

카테고리

  • 분류 전체보기 (76)
    • Algorithm (15)
      • 백준 (3)
      • 프로그래머스 (10)
      • inflearn 알고리즘(Java) (2)
    • 블로그소개 (1)
    • Back-End (11)
      • Java (10)
      • SpringBoot (1)
    • Database (2)
      • MySQL (0)
      • MariaDB (1)
      • Redis (0)
      • 개념, 이론 (1)
    • Front-End (0)
      • html, css, javascript (0)
    • Git (2)
    • 알고리즘 지식 (11)
      • 자료구조 (11)
    • Study Cafe (21)
      • 기술면접 (6)
      • Clean Code 스터디 (14)
      • CS 스터디 (0)
      • 개발용어 (1)
    • 주간 에세이 (10)
    • DevOps (3)
      • 배포, Front&Back 연동 (1)
      • AWS (0)
      • Docker (1)
      • 이론 (1)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • 자료구조
  • 자바 기초
  • git commit
  • 주간에세이
  • java
  • 자바 변수
  • 클린코드
  • 개발자 현실

나의 외부 링크

정보

The Code의 codesche's blog

codesche's blog

The Code

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © The Code. Designed by Fraccino.

티스토리툴바