강잇
강이의 개발블로그
강잇
전체 방문자
오늘
어제
  • 분류 전체보기 (102)
    • Langauge (32)
      • Java-basic (29)
      • Java (3)
    • SpringBoot (7)
    • Algorithm (5)
      • BAEKJOON (5)
    • WEB (7)
      • HTML & CSS (7)
    • DB (1)
      • MySQL (1)
    • OS (17)
      • Mac (2)
      • Linux (4)
      • Terminal Command (11)
    • Computer Science (7)
      • Hard ware (1)
      • Database (1)
      • Data structure (2)
      • Algorithm (2)
      • Network (1)
    • Git (5)
      • 개념 (1)
      • 활용 (1)
      • Trouble Shooting (2)
    • ETC. (13)
      • Install (6)
      • IntelliJ (1)
      • Eclipse (2)
      • Error (3)
      • Tip (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 메서드
  • 메소드
  • 자바
  • 백준
  • CSS 속성
  • 알고리즘 공부
  • CSS 박스 크기 설정
  • til

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
강잇
Algorithm/BAEKJOON

[백준] 3273 두 수의 합 - Java

[백준] 3273 두 수의 합 - Java
Algorithm/BAEKJOON

[백준] 3273 두 수의 합 - Java

2022. 7. 2. 23:52

문제

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

 

3273번: 두 수의 합

n개의 서로 다른 양의 정수 a1, a2, ..., an으로 이루어진 수열이 있다. ai의 값은 1보다 크거나 같고, 1000000보다 작거나 같은 자연수이다. 자연수 x가 주어졌을 때, ai + aj = x (1 ≤ i < j ≤ n)을 만족하는

www.acmicpc.net

문제 풀이

문제 분류에서도 정렬과 두 포인터로 분리되어 있고, 문제를 들어가면서도 투 포인터를 써보라고 하여 투 포인터를 이용하여 문제를 풀어보려 한다.

문제의 조건은 백준에서의 예제로 한다.

9
5 12 7 10 9 1 2 3 11
13

투 포인터를 사용하기 위해선 일단 배열을 정렬된 상태로 만들어줘야 한다.

그림과 비교하며 보기에는 오름차순으로 정렬하는게 좋을 것 같아 오름차순으로 정렬함.

정렬된 상태를 만들었으면 두 개의 포인터를 설정한다.

두 개의 포인터를 설정하였으면 두 포인터가 한 지점이 될 때 까지 다음 질의를 반복한다.

  • start point + end point > x 인가?
    • x보다 크기때문에 숫자를 줄여야 한다. 따라서 end point를 왼쪽으로 한 칸 옮긴다.
  • start point + end point < x 인가?
    • x보다 작기때문에 숫자를 증가시켜야 한다. 따라서 start point를 오른쪽 한 칸 옮긴다.
  • start point + end point == x 인가?
    • 한 쌍을 구하였기 때문에 start point를 오른쪽으로 한 칸, end point를 왼쪽으로 한 칸 옮긴다.
    • 한 쌍에 대한 count는 따로 세도록 한다.

코드 1. 위의 풀이 방식을 그대로 구현

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());
        StringTokenizer st = new StringTokenizer(br.readLine());
        int x = Integer.parseInt(br.readLine());
        
        // 배열 생성
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }
        // 배열 정렬
        Arrays.sort(arr);

        int startPoint = 0;
        int endPoint = n - 1;
        int count = 0;
        int temp = 0;
        
        // start point와 end point가 만날 때까지 반복
        while (startPoint < endPoint) {
            temp = arr[startPoint] + arr[endPoint];
            // start point + end point > x ?
            if (temp > x) {
                // end point 왼쪽으로 한 칸 이동
                endPoint--;
            }
            // start point + end point < x ?
            else if (temp < x) {
                // start point 오른쪽으로 한 칸 이동
                startPoint++;
            }
            // start point + end point == x ?
            else {
                // start point 오른쪽으로, end point 왼쪽으로 한 칸씩 이동
                startPoint++;
                endPoint--;
                count++;
            }
        }
        System.out.println(count);
        br.close();
    }
}

 

저작자표시 (새창열림)

'Algorithm > BAEKJOON' 카테고리의 다른 글

[백준] 10828번 : 스택 [Java - 자바]  (0) 2022.07.25
[백준] 2559 수열  (0) 2022.06.25
[백준] 11659 구간 합 구하기 4 - Java  (0) 2022.06.24
[백준] 11660 구간 합 구하기 5 - Java  (0) 2022.06.23
  • 문제
  • 문제 풀이
  • 코드 1. 위의 풀이 방식을 그대로 구현
  •  
'Algorithm/BAEKJOON' 카테고리의 다른 글
  • [백준] 10828번 : 스택 [Java - 자바]
  • [백준] 2559 수열
  • [백준] 11659 구간 합 구하기 4 - Java
  • [백준] 11660 구간 합 구하기 5 - Java
강잇
강잇
학습한 내용을 정리 및 기록하는 블로그

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.