코딍코딍
코딩기록
코딍코딍
전체 방문자
오늘
어제
  • 분류 전체보기 (271)
    • 개발 (2)
    • Java (1)
    • 스프링 (28)
    • JPA (11)
    • Git (3)
    • 알고리즘 (160)
      • 백준 (132)
      • 프로그래머스 (8)
      • SWEA (20)
    • 토이 프로젝트 (14)
      • 간단한 Springboot CRUD (1)
      • 게시판 프로젝트 (13)
    • 알고리즘 개념정리 (8)
    • 오류 해결 (13)
    • 보류 (0)
    • AWS (5)
    • 트러블 슈팅 (0)
    • 회고 (3)
    • CS (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

최근 글

티스토리

hELLO · Designed By 정상우.
코딍코딍

코딩기록

1789번 : 수들의 합
알고리즘/백준

1789번 : 수들의 합

2022. 6. 22. 16:25

 

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

 

1789번: 수들의 합

첫째 줄에 자연수 S(1 ≤ S ≤ 4,294,967,295)가 주어진다.

www.acmicpc.net

 

 

문제

 

 

코드

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		long S = sc.nextLong();
		
		long n=0;
		long k=0;
		long i=1;
		
		while(true) {
			if(k+i>S) {
				break;
			}
			k+=i;
			i++;
			n++;
		}
		
		System.out.print(n);
	}
}

 

 

해결방법

서로 다른 N개의 자연수의 합이 S이다. 한 번 생각해보면

S=10
1 + 2 + 3 + 4  =>  N=4

S=17
1 + 2 + 3 + 4 + 5 + 6  =>  X
1 + 2 + 3 + 4 + 7  =>  N=5 

이런 식으로 써볼 수가 있는데 S=10인 경우엔 1부터 차례대로 더하면 10이 된다. 하지만 S=17인 경우에는 차례대로 더하면 17이 나오지 않는다. 이 말의 즉슨 S값을 넘어가는 마지막 자연수를 더하기 전에 원하는 값을 만들어줘야 한다는 의미이다. 차례대로 더했기에 뭘 더하든 원하는 값은 나올 수 없기 때문이다.

고로 S=17인 경우엔 5번째 더하는 자리에서 끝을 맺어야한다. 

코드로 생각해보면 S값을 넘어가는 마지막 자연수를 더하기 전의 자연수의 개수가 곧 합이 S인 서로 다른 자연수의 개수인 셈이다. 이를 토대로 코드를 작성하여 해결하였다.

 

 

틀린 이유

처음 제줄하였을 때, 런타임 에러(InputMismatch)로 틀렸는데 그 이유는 자연수 S의 범위는 1 ≤ S ≤ 4,294,967,295인데 변수를 int형으로 선언하였기 때문이다. 코드를 보면 변수 S 이외에 k도 반드시 long형으로 선언해야 한다. 혹시 몰라 변수 n과 k도 long형으로 선언하였다. 이런 실수는 정말 하지 않아야 한다.

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

1439번 : 뒤집기  (0) 2022.06.26
10610번 : 30  (1) 2022.06.22
10162번 : 전자레인지  (0) 2022.06.22
5585번 : 거스름돈  (0) 2022.06.22
백준 2751번 : 수 정렬하기2  (0) 2021.08.18
    '알고리즘/백준' 카테고리의 다른 글
    • 1439번 : 뒤집기
    • 10610번 : 30
    • 10162번 : 전자레인지
    • 5585번 : 거스름돈
    코딍코딍
    코딍코딍
    ㅎ2

    티스토리툴바