728x90
SMALL
백준 문제 풀이: 1592 (영식이와 친구들)
문제 링크: https://www.acmicpc.net/problem/1592
문제 설명:
N명의 친구들이 원형으로 앉아 공을 던집니다. 공을 M번 받은 사람이 나오면 게임이 끝납니다. 공을 받은 횟수가 **홀수**면 오른쪽으로 L번째, **짝수**면 왼쪽으로 L번째 친구에게 공을 던집니다. 공을 던지는 총 횟수를 구하세요.
문제 해결 코드
#include <iostream>
using namespace std;
int arr[51]; // 각 친구의 공을 받은 횟수
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int n, m, l; // n: 친구 수, m: 게임 종료 조건(최대 횟수), l: 던지는 거리
cin >> n >> m >> l;
int i = 1; // 현재 공을 가진 사람 (1번부터 시작)
int cnt = -1; // 공을 던진 횟수 (-1부터 시작해서 초기 던지기를 포함)
while (true) {
arr[i]++; // 현재 사람이 공을 받음
cnt++; // 공을 던진 횟수 증가
// 게임 종료 조건: 공을 M번 받은 사람이 나오면 종료
if (arr[i] >= m) {
break;
}
// 다음 사람을 결정: 홀수면 오른쪽, 짝수면 왼쪽
if (arr[i] % 2 == 0) {
i -= l; // 짝수면 왼쪽으로 던짐
if (i <= 0) {
i += n; // 원형 구조로 돌아감
}
} else {
i = (i + l - 1) % n + 1; // 홀수면 오른쪽으로 던짐 (원형 구조 처리)
}
}
cout << cnt << '\n'; // 총 던진 횟수 출력
return 0;
}
코드 설명
코드의 주요 로직과 사용된 알고리즘 설명:
- 게임 진행: 각 친구는 공을 받을 때마다 횟수가 증가합니다. 공을 M번 받은 친구가 나오면 게임이 종료됩니다.
- 원형 구조 처리:
- 왼쪽으로 이동할 때:
i -= l
로 계산 후,i <= 0
인 경우i += n
로 돌아갑니다. - 오른쪽으로 이동할 때:
i = (i + l - 1) % n + 1
를 사용해 원형 구조를 유지합니다.
- 왼쪽으로 이동할 때:
- 시간 복잡도 분석: 각 공을 던질 때마다 O(1)의 연산을 수행하므로 총 O(공 던진 횟수)입니다. 게임은 최대 M번 공을 받을 때 종료되므로 **시간 복잡도는 O(N * M)**입니다.
결과
게임이 종료될 때까지 공을 던진 횟수를 정확히 계산하여 출력합니다.
- 입력 예시:
5 3 2
- 출력 예시:
10
다른 접근 방식이나 개선 사항이 있다면 댓글로 공유 부탁드립니다!
728x90
LIST
'BAEKJOON > 구현' 카테고리의 다른 글
백준 3230번 [금메달, 은메달, 동메달은 누가?](C++) -yes6686- 티스토리 (0) | 2024.07.13 |
---|---|
백준 3035번 [스캐너](C++) -yes6686- 티스토리 (0) | 2024.07.13 |
백준 17548번 [Greetings!](C++) -yes6686- 티스토리 (0) | 2024.07.13 |
백준 2947번 [나무 조각](C++) -yes6686- 티스토리 (0) | 2024.07.12 |
백준 2846번 [오르막길](C++) -yes6686- 티스토리 (0) | 2024.07.12 |