sanhaa
sanha story
sanhaa
전체 방문자
오늘
어제
  • 분류 전체보기 (93)
    • 일상 (3)
    • Programming (42)
      • Back-end Language (32)
      • Front-end Language (8)
      • Database Language (2)
    • Etc. (35)
      • Coding Test (23)
      • Algorithm (7)
      • Data structure (1)
      • IDE (1)
      • Job Preparation (3)
    • Project (3)
    • Engineer Information Proces.. (10)
    • secret space (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 삼발자 #일상
  • 1253번
  • 프로그래머스
  • 신고받기
  • 백준
  • Spring
  • hash #java #프로그래머스 #코딩테세트 #백준
  • Java
  • 자바
  • spring #java #k6 #
  • 사이드 프로젝트 #여기로모여라 #web socket #실시간 위치공유
  • DDL #SQL #DB #정보처리기사 #SQL응용 #MySQL
  • 시간복잡도 #JAVA #코딩테스트
  • 주몽의명령
  • JAVA 구간 합 구하기
  • 코딩테스트
  • 알고리즘
  • 정처기 #DCL #SQL #DB
  • 스택
  • oEmebed
  • 연속된 자연수의 합 구하기
  • 투 포인트 알고리즘
  • DML #정처기 #시나공 #SQL #MYSQL #SPRING #JAVA
  • connection reset by peer
  • 큐
  • 백준 2018번
  • DFS #백준
  • 정보처리기사 #정처기 #기출 #2021기출
  • JAVA #백준 #구간합
  • iterator #

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
sanhaa

sanha story

[백준] 1253번 '좋은 수' 구하기
Etc./Coding Test

[백준] 1253번 '좋은 수' 구하기

2022. 5. 11. 22:52

문제설명

더보기

문제

N개의 수 중에서 어떤 수가 다른 수 두 개의 합으로 나타낼 수 있다면 그 수를 “좋다(GOOD)”고 한다.

N개의 수가 주어지면 그 중에서 좋은 수의 개수는 몇 개인지 출력하라.

수의 위치가 다르면 값이 같아도 다른 수이다.

 

입력

첫째 줄에는 수의 개수 N(1 ≤ N ≤ 2,000), 두 번째 줄에는 i번째 수를 나타내는 Ai가 N개 주어진다. (|Ai| ≤ 1,000,000,000, Ai는 정수)

 

출력

좋은 수의 개수를 첫 번째 줄에 출력한다.

문제풀이

시간복잡도

N의 최대 개수가 최대 2000이라 가정해도 좋은 수 하나를 찾는 알고리즘의 시간복잡도는 N^2보다 작아야 한다. 따라서 알고리즘의 시간 복잡도는 최소 O(nlongn)이어야 한다. 따라서 투 포인터 알고리즘을 사용하면 된다.

 

1. n, result , startIndex , endIndex list,  선언2. for문을 돌면서 list 0인덱스부터 마지막 인덱스 까지 while문을 통해 확인3. while문은 startindex + endindex 합이 for문 i번째 인덱스와 비교하여 같으면 출력4. 조건에 정렬된 데이터에 자기 자신을 좋은 수 만들기에  미포함이기 때문에 한번더 걸러준다. (startIndex와 i가 같거나, endIndex와 i가 같은경우)

 

package doit_java;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;

public class doit_8_좋은수구하기 {
    public static void main(String[] args) throws IOException {
        //N, list 입력받기
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());

        st = new StringTokenizer(br.readLine());
        ArrayList<Integer> list = new ArrayList<>(n);
        for (int i = 0; i < n; i++) {
            list.add(Integer.parseInt(st.nextToken()));
        }

        Collections.sort(list);
        int result = 0;
        for(int i=0; i<n; i++) {
        int startIndex = 0;
        int endIndex = n - 1;
        long find = list.get(i);
        while (startIndex < endIndex) {
            //find는 서로 다른 두 수의 합이어야 함을 체크
            if(list.get(startIndex) + list.get(endIndex) == find){
                if(startIndex!=i && endIndex!=i){
                    result++;
                  break;
                }
                else if(startIndex==i){
                    startIndex++;
                }
                else{endIndex--;}
            }
            else if(list.get(startIndex)+ list.get(endIndex)<find){
                startIndex++;
            }
            else{endIndex--;}

        }
    }
        System.out.println(result);


    }



}

 

 

투 포인터 알고리즘이 궁금하면 확인 하시길 ! 

 

[알고리즘] Two Pointers 알고리즘이란?

투포인터 알고리즘이란? 투포인터 알고리즘 또는 슬라이딩 윈도우라고 부른다. 1차원 배열이 있고, 배열에서 각자 다른 원소를 카리키고 있는 2개의 포인터를 조작하면서 원하는 값을 얻는 방법

san-tiger.tistory.com

 

저작자표시 비영리 변경금지 (새창열림)

'Etc. > Coding Test' 카테고리의 다른 글

[백준] 2164번 카드 게임  (0) 2022.05.16
[백준]1874번 스택으로 오름차순 수열 만들기  (4) 2022.05.13
[백준] 1940번 주몽의 명령  (0) 2022.05.10
[백준] 2018번 연속된 자연수의 합 구하기  (0) 2022.05.10
[백준] 11660번 구간 합 구하기-2  (0) 2022.05.09
    'Etc./Coding Test' 카테고리의 다른 글
    • [백준] 2164번 카드 게임
    • [백준]1874번 스택으로 오름차순 수열 만들기
    • [백준] 1940번 주몽의 명령
    • [백준] 2018번 연속된 자연수의 합 구하기
    sanhaa
    sanhaa
    sanha history book

    티스토리툴바