정신과 시간의 방

전체 글 305

카테고리 설명
게임 프로그래머가 되기 위한 청춘의 기록
작성일
2024. 10. 28. 18:07
작성자
risehyun
작성일
2024. 10. 28. 13:12
작성자
risehyun
작성일
2024. 10. 27. 23:44
작성자
risehyun
  • 문제

 

  • 풀이
#include <iostream>
using namespace std;

int n, input, y_total, m_total;

int main() 
{
    ios::sync_with_stdio(false);
    cin.tie(0);

    cin >> n;

    for (int i = 0; i < n; i++) 
    {
        cin >> input;

        // 각 통화 시간에 대해 영식 요금제와 민식 요금제를 개별적으로 계산
        y_total += (input / 30 + 1) * 10; // 영식 요금제 요금 계산
        m_total += (input / 60 + 1) * 15; // 민식 요금제 요금 계산
    }

    if (y_total < m_total) cout << "Y " << y_total;
    else if (m_total < y_total) cout << "M " << m_total;
    else cout << "Y M " << y_total;

    return 0;
}

 

  • 메모

각 통화 시간에 대해서 2개의 요금제에 대해서 개별적으로 요금을 계산해야 한다는 점에 주의해야 한다.

 

또한 요금을 계산할 때 (input / 30 + 1)에서 +1을 해주는 이유는 통화 시간이 요금제의 시간 단위로 나누어 떨어지지 않는 경우 남은 초에 대해서도 요금이 추가로 청구되기 때문이다. 

 

아예 요금제의 시간 단위보다 작은 값만 입력되는 경우도 있을 수 있는데, 나누기 연산의 결과 몫이 0이 되기 때문에 이 경우 한 번의 요금제 사이클에 대한 값이 계산되지 않게 된다. 따라서 최소한의 요금을 계산하기 위해서는 + 1을 해줘야 한다.

 

자세한 예시는 아래와 같다.

예시

  1. 통화 시간이 29초일 때:
    • input / 30의 몫은 0이다.
    • 그러나 요금은 30초 단위로 계산되므로 최소 10원이 청구된다.
    • 따라서 (29 / 30 + 1) * 10이 되어 10원이 청구된다.
  2. 통화 시간이 45초일 때:
    • input / 30의 몫은 1이다.
    • 그러나 45초는 30초를 초과하므로 두 번째 요금 단위가 적용되어야 한다.
    • (45 / 30 + 1) * 10이 되어 20원이 청구된다.
  3. 통화 시간이 정확히 30초, 60초일 때도 동일하게 처리:
    • 예를 들어, 30초는 (30 / 30 + 1) * 10으로 20원이 청구된다.
    • 이렇게 하면 시간 단위마다 요금을 추가로 계산하게 된다.

'코딩테스트 > 문제풀이' 카테고리의 다른 글

[백준/3273번/C++] 두 수의 합  (0) 2024.10.28
[백준/1475번/C++] 방 번호  (0) 2024.10.28
[백준/2576번/C++] 홀수  (0) 2024.10.27
[백준/2490번/C++] 윷놀이  (0) 2024.10.27
[백준/2752번/C++] 세수정렬  (0) 2024.10.25
작성일
2024. 10. 27. 22:55
작성자
risehyun
  • 문제

 

  • 문제풀이
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
	ios::sync_with_stdio(false);
	cout.tie(0);
	cin.tie(0);

	int number = 0, minValue = 0;
	int sum = 0;
	vector<int> odds;

	for (int i = 0; i < 7; i++)
	{
		cin >> number;

		if (number % 2 == 1)
		{
			odds.push_back(number);
			sum += number;
		}
	}

	if (sum == 0)
	{
		sum = -1;
		cout << sum;
	}
	else
	{
		minValue = *min_element(odds.begin(), odds.end());
		cout << sum << '\n' << minValue;
	}

	return 0;
}

 

// Authored by : pha-ran (soft18)
// Co-authored by : -
// http://boj.kr/c2a05cf9d222441dba79bba4e9ac5b6e
#include <bits/stdc++.h>
using namespace std;

int main(void){
  ios::sync_with_stdio(0);
  cin.tie(0);
  
  int x, odd = 0, sum = 0, min = 100;

  for (int i = 0; i < 7; i++) {
    cin >> x;

    if (x & 1) {
      odd += 1;
      sum += x;

      if (x < min) {
        min = x;
      }
    }
  }

  if (odd) cout << sum << "\n" << min;
  else cout << "-1";
}

 

  • 메모

문제 자체는 홀수인지 확인해서 해당 값을 누적해서 더하고, 그 중에서 가장 작은 값을 판별하면 된다.
나의 풀이의 경우 입력받은 값에서 나머지 연산을 해서 값이 1인 경우 홀수로 판별하는 방법을 사용했다.

최소값을 구하기 위해서 홀수인 경우에만 odds 벡터 안에 값을 push_back하고 algorithm 헤더에 있는 min_element를 이용해 벡터에서 가장 작은 값이 있는 주소를 반환하고 해당 값에 포인터를 사용해서 그 위치의 데이터 값을 min 변수에 저장하는 방식을 사용했다.

 

그런데 더 나은 풀이를 확인해보니 비트 연산을 사용해서 홀수 판별을 하고, 먼저 min 값을 최댓값으로 두고 값이 들어올 때마다 비교해서 교체해주는 방식을 사용했다. 출력부분에 왔을때 홀수가 있는지만 확인해서 -1만 출력하는 형식으로 훨씬 간결하게 작성되어 있다. vector를 따로 선언해서 저장공간을 사용하지 않기 때문에 이쪽이 더 최적화된 방법이라는 생각이 들었다.

  • 다시 짚어보기
- if (x & 1)
x가 홀수인지 검사한다.
이때 조건으로 제시된 x & 1은 x의 가장 오른쪽 비트가 1인지(즉, 홀수인지)를 확인하는 비트 연산이다.
- minValue = *min_element(odds.begin(), odds.end());

algorithm 헤더의 함수 중 두 값을 비교해 최대, 최소값을 리턴해주는 max(), min() 함수처럼 
배열이나 벡터에서 정해진 구간 중에서 최대, 최소값이 저장된 주소를 반환해준다.
값을 따로 얻어오기 위해서는 포인터 연산자를 사용해야하며, 구간 설정을 처음부터 끝까지로 하고 싶다면
begin()과 end()를 사용하면 된다.

 

'코딩테스트 > 문제풀이' 카테고리의 다른 글

[백준/1475번/C++] 방 번호  (0) 2024.10.28
[백준/1267번/C++] 핸드폰 요금  (0) 2024.10.27
[백준/2490번/C++] 윷놀이  (0) 2024.10.27
[백준/2752번/C++] 세수정렬  (0) 2024.10.25
[백준/28279번/C++] 덱 2  (0) 2024.08.26
작성일
2024. 10. 27. 18:55
작성자
risehyun
  • 문제

 

  • 풀이
#include <iostream>
using namespace std;

int main()
{
	ios::sync_with_stdio(false);
	cout.tie(0);
	cin.tie(0);

	int input = 0;

	for (int i = 0; i < 3; i++)
	{
		int cnt = 0;


		for (int j = 0; j < 4; j++)
		{
			cin >> input;

			if (input == 0)
			{
				cnt++;
			}
		}

		switch (cnt)
		{
		case 0:
			cout << 'E' << '\n';
			break;

		case 1:
			cout << 'A' << '\n';
			break;

		case 2:
			cout << 'B' << '\n';
			break;

		case 3:
			cout << 'C' << '\n';
			break;

		case 4:
			cout << 'D' << '\n';
			break;
		}
	}
    
	return 0;
}

 

// Authored by : wogha95
// Co-authored by : BaaaaaaaaaaarkingDog
// http://boj.kr/38cf0450b8c8458e859c486e3ea80323
#include <bits/stdc++.h>
using namespace std;

int result, input;
string res = "DCBAE";

int main(void){
  ios::sync_with_stdio(0);
  cin.tie(0);
    
  for(int r = 0; r < 3; r++) {
    result = 0;
    for(int c = 0; c < 4; c++) {
      cin >> input;
      result += input;
    }
    cout << res[result] << '\n';
  }
}

 

  • 메모
    단순하게 입력받은 값의 0의 개수가 몇개인지에 따라 스위치문으로 결과를 출력하는 방식으로 문제를 맞췄으나 훨씬 더 깔끔하고 직관적인 방법이 풀이가 있어서 참고하기로 했다. 어차피 0의 갯수에 따라서 결과가 달라지므로 미리 string에 결과 값에 따라 순서대로 문자열로 선언해두고 최종 값을 출력할 때는 문자열에서 0의 개수를 인덱스로 사용해서 결과를 출력하는 방식이다.

'코딩테스트 > 문제풀이' 카테고리의 다른 글

[백준/1267번/C++] 핸드폰 요금  (0) 2024.10.27
[백준/2576번/C++] 홀수  (0) 2024.10.27
[백준/2752번/C++] 세수정렬  (0) 2024.10.25
[백준/28279번/C++] 덱 2  (0) 2024.08.26
[백준/18258번/C++] 큐 2  (0) 2024.08.26
작성일
2024. 10. 25. 23:08
작성자
risehyun
작성일
2024. 10. 25. 20:51
작성자
risehyun
작성일
2024. 10. 25. 19:19
작성자
risehyun
  • 문제

 

 

  • 답안

- vector, sort를 쓴 경우

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> arr;
int input;

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);

	for (int i = 0; i < 3; i++)
	{
		cin >> input;
		arr.push_back(input);
	}

	sort(arr.begin(), arr.end());

	for (int i = 0; i < 3; i++)
	{
		cout << arr[i] << ' ';
	}


	return 0;
}

 

 

- swap으로 직접 정렬

#include <iostream>
using namespace std;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	int arr[3] = { 0, };

	for (int i = 0; i < 3; i++)
	{
		cin >> arr[i];
	}

	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 2; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}

	for (int i = 0; i < 3; i++)
	{
		cout << arr[i] << ' ';
	}

	return 0;
}