컴퓨터기본/문제풀이

[백준] 2231번, 7568번

차가운오미자 2021. 6. 19. 22:56

2231번

https://www.acmicpc.net/problem/2231

 

2231번: 분해합

어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이

www.acmicpc.net

brute-force 방식으로 푸는 문제이다

 

나는 getparts()라는 함수를 별도로 정의해서 했는데, 사실 별도로 정의할 필요없이 바로 메인 함수에 때려넣어도 충분하다. 나는 구조화할 때, 어떤 기능을 할 함수를 가정해서 메인함수를 일단 짜버리는게 생각하기 편해서 그랬다.

 

1. 핵심은 목표한 m이라는 숫자를 생성할 수 있는 숫자를 찾기 위해서 1부터 m까지가 그냥 다 돌려보는 것이다. (for문의 i를 이용)

2. 하나의 숫자(i) + 숫자 각 자리의 합(getparts(i)) = m 이면 답이 될 수 있다. 단, 생성자인 값이 나오면 바로 for문에서 나갈 수 있게 break를 걸어준다.

3. for문을 다 돌았는데도 해당하는 값이 안나오면 생성자가 없는 것이므로 0을 출력한다. 아래 코드에서는 기본적으로 answer값을 0으로 맞춰놓고, i값을 찾았을 때 answer값에 i값을 저장하는 방법으로 했다. 

#include <iostream>

using namespace std;

int getparts(int num){
	//num의 각 자리 숫자를 합한 값을 return 한다.
    
	int result = 0;
	int j =1000000; // 주어지는 자연수가 1부터 1000000까지이니까 나누기도 거기까지 십의 단위로
	while(num>0){ // 1의 자리까지 더하면 멈출 수 있도록
		if(num/j>0){ // 사실 없어도 된다. 어차피 216을 10000으로 나누면 0값이 더해지므로 노상관
			result += num/j;
			num = num%j; // 이미 더한 자리수들은 정리해준다. 나머지만 저장
            // 예를 들어 216을 100으로 나눠 2를 더했으니 16가지고만 돌리도록
		}
		j = j/10;
	}
	
	return result;
	
}

int main(void){
	
	int answer = 0;
	int n, m; // m이 목표하는 숫자 
	cin >> m;
	
	for(int i = 0; i<m; i++){
		if(getparts(i)+i == m){
			answer = i;
			break;
		}
	}
	
	cout << answer << endl;
	
}

 

7568번

https://www.acmicpc.net/problem/7568

 

7568번: 덩치

우리는 사람의 덩치를 키와 몸무게, 이 두 개의 값으로 표현하여 그 등수를 매겨보려고 한다. 어떤 사람의 몸무게가 x kg이고 키가 y cm라면 이 사람의 덩치는 (x, y)로 표시된다. 두 사람 A 와 B의 덩

www.acmicpc.net

역시 brute-force방식으로 푸는 문제이다. 

그냥 제시된 사람들이랑 다 비교해보고, 큰 애 있으면 count 하나 올려주면 된다. 

#include <iostream>
#include <vector>

using namespace std;

int main(void){
	
	// get inputs
	int n, h, w; // 입력값을 받기 위한 변수
	cin >> n;
	cin.ignore();
	
	vector<pair<int, int> > people; // 사람 몸무게, 키 짝지어서 저장
	vector<int> answer; // 정답(순위들) 저장할 공간
	
	for(int i = 0; i<n; i++){
		cin >> h >> w;
		cin.ignore();
		people.push_back(make_pair(h, w));
	}
	
	/*
    // input값들이 잘 저장되었는지 확인
	for(int i = 0; i<people.size(); i++){
		cout << people[i].first << " " << people[i].second << endl;
	}*/
    
	
    // 한 사람 앞에 몇 명이나 있는지 확인
	for(int i = 0; i<people.size(); i++){
		int count = 1;
		for(int j = 0; j<people.size(); j++){
			if(j!=i){ // 자기 자신이랑 비교하지 않도록...
				// 누가 더 큰지 확인
				if(people[i].first < people[j].first && people[i].second < people[j].second){
					count++;
                    // 만약 자기보다 몸무게, 키가 모두 큰 사람이 있으면 count를 하나 늘려서 순위를 낮춘다.
				}
			}
		}
		answer.push_back(count);
	}
	
	for(int i = 0; i<answer.size(); i++){
		cout << answer[i] << ' ';
	}
}

'컴퓨터기본 > 문제풀이' 카테고리의 다른 글

[백준] 2606번: 바이러스  (0) 2021.06.20
[백준] 10773번, 1260번  (0) 2021.06.20
[백준] 10870번, 10872번, 2798번  (0) 2021.06.14
[이것이~] 15. 구현  (0) 2021.06.14
[백준] 10828번, 1991번  (0) 2021.06.14