1) 문제: 10804. 카드 역배치

2) 나의 첫 풀이
- sort() 함수를 사용해야겠다..? 이정도..?
- 감이 잡히지 않아 바킹독의 힌트를 보았고 reverse 함수를 사용하면 되겠구나! 생각했다.
reverse 함수란?
reverse(first, last);
reverse 함수는 algorithm 라이브러리의 포함되어있으며 의미 그대로 거꾸로 뒤집는 동작을 하는데,
해당 범위의 해당하는 원소들의 배열, 문자열 등의 요소들을 거꾸로 뒤집는다.
- 헤더 : <algorithm>
- [first, last) first를 포함한 인덱스부터 last 바로 전 인덱스까지의 요소들을 거꾸로 뒤집는다.
- 중요한 건, '인덱스'를 집어넣어야 한다는 것.
- 배열의 경우
reverse(a, a+5); //a배열의 처음부터 끝까지 뒤집음 (a[5] 배열)
reverse(b+1, b+4); //b배열의 두번째 요소부터 네번째 요소까지 뒤집음 (b[5] 배열)
- string, vector 의 경우
reverse(str.begin(), str.end()); //string의 처음부터 끝까지 뒤집음
reverse(v.begin()+1, v.end()-1); //벡터의 두번쨰 요소부터 네번째 요소까지 뒤집음
reverse 함수를 활용해서 구현한 경우
#include <iostream>
#include <algorithm>
using namespace std;
int num[21];
// 카드를 역순으로 놓는 함수
void reverse(int a, int b)
{
// 해당 반복문은 전체를 기준으로 절반을 나누어, swap해야 하는 범위를 정하고 있다.
// 가운데 값을 기준으로 배열의 첫 요소와 배열의 마지막 요소를 교환하여 역순으로 만든다.
for(int i=0; i<(b-a+1)/2; i++)
swap(num[a+i], num[b-i]);
}
int main()
{
int a, b;
for(int i=0; i<20; i++)
num[i] = i;
for(int i=0; i<10; i++){
cin >> a >> b;
reverse(a, b);
}
for(int i=0; i<20; i++)
cout << num[i] << ' ';
}
3) 나의 두 번째 풀이
- 배열의 시작 지점을 0으로 해두니, 0부터 19까지의 수로 채워져서 원하는 값을 얻지 못하고 있다. 따라서 배열의 시작 인덱스값을 바꿔주어 원하는 결과를 얻을 수 있게 했다.
<최종 코드>
#include <iostream>
#include <algorithm>
using namespace std;
int num[21];
// 카드를 역순으로 놓는 함수
void reverse(int a, int b)
{
// 해당 반복문은 전체를 기준으로 절반을 나누어, swap해야 하는 범위를 정하고 있다.
// 가운데 값을 기준으로 배열의 첫 요소와 배열의 마지막 요소를 교환하여 역순으로 만든다.
for(int i=0; i<(b-a+1)/2; i++)
swap(num[a+i], num[b-i]);
}
int main()
{
int a, b;
for(int i=1; i<=20; i++)
num[i] = i;
for(int i=1; i<=10; i++){
cin >> a >> b;
reverse(a, b);
}
for(int i=1; i<=20; i++)
cout << num[i] << ' ';
}
4) 배운 점: reverse() 함수
C++에서는 <algorithm> 헤더에 reverse 함수가 포함되어 있다. 이 함수는 범위 내의 요소를 역순으로 뒤집는다.
'Computer Science > PS' 카테고리의 다른 글
[PS] 별 찍기 모음 (0) | 2023.12.24 |
---|---|
[PS] 15552. 빠른 A+B (1) | 2023.12.19 |
[PS] 1267. 핸드폰 요금 (0) | 2023.12.17 |
[PS] 10093. 숫자 (0) | 2023.12.16 |
[PS] 2309. 일곱 난쟁이 (0) | 2023.12.16 |