관리 메뉴

너와 나의 스토리

(BOJ) 14891 톱니바퀴 본문

Algorithm/기타

(BOJ) 14891 톱니바퀴

노는게제일좋아! 2019. 5. 9. 23:26
반응형

문제: https://www.acmicpc.net/problem/14891

 

문제 설명:

N극 = 0  / S극 =1

방향 1 = 시계방향으로 회전  / 방향 -1 = 반시계방향으로 회전

4개의 톱니바퀴 중 하나를 돌릴 때, 돌리기 직전의 톱니와 맞닿아 있던 톱니의 극이 다르면 반대로 회전시킨다.

맞닿은 톱니들의 극이 같아질 때까지 돌리기 X, 한번만 돌림

 

문제 풀이:

톱니가 돌아가는 것은 왼쪽을 가리키는 포인터, 오른쪽을 가리키는 포인터를 만들어서 회전 방향에 따라 +1, -1 해주면 됨 -> 사실 포인터 하나만 있어도 충분한데 헷갈리니까 그냥 두 개 만들었다 ㅎㅎ

포인터가 7일 때, +1해주면 범위를 넘어가므로 %8 해줘야한다.

*주의* 반대로 0일 때, -1하는 경우 ( ex) (0-1)%8 ) 하면 -1이 되므로 틀림 -> (0-1+8)%8 해줘야 함

  -> 이거 때문에 계속 맞왜틀 ㅠㅠ 하다가 겨우 찾음 

 

문제만 잘 읽고, 기본적인 실수만 안하면 쉬운 문제인 것 같다.

 

소스 코드:

typedef pair<int, int> P;
int n, res, score[4] = {1,2,4,8};
char arr[4][8];
vector<P> v;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL), cout.tie(NULL);

	
	for (int i = 0; i < 4; i++) {
		for (int j = 0; j < 8; j++) {
			cin >> arr[i][j];
		}
	}
	for (int i = 0; i < 4; i++) v.push_back({ 6,2 });
	cin >> n;
	for (int i = 0; i < n; i++) {
		int a, b;
		cin >> a >> b;
		a--;
		int l = v[a].first, r = v[a].second;
		v[a] = make_pair((l - b+8) % 8, (r - b+8) % 8);
		int d = b;
		for (int i = a - 1; i >= 0; i--) {
			if (arr[i][v[i].second] == arr[i+1][l]) break;
			d *= -1;
			l = v[i].first;
			v[i] = make_pair((v[i].first - d + 8) % 8, (v[i].second - d + 8) % 8);
		}
		d = b;
		for (int i = a + 1; i < 4; i++) {
			if (arr[i][v[i].first] ==arr[i-1][r]) break;
			d *= -1;
			r = v[i].second;
			v[i] = make_pair((v[i].first - d + 8) % 8, (v[i].second - d + 8) % 8);
		}
	}
	for (int i = 0; i < 4; i++) {
		if (arr[i][(v[i].first + 2)%8] == '1') res += score[i];
	} 
	cout << res << '\n';
	return 0;
}

 

 

반응형

'Algorithm > 기타' 카테고리의 다른 글

(BOJ) 12782 비트 우정지수  (0) 2019.05.25
(BOJ) 17209 새내기와 헌내기  (0) 2019.05.25
(BOJ) 1931 회의실배정  (0) 2019.05.01
(BOJ) 17070 파이프 옮기기 1  (0) 2019.03.20
(BOJ) 11055 가장 큰 증가 부분 수열  (0) 2019.03.13
Comments