-
10804) 카드 역배치 c++백준코딩일기 2020. 10. 17. 09:39
문제 ) www.acmicpc.net/problem/10804
풀이 )
카드가 1~20 이므로 배열의 크기를 21로 정했다.
1). swap 함수는서로의 자리를 바꾸는 형태로 첫 번째 예시에 나온 5(begin) ~ 10(end)을 바꾸는 거라면,
5 <--> 10
6 <--> 9
7 <--> 8총 3번(= (10-5)/2 +1 )의 swap 을 해야한다.
j=0 ... (10-5)/2+1 까지 for 문을 돌린다. 이때, 1을 더하는 이유는 나머지가 있다면 한 번 더 돌아야하기 때문이다.j=0 이면 swap(card[5+0], card[10-0) => swap(card[5], card[10])
j=1 이면 swap(card[5+1], card[10-1) => swap(card[6], card[9])
j=2 이면 swap(card[5+2], card[10-2) => swap(card[7], card[8])2). reverse 함수는
reverse(시작 지점, 끝지점) 으로 사용하면 되는데, card 는 0번째 인덱스를 의미하므로, 시작 지점은 card+begin, 끝 지점은 card+end가 된다.
코드 )
1). swap 함수 사용
#include <iostream> #include <algorithm> using namespace std; int main(void) { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int begin, end, card[21]; for(int i=0; i<21; i++) card[i] = i; for(int i=0; i<10; i++) { cin >> begin >> end; for (int j=0; j < (end - begin)/2 + 1; j++) swap(card[begin + j], card[end - j]); } for(int i = 1; i < 21; i++) cout << card[i] << ' '; }
2). reverse 함수 사용
#include <iostream> #include <algorithm> using namespace std; int main(void) { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int begin, end, card[21]; for(int i=0; i<21; i++) card[i] = i; for(int i=0; i<10; i++) { cin >> begin >> end; reverse(card+begin, card+end+1); } for(int i = 1; i < 21; i++) cout << card[i] << ' '; }
'백준코딩일기' 카테고리의 다른 글
18258) 큐2 c++ (0) 2020.11.04 10845) 큐 c++ (0) 2020.11.04 c++ 배열 사용 팁 (0) 2020.10.17 1919) 애너그램 만들기 c++ (0) 2020.10.17 13300) 방 배정 c++ (0) 2020.10.17