Buᐢ༝ᐢy 2023. 2. 13. 18:00

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(”파일 경로”, “액세스 형식”, “스트림”);

freopen

freopen, _wfreopen

freopen() - 열린 파일 경로 재지정