[BAEKJOON 2953번 : 나는 요리사다]
[문제]

[고찰]
#include <iostream>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int input[4];
int output[5];
int score = 0;
for (int i = 0; i < 5; ++i)
{
for (int j = 0; j < 4; ++j)
{
cin >> input[j];
score += input[j];
}
output[i] = score;
score = 0;
}
int max_value = output[0];
int winner = 1;
for (int i = 1; i < 5; ++i)
{
if (output[i] > max_value)
{
max_value = output[i];
winner = i + 1;
}
}
cout << winner << " " << max_value;
return 0;
}
위의 코드는 해당 문제에 대한 저의 답변 코드입니다.
그런데 다시 생각해보니 input 배열은 입력만 하고 다시 사용되지 않기도 하고, 최대값 판별을 위해 for 문을 한 번 더 사용하는 것이 비효율적이고 간결하지 못하다는 생각이 들었습니다.
물론, 디버깅을 위해서라면 위의 코드처럼 하는 것이 더 좋지만, 코딩 테스트에서는 필요가 없습니다.
그래서 더욱 간결하게 코드를 다시 짜보았습니다.
[개념]
코드를 다시 짜보니, 최대값 판별을 위한 output 배열도 필요없다는 생각을 하게 되었습니다.
for 문을 한 번 더 사용하지 않을 것이라면, 입력과 최대값 판별을 함께 하게 됩니다.그렇게 되면, output 배열을 사용하지 않고 int형 변수 하나만 있어도 output 배열을 사용한 것과 같은 역할을 할 수 있겠다는 생각을 하였습니다.
최고점을 maxScore라고 할 때, 입력받은 점수들을 모두 더한 값과 maxScore를 비교하면 최고점을 비교할 수 있습니다.
for (int i = 1; i <= 5; ++i) {
int score = 0;
for (int j = 0; j < 4; ++j)
{
int point;
cin >> point;
score += point;
}
if (score > maxScore)
{
maxScore = score; // maxScore는 선언과 동시에 0으로 초기화
winner = i;
}
}
[정리]
아직 코딩 테스트에 맞는 코딩 스타일을 익히지 못한 것 같다는 생각이 들었습니다.물론 디버깅과 분석을 위한 코딩 스타일이 중요한 것도 맞지만, 더욱 유연하게 생각해야겠습니다.
그리고 간결하게 코드를 짜는 것은 당연한 것이기에, 이 점도 많이 신경써야 겠습니다.
[Solution]
#include <iostream>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int maxScore = 0;
int winner = 0;
for (int i = 1; i <= 5; ++i)
{
int score = 0;
for (int j = 0; j < 4; ++j)
{
int point;
cin >> point;
score += point;
}
if (score > maxScore)
{
maxScore = score;
winner = i;
}
}
cout << winner << " " << maxScore;
return 0;
}
[추가 개념]
새로 짠 코드에서 score와 point 변수에 대해 궁금한 점이 생겼습니다.
뭔가 관념처럼 for 문안에서 사용되기 때문에 각각 쓰이는 for 문 블록 안에서 변수를 선언해주었지만,
for 문 블록이 끝나면 변수는 메모리가 해제되었다가 다시 할당을 받으면서, for 문 밖에 선언하는 것보다 더 비효율적일 것 같다는 생각이 들었습니다.
이에 대해 검색을 해보았는데, 결론부터 말씀드리자면 for 문 안에서 선언해도 성능상 거의 차이가 없으며, 오히여 권장되는 방법이라는 것입니다.
현재 사용되는 C++ 컴파일러(GCC, Clang, MSVC 등)는 매우 강력한 최적화 기능을 갖고 있습니다.
컴파일러는 지역 변수가 반복문에서 짧은 생명 주기만 갖는다는 것을 알게 되면, 반복할 때마다 새로운 메모리를 할당하는 대신, 같은 메모리 주소를 재사용할 수 있도록 최적화를 해줍니다.






이렇게 point의 주소를 조사식에 넣고 디버깅을 해보면, 모두 같은 메모리 주소를 가지고 있는 것을 확인할 수 있습니다.
[BAEKJOON 3009번 : 네 번째 점]
[문제]

[고찰]
#include <iostream>
using namespace std;
int getVertex(int arr[3][2], int n)
{
int answer = 0;
if (arr[0][n] == arr[1][n])
{
answer = arr[2][n];
}
else
{
if (arr[0][n] == arr[2][n])
{
answer = arr[1][n];
}
else
{
answer = arr[0][n];
}
}
return answer;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int vertex[3][2];
int answer[2];
for (int i = 0; i < 3; ++i)
{
for (int j = 0; j < 2; ++j)
{
cin >> vertex[i][j];
}
}
answer[0] = getVertex(vertex, 0);
answer[1] = getVertex(vertex, 1);
cout << answer[0] << " " << answer[1];
return 0;
}
위의 코드는 해당 문제에 대한 제 답변입니다. 이번 문제 역시, 전 문제처럼 너무 과하게 작성한 것 같아서 다시 풀어보려 합니다.
[개념]
해당 문제에서 원하는 아이디어는,
직사각형이기에 항상 축에 평행하므로 네 번째 점은 x, y 좌표 각각에서 한 번만 나온 값이 되는 것입니다.
사실 간단한 아이디언데, 함수를 만들고 이차원 배열까지 써서 너무 과하게 문제를 풀었습니다.
아이디어에 집중하여서 x 좌표와 y 좌표를 분리하여 생각하면, x[3], y[3]이라는 배열 두 개를 만들 수 있습니다.
이 두 배열에서 x 좌표와 y 좌표를 구분하여, 비교 처리를 하면 금방 답을 찾아낼 수있습니다.
[정리]
역시 간결하게 문제를 풀기 위한 생각을 많이 해야겠습니다.
[Solution]
#include <iostream>
using namespace std;
int main()
{
int x[3], y[3];
for (int i = 0; i < 3; ++i)
{
cin >> x[i] >> y[i];
}
int resultX, resultY;
if (x[0] == x[1])
resultX = x[2];
else if (x[0] == x[2])
resultX = x[1];
else
resultX = x[0];
if (y[0] == y[1])
resultY = y[2];
else if (y[0] == y[2])
resultY = y[1];
else
resultY = y[0];
cout << resultX << " " << resultY << endl;
return 0;
}
[BAEKJOON 3053번 : 택시 기하학]
[문제]

[고찰]
해당 문제는 아예 아이디어조차 떠오르지 않아 검색을 한 후, 문제를 풀었습니다.
문제를 풀기 위해서는 C++에서 π (파이 , PI)를 사용할 수 있어야 하고,
택시 기하학에서 원의 넓이를 구하는 방법을 알아내야 한다는 것입니다.
그리고 마지막으로, 전에 정리한 적이 있는 소수점 정밀도를 설정하는 방법을 알아야 합니다.
[개념]
[C++에서 π (파이) 사용]
C++에서 π는 M_PI로 표현되며, 이를 사용하기 위해서는 <cmath> 헤더파일이 필요합니다.
다만, 일부 컴파일러 환경에서는 <cmath> 헤더파일을 포함해도 M_PI가 자동으로 정의되지 않을 수 있습니다.
이럴 때는 M_PI를 사용하기 전에 특정 매크로를 정의하여 POSIX 확장을 활성화해 주어야 합니다.
POSIX 확장을 위해서는 #include <cmath> 이전에 #define _USE_MATH_DEFINES를 추가하는 것입니다.
#define _USE_MATH_DEFINES
#include <iostream>
#include <cmath>
// ...
double area = M_PI * R * R;
[POSIX와 POSIX 확장]
POSIX는 'Portable Operating System Interface'의 약자입니다.
다양한 운영체제 간의 호환성을 높이기 위해 표준화된 운영체제 인터페이스를 정의합니다.
POSIX 확장은 특정 운영체제 표준(POSIX)에서 제공하는 추가적인 기능이나 상수를 의미합니다.
VS와 같은 일부 컴파일러는 기본적으로 POSIX 확장을 활성화하지 않았기 때문에,
해당 문제에서 M_PI를 사용하기 위해서는 매크로를 추가해주는 것입니다.
#define _USE_MATH_DEFINES 매크로는 컴파일러에게 나중에 <cmath> 헤더파일를 포함할 때, POSIX 수학 상수들 또한 정의해달라고 알려주는 역할을 합니다.
[택시 기하학에서 원의 넓이를 구하는 방법]
택시 기하학에서 원의 정의는 유클리드 기하학에서의 원의 정의와 같습니다. 그렇기에 반지름이 R인 원은 원점으로부터 택시 거리가 R 이하인 모든 점들의 집합입니다.
다만, 유클리드 기하학과 다른 점은 두 점 사이의 거리가 다르다는 것입니다. 택시 거리는 | x1 - x2 | + | y1 - y2 |로 계산됩니다.
| x1 |과 | y1 |이 원점이라고 하면, 원점과 | x2 |와 | y2 | 사이의 거리는 반지름 R 이하입니다.
| x2 |와 | y2 |를 임의의 점으로 생각한다고 했을 때, 원점을 기준으로 하면 | x | + | y | ≤ R을 만족하는 점들인 것입니다.
사실 이 부등식이 나오기 위해서는 원 안에 임의의 점을 생각하는 것부터 시작해야 합니다.
기하학에서 어떤 도형을 정의할 때, 그 도형은 어떤 특정한 성질을 만족하는 모든 점들의 모임입니다.
원에 대한 특정한 성질을 생각해보면, 원 안에 있는 임의의 점들은 모두 반지름보다 작다는 성질을 만족합니다.
이렇게 부등식을 찾으면, 이 부등식을 만족하는 점들을 좌표 평면에 그려보면 마름모가 됩니다.

이제 마름모인 것을 알았으니, 마름모의 넓이를 구하면 됩니다.
마름모의 넓이 공식은 (1/2) x (한 대각선의 길이) x (다른 대각선의 길이) 입니다.
각 대각선의 길이는 (R, 0)부터 (-R, 0) 까지의 거리, (0, R)부터 (0, -R)까지의 거리입니다.
따라서 마름모의 넓이 공식에 대입하면 넓이는 1/2 * 2R * 2R = 2 * R * R이 됩니다.
[정리]
택시 기하학이라는 개념을 처음 접하여서 문제가 더욱 생소하고 어렵게 느껴진 것 같습니다.
앞으로 풀 문제들이 어떤 수학적, 과학적 개념들을 포함하여 나올지도 모르기 때문에 해당 문제를 정리하면서
여러 유형의 문제에 대해 대비하고자 합니다.
[Solution]
#define _USE_MATH_DEFINES
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main()
{
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
int R;
std::cin >> R;
double euclidean_area = M_PI * R * R;
double taxicab_area = 2.0 * R * R;
std::cout << std::fixed << std::setprecision(6);
std::cout << euclidean_area << std::endl;
std::cout << taxicab_area << std::endl;
return 0;
}'코딩 테스트' 카테고리의 다른 글
| [코딩테스트 15일차] BAEKJOON 5073번, 5597번 (0) | 2025.05.06 |
|---|---|
| [코딩테스트 14일차] BAEKJOON 4153번 : 직각삼각형 (0) | 2025.05.06 |
| [코딩테스트 12일차] BAEKJOON 2935번 : 소음 (0) | 2025.05.03 |
| [코딩테스트 11일차] BAEKJOON 2525번 : 오븐시계, BAEKJOON 2914번 : 저작권 (0) | 2025.05.01 |
| [코딩테스트 10일차] BAEKJOON 2442번 ~ 2446번 : 별 찍기 5 ~ 9 (0) | 2025.04.26 |