[백준] 1940_주몽 - JAVA

2023. 1. 31. 21:41·알고리즘/알고리즘 유형
반응형

백준_1940

 

1940번: 주몽

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

www.acmicpc.net

 

투 포인터

투 포인터에 대한 설명은 아래 링크를 참고

 

[백준] 2018_수들의 합5 - JAVA

백준_2018 2018번: 수들의 합 5 어떠한 자연수 N은, 몇 개의 연속된 자연수의 합으로 나타낼 수 있다. 당신은 어떤 자연수 N(1 ≤ N ≤ 10,000,000)에 대해서, 이 N을 몇 개의 연속된 자연수의 합으로 나타

devhan.tistory.com

 

이 문제는 두 재료의 번호의 합을 구하고 크기를 비교하는 문제라 받을 배열을 정렬하여 풀면 굳이 이중 반복문을 사용하지 않을 수 있는 문제다. 이 문제도 투 포인터를 사용하여 풀이하는 문제인데, 먼저 투 포인터의 이동 원칙에 대해 알아보자.

 

투 포인터 이동 원칙

arr[i] + arr[j] > n 이면 j--;
arr[i] + arr[j] < n 이면 i++;
arr[i] + arr[j] == n이면 i++; j--; count++;

위 원칙을 생각하면서 아래 과정을 살펴보자.

 

이 전에 풀었던 투 포인터는 두 개의 투 포인터 모두 배열 앞쪽에서 시작했다. 이번 문제의 투 포인터는 하나는 배열의 맨 앞, 다른 하나는 배열의 맨 뒤에서부터 시작한다.

투 포인터의 이동 원칙해 따라서 위 배열을 계산해보자. arr[i]는 1, arr[j]는 7이다. 둘이 더하면 8이된다. 8은 n인 9보다 작으므로 i++ 코드가 실행된다.

그 다음 반복문에서는 arr[i]가 2, arr[j]가 7이다. 두 개를 더하면 9이고, n과 똑같다. 그러므로 i++, j--, count를 ++ 해주면 된다.

이렇게 반복을 열심히 돌다가 i와 j가 맞닿아있는 시점에 반복문을 종료하면 된다.

 

코드

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));
        StringTokenizer st = new StringTokenizer(br.readLine());
        StringBuilder sb = new StringBuilder(st.toString());

        int n = Integer.parseInt(st.nextToken());
        st = new StringTokenizer(br.readLine());
        int maxN = Integer.parseInt(st.nextToken());

        int[] arr = new int[n];
        st = new StringTokenizer(br.readLine());
        for(int i = 0; i < n; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }

        Arrays.sort(arr);

        int count = 0;
        int i = 0;
        int j = n - 1;

        while(i < j) {
            if(arr[i] + arr[j] < maxN)  i++;
            else if(arr[i] + arr[j] > maxN) j--;
            else {
                count++;
                i++;
                j--;
            }
        }
        System.out.println(count);
    }
}

 

제출 결과

 

 

반응형
저작자표시 비영리 변경금지 (새창열림)
'알고리즘/알고리즘 유형' 카테고리의 다른 글
  • [백준] 12891_DNA 비밀번호 - JAVA
  • [백준] 2018_수들의 합5 - JAVA
  • [백준] 2018_수들의 합5 - JAVA
  • [백준] 10986_나머지 합 - JAVA
데부한
데부한
어차피 할 거면 긍정적으로 하고 싶은 개발자
    반응형
  • 데부한
    동동이개발바닥
    데부한
  • 전체
    오늘
    어제
    • 분류 전체보기 (307)
      • 방통대 컴퓨터과학과 (27)
        • 잡담 (9)
        • 3학년1학기 (17)
      • 프로젝트 및 컨퍼런스 회고 (1)
        • 프로젝트 (4)
        • 한이음 프로젝트 (0)
        • 회고 (3)
      • 공부 (165)
        • Spring (37)
        • JPA (71)
        • 인프런 워밍업 클럽_BE (10)
        • Java (6)
        • React.js (27)
        • 넥사크로 (11)
        • 기타 (3)
      • 알고리즘 (85)
        • 알고리즘 유형 (10)
        • 알고리즘 풀이 (57)
        • SQL 풀이 (18)
      • 에러 해결 (13)
      • 잡담 (7)
        • 국비교육 (2)
        • 구매후기 (5)
        • 진짜 잡담 (0)
  • 블로그 메뉴

    • Github
    • Linkedin
    • 홈
    • 방명록
    • 글쓰기
    • 관리
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    SQL
    코딩테스트
    Java
    인프런
    운영체제
    프로그래머스
    springboot
    Spring
    oracle
    기출문제
    토이프로젝트
    스프링부트
    토비의스프링부트
    QueryDSL
    SpringBoot를 이용한 RESTful Web Service 개발
    전자정부프레임워크
    자바스크립트
    방통대
    에러해결
    프론트엔드
    넥사크로
    알고리즘
    RESTful
    MSA
    백준
    egov
    IT
    react
    JPA
    개발자
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
데부한
[백준] 1940_주몽 - JAVA
상단으로

티스토리툴바