🙏 1 - 4번 문제
it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비 - 인프런 | 강의
강의 저작권으로 인해 문제를 공개하지 않았으며, 답안 코드 혹은 성공한 코드가 작성된 게시글입니다.
1. 1부터 N까지 M의 배수합
2023년 1월 31일
#include <iostream>
using namespace std;
int main() {
int N = 0;
int M = 0;
int sum = 0;
cin >> N >> M;
for(int i = 1; i <= N; i++)
{
if(i % M == 0)
sum += i;
}
cout << sum;
return 0;
}
<aside> 💡 배수 : 그 수에 정수를 곱한 수
</aside>
처음에는 예시 때문에 N * M을 반환하면 되는 줄 알았다. 문제 이름 그대로 1부터 N까지의 수 중에서 M의 배수가 되는 수를 골라 더해주는 문제였다.
2. 자연수의 합
2023년 1월 31일
include <iostream>
using namespace std;
int main() {
int A = 0;
int B = 0;
int sum = 0;
cin >> A >> B;
for(int i = A; i <= B; i++)
{
if(i < B)
cout << i << " + ";
else
cout << i << " = ";
sum += i;
}
cout << sum;
return 0;
}
i가 B보다 작을 때와 B일 때(= 마지막 숫자)일 때를 달리하여 출력해주도록 했다.
풀이 과정을 보던 중 아무 생각 없이 사용했던 for문의 i 초기화에 대해 알아볼 수 있었다.
나는 평소 for문에 사용하는 i는 for문에서 바로 초기화를 해준다.
include <iostream>
using namespace std;
int main() {
for (int i = 1; i < 5; i++)
{
cout << i << ' ';
}
}
// 결과
// 1 2 3 4
include <iostream>
using namespace std;
int main() {
int i = 0;
for (i = 1; i < 5; i++)
{
cout << i << ' ';
}
cout << i;
}
// 결과
// 1 2 3 4 5
두 코드를 보면 결과가 다른 것을 볼 수 있다. 사실 엄청 간단한 건데 습관 때문에 처음에 헷갈렸다.
for에서 1로 초기화한 i의 경우, for문 밖에서는 사라지기 때문에 4까지만 출력할 수 있다. 하지만 0으로 초기화한 지역 변수인 i는 for문이 i = 5일 때 조건식에서 제외되기 때문에 반복문이 끝나더라도 i++이 되어 i는 5가 된다. 지금 문제처럼 for문과 마지막 숫자를 활용한 문제를 보게 된다면 i를 for문의 초기화 식에서 초기화를 해주는게 아닌, 지역 변수로 만들어서 마지막 숫자만 활용해야겠다.
3. 진약수의 합
2023년 1월 31일
#include <iostream>
using namespace std;
int main() {
int N = 0;
int sum = 1;
cin >> N;
cout << "1";
for(int i = 2; i <= N / 2; i++)
{
if(N % i == 0)
{
cout << " + " << i;
sum += i;
}
}
cout << " = " << sum;
return 0;
}
<aside> 💡 진약수 : 자기 자신을 제외한 양의 약수
</aside>
2번 문제와 달리 처음 출력되는 1을 고려해서 풀어야 한다. 모든 정수는 1로 나누어지기 때문이다. 처음에는 위 문제처럼 for문 안에서 분기점을 주어 풀었다.
#include <iostream>
using namespace std;
int main() {
int N = 0;
int sum = 0;
cin >> N;
for (int i = 1; i <= N / 2; i++)
{
if (N % i == 0)
{
if (i < N / 2)
{
cout << i << " + ";
sum += i;
}
else
{
cout << i << " = ";
sum += i;
}
}
}
cout << sum;
return 0;
}
처음에 작성했던 코드이다.
정답은 맞으나 if문을 중첩해서 쓰다보면 컴퓨터가 계산하는 횟수가 늘어나므로 처음 코드보다 효율적이지 않다. sum과 i의 초기화 값을 각각 1과 2로 바꾸는 것만으로도 조건문을 한 번 더 피할 수 있게 된다.
4. 나이 차이
2023년 1월 31일
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int N = 0;
vector<int> store;
cin >> N;
for(int i = 0; i < N; i++)
{
int temp = 0;
cin >> temp;
store.push_back(temp);
}
sort(store.begin(), store.end());
cout << store[N - 1] - store[0];
return 0;
}
벡터로 풀어도 정답이 맞기는 하다. 하지만 문제 자체가 최소값과 최대값을 활요하는 문제이므로 더 간단하게 풀 수 있었다.
#include <iostream>
using namespace std;
int main() {
int N = 0;
int temp = 0;
int min = 2147000000;
int max = -2147000000;
cin >> N;
for(int i = 0; i < N; i++)
{
cin >> temp;
if(temp > max)
max = temp;
if(temp < min)
min = temp;
}
cout << max - min;
return 0;
}
더 간단하게 푼 코드이다.
그동안 벡터로 문제를 많이 풀어서 그런지 최소값 최대값 간단한 문제임에도 바로 생각나는게 벡터였다. 풀기만 해도 문제는 없지만 벡터로 풀게 되면 값을 받을 때마다 int형으로 데이터를 계속 차지하기 때문에 효율적으로 보면 위 코드가 더 좋지 않을까 싶다.
그리고 강의 중에 알 게 된 다른 재밌는게 있었다. 답이 맞는지 확인하기 위해 디버깅 할 때 예제 입력을 그대로 적어넣는데, 길이가 길면 드래그를 하더라도 안 될 때가 있다고 했다. 그래서 파일 입출력을 통해 디버깅만 해도 해당 예제 입력이 자동으로 들어가게끔 해주는 기능이 있다.
#include <iostream>
using namespace std;
int main() {
freopen("input.txt", "rt", stdin);
int N = 0;
int temp = 0;
int min = 2147000000;
int max = -2147000000;
cin >> N;
for(int i = 0; i < N; i++)
{
cin >> temp;
if(temp > max)
max = temp;
if(temp < min)
min = temp;
}
cout << max - min;
return 0;
}
변수 초기화한 부분 위에 적은 freopen이 파일입출력이다.
freopen(”파일 경로”, “액세스 형식”, “스트림”);