Skip to content

Commit d1dfc6e

Browse files
authored
Merge pull request #3 from bsa0322/sua1
[정렬] 03월 04일 (필수 2개 + 선택 5개 CPP)
2 parents 156ef35 + 05e2b1c commit d1dfc6e

File tree

7 files changed

+316
-0
lines changed

7 files changed

+316
-0
lines changed

03월 04일 - 정렬/과제/1026.cpp

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#include <iostream>
2+
#include <vector>
3+
#include <algorithm>
4+
5+
using namespace std;
6+
7+
//함수 S의 계산
8+
int calcS(int n, vector<int> a, vector<int> b) {
9+
int s = 0;
10+
for (int i = 0; i < n; i++) {
11+
s += (a[i] * b[i]);
12+
}
13+
return s;
14+
}
15+
16+
/**
17+
* 문제에서 B를 재배열하지 말라곤 했지만, 해야하는 문제
18+
* 각 배열에서 가장 큰 값과 가장 작은 값을 곱해야 최솟값이 나옴!
19+
*/
20+
21+
int main() {
22+
int n;
23+
vector<int> a, b;
24+
25+
//입력
26+
cin >> n;
27+
a.assign(n, 0);
28+
b.assign(n, 0);
29+
for (int i = 0; i < n; i++) {
30+
cin >> a[i];
31+
}
32+
for (int i = 0; i < n; i++) {
33+
cin >> b[i];
34+
}
35+
36+
//연산
37+
sort(a.begin(), a.end()); //오름차순 정렬
38+
sort(b.begin(), b.end(), greater<>()); //내림차순 정렬
39+
int result = calcS(n, a, b);
40+
41+
//출력
42+
cout << result;
43+
return 0;
44+
}

03월 04일 - 정렬/과제/10804.cpp

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
#include <iostream>
2+
#include <vector>
3+
#include <algorithm>
4+
5+
using namespace std;
6+
const int SIZE = 20;
7+
8+
vector<int> arr(SIZE + 1); //1번 인덱스부터 시작하기 위해 크기를 (SIZE + 1)로 선언
9+
10+
//a ~ b를 역순으로 배치하는 함수, reverse 함수 직접 구현
11+
void reverseAtoB(int a, int b) {
12+
//더하고 빼는 변화값을 증가변수로 줘서 사용, 절반까지만
13+
for (int i = 0; i <= (b - a) / 2; i++) {
14+
swap(arr[a + i], arr[b - i]);
15+
}
16+
}
17+
18+
/**
19+
* 단순 구현 문제.
20+
* 1. 직접 구현: 카드를 역순으로 두기 = 수열을 반으로 접었다 생각할 때, 마주보는 원소끼리 swap!
21+
* 2. 함수 활용: <algorithm> 헤더에 있는 "reverse" 함수 사용 -> reverse(시작 반복자, 종료 반복자): 시작 ~ 종료전까지 원소들을 뒤집음
22+
*/
23+
24+
int main() {
25+
int a, b;
26+
27+
//카드 초기화
28+
for (int i = 1; i <= SIZE; i++) {
29+
arr[i] = i;
30+
}
31+
//입력 & 연산
32+
//입력이 10개로 한정되므로 for문으로 10번 입력받는 것도 가능!
33+
while (cin >> a >> b) { //입력이 있을 때까지만 받음 (입력이 끝나면 ctrl+D 를 눌러서 종료!)
34+
//헤더 함수 사용
35+
reverse(arr.begin() + a, arr.begin() + b + 1);
36+
37+
//직접 구현
38+
//reverseAtoB(a, b);
39+
}
40+
//출력
41+
for (int i = 1; i <= SIZE; i++) {
42+
cout << arr[i] << ' ';
43+
}
44+
return 0;
45+
}

03월 04일 - 정렬/과제/11651.cpp

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#include <iostream>
2+
#include <vector>
3+
#include <algorithm>
4+
5+
using namespace std;
6+
7+
typedef pair<int, int> ci;
8+
9+
bool cmp(const ci &a, const ci &b) {
10+
if (a.second != b.second) { //1. y좌표가 증가하는 순서
11+
return a.second < b.second;
12+
}
13+
return a.first < b.first; //2. (y좌표가 같으면) x좌표가 증가하는 순서
14+
}
15+
16+
int main() {
17+
int n, a, b;
18+
19+
//입력
20+
cin >> n;
21+
vector<ci> arr(n, {0, 0});
22+
for (int i = 0; i < n; i++) {
23+
cin >> arr[i].first >> arr[i].second;
24+
}
25+
//연산
26+
sort(arr.begin(), arr.end(), cmp);
27+
//출력
28+
for (int i = 0; i < n; i++) {
29+
cout << arr[i].first << ' ' << arr[i].second << '\n';
30+
}
31+
return 0;
32+
}

03월 04일 - 정렬/과제/12840.cpp

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
#include <iostream>
2+
3+
using namespace std;
4+
5+
const int MINUTE = 60; //1분 초로 나타냄
6+
const int HOUR = 60 * MINUTE; //1시간 초로 나타냄
7+
const int DAY = 24 * HOUR; //하루 초로 나타냄
8+
9+
//변화하는 초 값 계산해서 보내주는 함수
10+
int changeTime(int t, int c) {
11+
//돌리는 초가 하루보다 크다면 하루가 넘어가므로 모듈러 연산 후 연산
12+
int change_value = c % DAY;
13+
if (t == 2) { //시간 뒤로
14+
change_value = -change_value;
15+
}
16+
return change_value;
17+
}
18+
19+
/**
20+
* 단순 구현 문제
21+
* 시계를 앞으로 돌리면 +, 뒤로 돌리면 -
22+
* !주의! 전날로 넘어갈 수 있으므로 항상 모듈러 연산을 하고,
23+
* 그럼에도 전날로 넘어갔을 경우 하루를 더해주는게 중요
24+
*/
25+
26+
int main() {
27+
//입출력 속도 향상
28+
ios_base::sync_with_stdio(false);
29+
cin.tie(NULL);
30+
31+
int h, m, s, q, t, c, second = 0;
32+
//입력
33+
cin >> h >> m >> s;
34+
cin >> q;
35+
//시간 초기화
36+
second = h * HOUR + m * MINUTE + s;
37+
//입력 & 연산 & 출력
38+
while (q--) {
39+
cin >> t;
40+
if (t == 3) { //시계가 가리키는 시간 출력
41+
second %= DAY; //하루가 넘어갔을 수 있으므로 모듈러 연산
42+
h = second / HOUR;
43+
m = (second % HOUR) / MINUTE;
44+
s = (second % HOUR) % MINUTE;
45+
cout << h << ' ' << m << ' ' << s << '\n';
46+
} else { //t=1, 시계 앞으로(+) / t=2, 시계 뒤로(-)
47+
cin >> c;
48+
second += changeTime(t, c);
49+
if (second < 0) //전날로 넘어갔다면
50+
second += DAY; //하루 더해서 전날의 초(s) 양수로
51+
}
52+
}
53+
return 0;
54+
}

03월 04일 - 정렬/과제/1431.cpp

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#include <iostream>
2+
#include <vector>
3+
#include <algorithm>
4+
5+
using namespace std;
6+
7+
//문자열의 모든 자릿수 합을 구하는 함수
8+
int sumNum(string str) {
9+
int sum = 0;
10+
for (int i = 0; i < str.size(); i++) {
11+
if (isdigit(str[i])) { //문자(char)에 대해 숫자인지 판별하는 함수
12+
sum += str[i] - '0'; //char -> int로 바꾸는 방법 (아스키 코드에 대해 알아보세요)
13+
}
14+
}
15+
return sum;
16+
}
17+
18+
//비교함수
19+
bool cmp(const string &s1, const string &s2) {
20+
if (s1.size() != s2.size()) { //두 문자열의 길이가 다르다면 짧은 문자열이 먼저 오도록
21+
return s1.size() < s2.size();
22+
}
23+
if (sumNum(s1) != sumNum(s2)) { //두 문자열의 숫자 합이 다르다면 합이 작은 문자열이 먼저 오도록
24+
return sumNum(s1) < sumNum(s2);
25+
}
26+
return s1 < s2; //사전순
27+
}
28+
29+
int main() {
30+
int n;
31+
vector<string> serial_num;
32+
33+
//입력
34+
cin >> n;
35+
serial_num.assign(n, "");
36+
for (int i = 0; i < n; i++) {
37+
cin >> serial_num[i];
38+
}
39+
40+
//연산
41+
sort(serial_num.begin(), serial_num.end(), cmp);
42+
43+
//출력
44+
for (int i = 0; i < n; i++) {
45+
cout << serial_num[i] << '\n';
46+
}
47+
return 0;
48+
}

03월 04일 - 정렬/과제/1758.cpp

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#include <iostream>
2+
#include <vector>
3+
#include <algorithm>
4+
5+
using namespace std;
6+
7+
long long calTip(int n, vector<int> &tips) {
8+
long long ans = 0;
9+
for (int i = 0; i < n; i++) {
10+
int cur_tip = tips[i] - i;
11+
if (cur_tip < 0) //음수면 팁에 더하지 않는데 처음에 내림차순 정렬했으므로 아예 break
12+
break;
13+
ans += cur_tip;
14+
}
15+
return ans;
16+
}
17+
18+
/**
19+
* 강호가 받을 수 있는 팁이 최댓값이 되려면 팁이 많은 사람의 순위가 높아야함
20+
* !주의! 주어지는 N의 최대 크기가 100,000이고 팁의 최대 크기가 100,000이므로
21+
* 정답의 최댓값은 10^5 * (10^5+1) / 2로 int 범위를 넘기 때문에 long long 을 써야 함
22+
*/
23+
24+
int main() {
25+
int n;
26+
27+
//입력
28+
cin >> n;
29+
vector<int> tips(n, 0);
30+
for (int i = 0; i < n; i++) {
31+
cin >> tips[i];
32+
}
33+
//연산
34+
sort(tips.begin(), tips.end(), greater<>()); //내림차순 정렬
35+
//출력
36+
cout << calTip(n, tips) << '\n';
37+
return 0;
38+
}

03월 04일 - 정렬/과제/1946.cpp

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
#include <iostream>
2+
#include <algorithm>
3+
#include <vector>
4+
5+
using namespace std;
6+
7+
typedef pair<int, int> ci; //pair<int,int> 자료형을 ci 별칭으로 사용함을 정의
8+
9+
/**
10+
* 서류심사 혹은 면접심사 순위 기준으로 정렬해서 나머지 심사 순위 비교하며 푸는 문제
11+
* 본 풀이는 서류심사 순위를 기준으로 정렬한 풀이
12+
*/
13+
14+
int cntEmploy(int n, vector<ci> rank) {
15+
/**
16+
* 서류심사가 1등인 0번 인덱스 사람은 무조건 합격이므로 1번 인덱스부터 검사
17+
* 현재 인덱스 사람은 서류심사 순위가 그 다음 인덱스 사람들보다 무조건 위
18+
* 따라서 그 전 사람들(서류심사가 현재 사람보다 높은)보다 면접심사가 높으면 합격
19+
*/
20+
int ans = 1, first_rank = rank[0].second;
21+
for (int i = 1; i < n; i++) {
22+
//전 사람들 모두의 면접심사 순위보다 더 높은 경우
23+
if (first_rank > rank[i].second) {
24+
//가장 높은 면접심사 순위 계속 갱신해서 O(n) 으로 풀이
25+
first_rank = rank[i].second;
26+
ans++;
27+
}
28+
}
29+
return ans;
30+
}
31+
32+
int main() {
33+
int t, n, ans;
34+
vector<ci> rank;
35+
36+
//입력
37+
cin >> t;
38+
while (t--) {
39+
cin >> n;
40+
rank.assign(n, ci(0, 0));
41+
for (int i = 0; i < n; i++) {
42+
cin >> rank[i].first >> rank[i].second; //first: 서류심사 순위, second: 면접심사 순위
43+
}
44+
45+
//연산
46+
//first값인 서류심사 순위가 높은 순서대로 정렬 (오름차순 정렬)
47+
//왼쪽값 기준 오름차순 정렬이 기본 정렬이므로 cmp함수 필요 없음
48+
sort(rank.begin(), rank.end());
49+
ans = cntEmploy(n, rank);
50+
51+
//출력
52+
cout << ans << '\n';
53+
}
54+
return 0;
55+
}

0 commit comments

Comments
 (0)