[C] 백준 1977 - 완전제곱수 | BaekJoon

2023. 8. 1. 16:04· C/BaekJoon
목차
  1. 문제
  2. 입력
  3. 출력
  4. 예제 입력 1
  5. 예제 출력 1
  6. 예제 입력 2
  7. 예제 출력 2
  8. 예상 풀이방법
  9. 1차 코드
  10. 1차 결과
  11. 1차 진단
  12. 2차 코드
  13. 2차 결과
  14. 2차 진단
  15. 3차 코드
  16. 3차 결과
  17. 3차 진단
  18. 4차 코드
  19. 4차 결과
  20. 미흡했던 점
  21. 개선 방안
  22. 최종 코드
  23. 백준 채점 결과

문제

M과 N이 주어질 때 M이상 N이하의 자연수 중 완전제곱수인 것을 모두 골라 그 합을 구하고 그 중 최솟값을 찾는 프로그램을 작성하시오. 예를 들어 M=60, N=100인 경우 60이상 100이하의 자연수 중 완전제곱수는 64, 81, 100 이렇게 총 3개가 있으므로 그 합은 245가 되고 이 중 최솟값은 64가 된다.

입력

첫째 줄에 M이, 둘째 줄에 N이 주어진다. M과 N은 10000이하의 자연수이며 M은 N보다 같거나 작다.

출력

M이상 N이하의 자연수 중 완전제곱수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다. 단, M이상 N이하의 자연수 중 완전제곱수가 없을 경우는 첫째 줄에 -1을 출력한다.

예제 입력 1

60
100

예제 출력 1

245
64

예제 입력 2

75
80

예제 출력 2

-1

예상 풀이방법

for문을 사용해서 i * i 값이 M < x < N 이면 sum += x 를 해서 더하고
if문을 사용해서 해당 값이 min 보다 작다면 해당 수를 저장하고

printf로 sum 과 min을 출력한다.

1차 코드

#include <stdio.h>

int main() {
    int M, N;
    int sum = 0;
    int min = 10000;
    scanf("%d, %d", &M, &N);

    for (int i = 1; i < M; i++) {
        int tmp = i * i;
        if (M <= tmp <= N) {
            sum += tmp;
            if (min > tmp) {
                min = tmp;
            }
        }
    }

    printf("%d", sum);

    if (min == 10000) {
        printf("-1\n");
    }
    else
        printf("%d\n", min);
}

1차 결과

60 100
0-1

75 80
0-1

1차 진단

문제점 1
sum에 합산되지 않고 0만 출력됨

문제점 2
min 값이 바뀌지 않은 것인지 -1만 출력되는 문제

문제점 3
if문 연산자 <=에 bool 형식을 사용하는 것이 올바르지 않았음

문제점 4
printf 부분이 두 개여야하는데 if와 else로 나눠놓고 두 개만 써있음. else의 경우 sum 출력을 추가해야함.

문제점 5
그러고보니 중간에 개뜬금 printf sum이 들어가있어서 빼야함. 무조건적인 sum 출력을 원하지 않음.

문제점 6
return 0; 없음

3번 문제점이 가장 치명적이라고 보고 if문의 조건을 &&으로 나누어 두 개로 쓰는 방법 결정.

2차 코드

#include <stdio.h>

int main() {
    int M, N;
    int sum = 0;
    int min = 10000;
    scanf("%d, %d", &M, &N);

    for (int i = 1; i < N; i++) {
        int tmp = i * i;
        if (tmp >= M && tmp <= N) {
            sum += tmp;
            if (min > tmp) {
                min = tmp;
            }
        }
    }

    printf("%d", sum);

    if (min == 10000) {
        printf("-1\n");
    }
    else {
        printf("%d\n", sum);
        printf("%d\n", min);
    }

    return 0;
}

2차 결과

60 100
0-1

75 80
0-1

2차 진단

문제점 1
출력값에 분명 \n으로 줄바꿈을 넣었는데 줄바꿈이 이루어지지 않았음

문제점 2
조건이 달라졌음에도 값이 동일하다는 건 for문이 잘못 돌았을 것이라고 판단

3차 코드

#include <stdio.h>

int main() {
    int M, N;
    int sum = 0;
    int min = 10000;
    scanf("%d, %d", &M, &N);

    for (int i = 1; i <= N; i++) {
        int tmp = i * i;
        if (tmp >= M && tmp <= N) {
            sum += tmp;
            if (min > tmp) {
                min = tmp;
            }
        }
    }

    if (min == 10000) {
        printf("-1\n");
    }
    else {
        printf("%d\n %d", sum, min);
    }

    return 0;
}

3차 결과

60 100
-1

75 80
-1

3차 진단

일단 0-1로 출력되던 문제가 사라진 것은 좋으나
여전히 -1만 출력되고있음.

min이 계속 10000으로 유지된다는 말이니 왜 min이 바뀌지 않는지 코드를 해독해보기로 함.

int i = 1부터 N까지 계속 i++로 수를 더하는 것은 맞고

tmp를 사용해서 i * i를 정의하는 것까지는 좋음

근데 if 조건문도 잘 들어갔고 sum과 min에도 문제가 없어보임

분명 전부 다 맞는데 왜 틀렸는가 하다가 하나 봤다.

왜 %d. %d로 해놨을까 좀 의문이 든다.

%d %d로 하면 문제가 없을 듯...?

4차 코드

#include <stdio.h>

int main() {
    int M, N;
    int sum = 0;
    int min = 10000;
    scanf("%d %d", &M, &N);

    for (int i = 1; i <= N; i++) {
        int tmp = i * i;
        if (tmp >= M && tmp <= N) {
            sum += tmp;
            if (min > tmp) {
                min = tmp;
            }
        }
    }

    if (min == 10000) {
        printf("-1");
    }
    else {
        printf("%d\n%d", sum, min);
    }

    return 0;
}

4차 결과

60 100
245
64

75 80
-1

미흡했던 점

아직도 for문 if문 사이 arr[i] = i * i 같은 것을 어디에 정의해야하는지 모르는 것과
printf를 겹쳐서 쓰는 것과 빼먹는 것 등이 위험하다.

if문 조건 똑바로 못주는 거 진짜 큰일이다.

그리고 왜 자꾸 초기 단계(printf, scanf)에서 틀려먹는지 모르겠다.

개선 방안

for문 if문을 돌릴 때 조건 주는 방법에 대해서 한 번 더 고민해보고
내가 생각한 가상의 수가 알아서 잘 들어간다고 코드를 무시하고 지나가지 말고
구성 하나하나에 신경을 써야한다.

전체적인 흐름과 지역변수가 언제 생성되고 삭제되는지를 중점으로 볼 필요가 있는 것 같다.

조금 안다고 깝치면서 자꾸 틀려먹으면 안될 것 같다. 기초공사 부실한게 여기서 티가 난다.

최종 코드

#include <stdio.h>

int main() {
    int M, N;
    int sum = 0;
    int min = 10000;
    scanf("%d %d", &M, &N);

    for (int i = 1; i <= N; i++) {
        int tmp = i * i;
        if (tmp >= M && tmp <= N) {
            sum += tmp;
            if (min > tmp) {
                min = tmp;
            }
        }
    }

    if (min == 10000) {
        printf("-1");
    }
    else {
        printf("%d\n%d", sum, min);
    }

    return 0;
}

백준 채점 결과

저작자표시 (새창열림)

'C > BaekJoon' 카테고리의 다른 글

[C] 백준 2748 - 피보나치 수2 | BaekJoon  (0) 2023.08.02
[C] 백준 2747 - 피보나치 수 | BaekJoon  (0) 2023.08.02
[C] 백준 2920 - 음계 | BaekJoon  (0) 2023.07.28
[C] 백준 8958 - OX퀴즈 | BaekJoon  (0) 2023.07.28
[C] 백준 2750 - 수 정렬하기 (순차 정렬) | BackJoon  (0) 2023.07.22
  1. 문제
  2. 입력
  3. 출력
  4. 예제 입력 1
  5. 예제 출력 1
  6. 예제 입력 2
  7. 예제 출력 2
  8. 예상 풀이방법
  9. 1차 코드
  10. 1차 결과
  11. 1차 진단
  12. 2차 코드
  13. 2차 결과
  14. 2차 진단
  15. 3차 코드
  16. 3차 결과
  17. 3차 진단
  18. 4차 코드
  19. 4차 결과
  20. 미흡했던 점
  21. 개선 방안
  22. 최종 코드
  23. 백준 채점 결과
'C/BaekJoon' 카테고리의 다른 글
  • [C] 백준 2748 - 피보나치 수2 | BaekJoon
  • [C] 백준 2747 - 피보나치 수 | BaekJoon
  • [C] 백준 2920 - 음계 | BaekJoon
  • [C] 백준 8958 - OX퀴즈 | BaekJoon
sngsp
sngsp
야구돌이 집사의 코딩 그리기
sngsp
[Sngsp] Coding Drawing
sngsp
전체
오늘
어제
  • 분류 전체보기 (90)
    • C (12)
      • BaekJoon (12)
    • iOS (78)
      • Programmers (48)
      • Allen Swift School (1)
      • TIL (Today I Learned) (29)

블로그 메뉴

  • 홈
  • C
  • Swift

공지사항

인기 글

태그

  • 엑스코드
  • 공부
  • XCode
  • 코딩
  • 알고리즘
  • 프로그래머스
  • Programmers
  • 개발자
  • ios
  • 애플
  • 개발
  • UIkit
  • algorithm
  • c언어
  • til
  • 백준
  • 문법
  • 스위프트
  • baekjoon
  • Swift

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
sngsp
[C] 백준 1977 - 완전제곱수 | BaekJoon
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.