이번 알고리즘 문제 풀이는 C로 진행했습니다
코드에 오탈자나 문제가 있으면 언제든지 댓글로 알려주세요!
A. 기하 직사각형과 삼각형
1. 직사각형
a. 문제지 : 27323
b. 정답
A*B 넓이를 구하면 되는 쉬운 문제!
📚 풀이
#include <stdio.h>
int main(){
int A, B;
scanf("%d %d", &A, &B);
printf("%d", A*B);
}
2. 직사각형에서 탈출
a. 문제지 : 1085
b. 알고리즘 / 풀이
경계선까지 가는 방법은 위 그림과 같이 4가지 방법이 있음
X는 0이나 W, Y는 0이나 H
따라서 4개의 값을 비교하면 끝!
c. 정답
📚 풀이
#include <stdio.h>
int min(int a, int b) {
return a < b ? a : b;
}
int main() {
int x, y, w, h;
scanf("%d %d %d %d", &x, &y, &w, &h);
// 위, 아래, 왼쪽, 오른쪽으로 가는 거리 중에서 최솟값 찾기
int min_distance = min(min(x, w - x), min(y, h - y));
// 결과 출력
printf("%d\n", min_distance);
return 0;
}
3. 네 번째 점
a. 문제지 : 3009
b. 알고리즘 / 풀이
네 번째 점은 위와같이 주어진 세 점의 중복되지 않는 좌표 값들을 찾아서 구하면 됨
1) 삼항 연산자 사용
x값과 y값을 배열로 선언
반복문으로 입력받음
삼항 연산자를 이용해 배열 값을 비교해 중복되지 않는 값을 추출
네 번째 점의 좌표 출력
2) XOR 연산자 사용
베타적 논리합 연산자를 사용하면 세개의 값을 비교할 때 편리함
🤓 예제 1 : 5 ^ 5 ^ 7 연산의 도식화
5 : 0101
5 : 0101
---------
0000
7 : 0111
---------
7 : 0111
🤓 예제 2 : 7 ^ 4 ^ 7 연산의 도식화
7 : 0111
4 : 0100
---------
0011
7 : 0111
---------
7 : 0100
위와같이 XOR 연산은 같은 비트 위치에 있는 두 값이 다를 때 1을 반환하고, 같을 때 0을 반환
이를 이용해 주어진 세 점 중에서 두 번 출현하는 x 좌표와 y 좌표를 쉽게 찾을 수 있음
c. 정답
📚 풀이 1 : 삼항연산을 이용
#include <stdio.h>
int main() {
int x[3], y[3];
// 세 점의 좌표 입력 받기
for (int i = 0; i < 3; ++i) {
scanf("%d %d", &x[i], &y[i]);
}
int x4, y4; // 네 번째 점의 좌표
// 각 좌표 값 중에서 두 번 출현하는 좌표 찾기
x4 = (x[0] == x[1]) ? x[2] : (x[0] == x[2]) ? x[1] : x[0];
y4 = (y[0] == y[1]) ? y[2] : (y[0] == y[2]) ? y[1] : y[0];
// 네 번째 점의 좌표 출력
printf("%d %d\n", x4, y4);
return 0;
}
📚 풀이 2 : XOR 연산을 이용
#include <stdio.h>
int main() {
int x[3], y[3];
// 세 점의 좌표 입력 받기
for (int i = 0; i < 3; ++i) {
scanf("%d %d", &x[i], &y[i]);
}
// 네 번째 점의 좌표 계산 및 출력
printf("%d %d\n", x[0] ^ x[1] ^ x[2], y[0] ^ y[1] ^ y[2]);
return 0;
}
4. 수학은 체육과목 입니다
a. 문제지 : 15894
b. 알고리즘 / 풀이
정사각형의 개수가 10^9까지니까 int보다 long long을 사용해서 풀이해야 한다
🧡 long 을 사용하지 않는 이유
long 자료형은 int보다 더 넓은 범위의 정수 값을 표현할 수 있는 자료형
그러나 long의 크기는 컴파일러와 플랫폼에 따라 다를 수 있고 보통 4바이트(32비트) 또는 8바이트(64비트)로 구현
그래서 long을 사용하더라도 32비트 컴파일러에서는 int와 같은 크기
이와 달리 long long은 표준에서 최소한 64비트를 보장해 크기가 더 큰 범위의 값을 저장할 수 있음
따라서 매우 큰 정수 값을 다룰 때에는 long long을 사용하는 것이 안전함
c. 정답
📚 풀이
#include <stdio.h>
int main() {
long long n;
scanf("%lld", &n);
// 계산식을 이용하여 둘레의 길이를 구함
long long perimeter = 4 * n;
printf("%lld\n", perimeter);
return 0;
}
5. 대지
a. 문제지 : 9063
b. 알고리즘 / 풀이
- N 입력받기
- 각 X, Y값의 최소값, 최대값을 미리 지정해둠
- N번 반복문으로 X,Y값을 입력받고 조건문으로 값이 최대값인지 최소값인지 판별
- 가로 세로 길이를 구하고 넓이를 출력
c. 정답
📚 풀이
#include <stdio.h>
int main() {
int N;
scanf("%d", &N);
int minX = 10001, minY = 10001;
int maxX = -10001, maxY = -10001;
for (int i = 0; i < N; i++) {
int x, y;
scanf("%d %d", &x, &y);
// 점의 좌표를 이용하여 최소/최대 x, y 좌표 갱신
if (x < minX) minX = x;
if (x > maxX) maxX = x;
if (y < minY) minY = y;
if (y > maxY) maxY = y;
}
// 직사각형의 넓이 계산
long long width = (long long)(maxX - minX);
long long height = (long long)(maxY - minY);
printf("%lld\n", width * height);
return 0;
}
6. 삼각형 외우기
a. 문제지 : 10101
b. 정답
📚 풀이
#include <stdio.h>
int main() {
int A, B, C;
scanf("%d %d %d", &A, &B, &C); // 세 각의 크기 입력
// 세 각의 합이 180인지 확인
if (A + B + C == 180) {
// 세 각이 모두 60이면 Equilateral 삼각형
if (A == 60 && B == 60 && C == 60) {
printf("Equilateral");
}
// 두 각이 같으면 Isosceles 삼각형
else if ((A == B) || (A == C) || (B == C)) {
printf("Isosceles");
}
// 모든 각이 다르면 Scalene 삼각형
else {
printf("Scalene");
}
}
// 세 각의 합이 180이 아니면 Error
else {
printf("Error");
}
return 0;
}
7. 삼각형과 세 변
a. 문제지 : 5073
b. 정답
📚 풀이
#include <stdio.h>
int main() {
while (1) {
int A, B, C;
scanf("%d %d %d", &A, &B, &C); // 세 변의 길이 입력
int sum = A + B + C; // 세 변의 길이 합을 계산
if (sum == 0) { // 모든 변의 길이가 0이면 반복 종료
break;
}
int lon = A > B ? (A > C ? A : C) : (B > C ? B : C); // 가장 긴 변의 길이 계산
if (A == B && B == C) { // 세 변의 길이가 모두 같으면 Equilateral 출력
printf("Equilateral\n");
} else if (sum - lon * 2 <= 0) { // 가장 긴 변의 길이보다 나머지 두 변의 길이의 합이 길지 않으면 Invalid 출력
printf("Invalid\n");
} else if ((A == B) || (C == B) || (A == C)) { // 두 변의 길이가 같으면 Isosceles 출력
printf("Isosceles\n");
} else { // 위 경우에 해당하지 않으면 Scalene 출력
printf("Scalene\n");
}
}
return 0;
}
8. 세 막대
a. 문제지 : 14215
b. 알고리즘 / 풀이
위 7번 삼각형과 세 변에서 푼 방식을 활용해서 풀이
c. 정답
📚 풀이
#include <stdio.h>
int main() {
int A, B, C;
scanf("%d %d %d", &A, &B, &C); // 세 변의 길이 입력
int sum = A + B + C; // 세 변의 길이 합
int lon = A > B ? (A > C ? A : C) : (B > C ? B : C); // 가장 긴 변의 길이
if(A==B && B==C){
}else if (sum - lon * 2 <= 0){
// 가장 긴 변의 길이가 나머지 두 변의 길이 합보다 크거나 같은 경우
// 이 경우 세 변으로 삼각형을 만들 수 없으므로, 세 변의 길이 합에서 (가장 긴 변의 길이 * 2)를 빼줌
// 이렇게 해서 나온 값이 삼각형의 둘레가 됨
int i=0;
while(sum-lon*2<1-i){
i++;
}
sum -= i;
}else{
}
printf("%d", sum);
return 0;
}
'자료구조와 알고리즘 > 문제풀이' 카테고리의 다른 글
[Baekjoon] 단계별로 풀어보기 : 약수, 배수와 소수 (0) | 2023.08.25 |
---|---|
[Baekjoon] 단계별로 풀어보기 : 일반 수학 1 (0) | 2023.08.25 |
[Baekjoon] 단계별로 풀어보기 : 2차원 배열 (0) | 2023.08.25 |
[Baekjoon] 단계별로 풀어보기 : 심화 1 (0) | 2023.08.24 |
[Baekjoon] 단계별로 풀어보기 : 문자열 (0) | 2023.08.17 |