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

2023. 1. 29. 21:32·알고리즘/알고리즘 유형
반응형

백준_2018

 

2018번: 수들의 합 5

어떠한 자연수 N은, 몇 개의 연속된 자연수의 합으로 나타낼 수 있다. 당신은 어떤 자연수 N(1 ≤ N ≤ 10,000,000)에 대해서, 이 N을 몇 개의 연속된 자연수의 합으로 나타내는 가지수를 알고 싶어한

www.acmicpc.net

 

투 포인터

투 포인터는 말 그대로 2개의 포인터이다. 이 두 개의 포인터를 이용해서 알고리즘의 시간 복잡도를 최적화할 수 있다.

예제에 나온대로 N의 값이 15라 할때 연속된 자연수의 합은 15(자기 자신), 7+8, 4+5+6, 1+2+3+4+5 이렇게 4개이다. 

연속된 자연수의 합을 구하는 문제이므로 시작 인덱스와 종료 인덱스를 지정하여 연속된 수의 범위를 표현한다.

 

투 포인터의 이동 원칙

sum > N : sum -= startIdx; startIdx++:
sum < N : sum += endIdx; endIdx++;
sum == N : endIdx++; sum += endIdx; count++;

 

간략하게 N이 10이라 가정해보자. 그림으로 배열을 예시들어 설명했지만 굳이 배열을 생성하지 않아도 풀 수 있는 문제이다.

뒷부분 생략

startIdx가 노랑, endIdx가 파랑이다. 반복문을 한 번 돈 상태이며 sum의 값은 6, count는 1이다. count는 자기 자신을 카운트해서 1이라는 숫자로 초기화 해 놓은 상태이다. 현재 상태에서 sum은 N보다 작으므로 투 포인터 이동 원칙에 따라 sum에 endIdx를 누적 저장하고 endIdx값을 증가한다.

이제 sum은 10, count는 1이다. sum과 N의 값이 같으므로 투 포인터 이동 원칙에 따라 endIdx를 증가시키고, sum에 endIdx를 누적 저장한 뒤 count를 증가시킨다. 

이런 식으로 endIdx가 N이 될때까지 반복하면 된다.

 

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
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());

        int input = Integer.parseInt(st.nextToken());

        int count = 1;
        int sum = 1;
        int startIdx = 1;
        int endIdx = 1;

        while(endIdx != input) {
            if(sum == input) {
                count++;
                endIdx++;
                sum += endIdx;
            } else if(sum > input) {
                sum -= startIdx;
                startIdx++;
            } else {
                endIdx++;
                sum += endIdx;
            }
        }
        System.out.println(count);
    }
}

 

문제를 맨 처음에 봤었을 때는 '구간 합'이 제일 먼저 떠올랐지만 좀 더 생각해보니 1부터 N까지의 연속된 자연수를 구하는 거라 굳이 배열이 필요 없다고 생각해서 나름 잘 푼 문제..!

 

제출 결과

 

 

반응형
저작자표시 비영리 변경금지 (새창열림)
'알고리즘/알고리즘 유형' 카테고리의 다른 글
  • [백준] 2018_수들의 합5 - JAVA
  • [백준] 1940_주몽 - JAVA
  • [백준] 10986_나머지 합 - JAVA
  • [백준] 11660_구간 합 구하기5 - 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
    • 홈
    • 방명록
    • 글쓰기
    • 관리
  • 링크

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
데부한
[백준] 2018_수들의 합5 - JAVA
상단으로

티스토리툴바