22.02.22 백준 1292번

김민혁·2022년 2월 22일
0

하루한문제

목록 보기
14/22

문제

첫번째 제출한답

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		String input = sc.nextLine();
		
		int a = Integer.parseInt(input.split(" ")[0]);
		int b = Integer.parseInt(input.split(" ")[1]);
		int result = 0;
		String temp = "";
		for (int i = 1; i < b+1; i++) {
			for (int j = 1; j < i+1; j++) {
				temp  += i;
			}
		}
		
		for (int i = a-1; i < b; i++) {
			result += 	  Character.getNumericValue(temp.charAt(i));
		}
		
		System.out.println(result);
	}
}

접근방식 -> 2중반복문으로 수열을 만들고 a~b번째의 문자를 숫자로바꿔서 총합을 구한다.

결과 -> 메모리초과

문제점 -> "1223334444....."와같은 문자열을 생성한뒤 파싱해서 값을 구하면 두가지 문제가 발생한다.
1. b의 크기가 최대 1000이기 때문에 문자열이 엄청나게 길어져서 메모리 초과가 발생함
2. 해당코드처럼 문자열을 charAt로 파싱해오면 숫자가 두자리수 이상일때 정상적인 값을 가져오지 못한다.

해결방안 -> 문자열을 생성하지말고 List를 사용하면 두가지 문제가 동시에 해결될것 같다.

두번째 제출한 답안

import java.util.ArrayList;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		String input = sc.nextLine();
		
		int a = Integer.parseInt(input.split(" ")[0]);
		int b = Integer.parseInt(input.split(" ")[1]);
		int result = 0;
		ArrayList<Integer> list = new ArrayList<>();
		for (int i = 1; i < b+1; i++) {
			for (int j = 1; j < i+1; j++) {
				list.add(i);
			}
		}
		
		for (int i = a-1; i < b; i++) {
			result += list.get(i);
		}
		
		
		System.out.println(result);
	}
}

접근방식 -> 첫번째 답안에서 문자열을 생성하던 코드 대신 ArrayList에 추가 시키는 코드를 넣고
그 값을 그대로 합산하여 출력

결과 -> 정답

profile
안녕하세요 김민혁입니다.

0개의 댓글