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 |