백준 문제풀이/C언어

[백준/C언어] #1292 쉽게 푸는 문제

꽌 2024. 2. 15. 04:04

문제 링크:  1292번: 쉽게 푸는 문제 (acmicpc.net)

 

1292번: 쉽게 푸는 문제

첫째 줄에 구간의 시작과 끝을 나타내는 정수 A, B(1 ≤ A ≤ B ≤ 1,000)가 주어진다. 즉, 수열에서 A번째 숫자부터 B번째 숫자까지 합을 구하면 된다.

www.acmicpc.net


코드 구상

작성 코드

#include <stdio.h>

int main() {
    int A, B, k = 1, sum = 0; 
    scanf("%d %d", &A, &B); 
    int arr[1001];
    arr[0] = 0;
    
    for(int i = 1; i <= B; i++) {
        for(int j = 1; j <= i; j++) {
            arr[k] = i;
            if(k>1000){
				break;
			}
            k++;
        }
    }
    
    for(int i = A; i <= B; i++) {
        sum += arr[i]; 
    }
    
    printf("%d", sum); 
    return 0;
}

알아간 점

1. 파이썬은 동적 배열의 특징을 갖는다

  • 이 문제는 파이썬으로 먼저 푼 후 C언어로 풀었는데, 파이썬에서는 따로 리스트의 크기를 신경쓰지 않고 코드를 짰었다.(파이썬으로 푼 코드: [백준/파이썬] #1292 쉽게 푸는 문제 (tistory.com)) C언어로 실행시켰을 때 자꾸만 런타임 에러가 떠서 문제가 뭔지 열심히 찾아봤다.. 분명 코드는 틀리지 않은 것 같았는데 말이다. 문제는 처음에 수열을 만드는 반복문에서 if문(k>1000)을 작성하지 않았기에 계속 오류가 뜬 것이다. 파이썬에서는 작성하지 않았기에 C언어를 풀 때도 생각을 안하고 있었다. 인덱스에 대한 제한을 설정하니 드디어 성공이 떴다......
  • 파이썬은 리스트가 동적 배열 특징을 갖고 있다. 가변적인 크기를 갖는데, 초기값을 작게 잡고 필요에 따라 크기를 동적으로 조절한다. 따라서 이 문제를 파이썬으로 풀 때는 굳이 리스트 크기 값을 설정해 둘 필요가 없었다.
  • C언어 배열 같은 경우 일반적으로 정적으로 할당된다.( C언어에서의 동적 배열은 포인터로 구현해야 한다.) 따라서 배열의 크기를 초과하는 인덱스에 접근하려고 하면 오류가 날 수 있다 !! ㅜㅜ (런타임 에러가 난 이유..)
  • 분명 동적/정적 배열..수업 시간에 배웠던 내용이다. 그땐 이해를 하기보단 그냥 암기하고 지나갔던 것 같은데 이렇게 오류를 통해서 직접 경험해보고 이해하니 훨씬 좋은 듯하다.