문제
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 |
문제
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 |