이 문제는 4줄짜리 표에서 두 자연수의 직각거리를 구하는 문제이다.
#include <stdio.h>
#include <math.h>//절댓값을 구하기 위해
int main() {
int a, b, ax, ay, bx, by, xy;
scanf("%d %d", &a, &b);
a, b는 입력받을 두 자연수입니다. ax는 a가 가로로 몇째줄인지, ay는 a가 세로로 몇째줄인지, bx는 b가 가로로 몇째줄인지, by는 b가 세로로 몇째줄인지를 나타내는 변수들입니다. xy는 마지막에 출력할 최종 직각거리입니다.
만일 가로세로를 빼며 최종 직각거리를 구했을 때 음수가 나올 가능성이 있고, 그렇게 되면 곤란해지기 때문에 애초에 직각거리는 절댓값들의 계산으로 나타낼 것입니다. 절댓값으로 만들어주는 함수인 abs를 사용하기 위해 헤더파일 <math.h>를 추가해줍니다.
그리고 두 자연수 a, b를 입력받습니다.
ax = (a-1)%4;
ay = (a-1)/4;
bx = (b-1)%4;
by = (b-1)/4;
먼저 가로가 몇째줄인지 구하는 공식은 (자연수-1)%4입니다. 위 표에서 아무 숫자나 대입해서 생각해보면 바로 이해가 됩니다. 수에서 1을 빼는 이유는 마지막줄을 계산할 때 0이 나오기 때문에 1, 2, 3, 4 순서가 아닌 0, 1, 2, 3 순서로 생각해야 합니다. 또 세로줄을 구하는 공식은 (자연수-1)/4입니다. 마찬가지로 수에서 1을 빼고 계산합니다. 이 공식들을 활용해서 a와 b의 가로줄과 세로줄을 구합니다.
xy = abs(ax - bx)+abs(ay - by);
printf("%d", xy);
}
최종 직각거리 xy는 a의 가로에서 b의 가로를 뺀 값의 절댓값과 a의 세로에서 b의 세로를 뺀 값의 절댓값을 더해주면 구할 수 있습니다.
그리고 출력해주면 프로그램이 종료됩니다.
#include <stdio.h>
#include <math.h>//절댓값을 구하기 위해
int main() {
int a, b, xy;
double abs;
scanf("%d %d", &a, &b);
abs = (((a-1)%4)-((b-1)%4))+(((a-1)/4)-((b-1)/4));
printf("%d", abs);
}
절댓값 함수 abs의 사용법을 정확히 모르고 짠 오답 코드입니다..
절댓값을 구해야 한다는 것을 생각해내지 못했을 때 자꾸 오답이 떠 어려움이 있었지만 이 문제는 표의 가로세로를 구하는 규칙을 찾아내고 절댓값을 구하기만 하면 어렵지 않게 해결할 수 있는 것 같습니다. 문제가 길어서 코드도 길게 만들어질 줄 알았는데 생각보다 짧고 반복문이나 조건문 없이 해결되어서 신기했습니다.
C언어 함수 (0) | 2023.04.14 |
---|---|
백준 1402번 아무래도이문제는A번난이도인것같다 c (0) | 2023.04.09 |
백준 8958번 OX퀴즈 c (0) | 2023.04.09 |
백준 2609번 최대공약수와 최소공배수 c (0) | 2023.04.09 |
백준 1546번 평균 c (1) | 2023.04.09 |