| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
- c++ 백준
- c#기본문법
- 바킹독
- solved class 2
- C++
- 바킹독알고리즘
- 백준 c++ 공부
- 오블완
- 리그오브레전드턴제게임
- 유니티
- unity3dservival
- c++ solved.ac
- unity게임만들기
- 티스토리챌린지
- 백준코테
- unity3d게임만들기
- c#
- 백준
- c#코딩기초트레이닝
- C#문법
- unity게임
- 백준 구현문제
- c#코테
- Unity
- 백준 C++
- c#기초문법
- 유니티공부
- 백준코딩테스트
- 유니티서바이벌게임만들기
- 유니티게임만들기
- Today
- Total
나 개발자 진짜 되냐?
바킹독 0x04 문제3 / 백준 1158번 요세푸스 문제 본문

반갑소
오랜만이요.
추석때 싱글벙글 놀기만 했소
이렇게 긴 연휴를 뱅글뱅글 놀아서그런지 조금의 아쉬움이 남소
그래도 책을 좀 봤소
한권을 다 읽진 못했지만
뭐 이번주안으로 마무리 할 것이요.
오랜만에 문제를 푸려니 굉장히 풀기싫ㅇ...
것도 있지만 아무 기억이 나지않는게 문제인거 같소..
이래서 나는 언제쯤...ㅋㅋㅋㅋ
오늘은 이름이 특이한 요세푸스... 문제를
풀어보겠소..

..문제를 20분이나 읽어봤는데 이해를 못 해서 지선생에게 물어봤다.
지선생 말로는 k 번째 사람 제거라서
1 2 3 4 5 6 7
이렇게 있으면
1부터 3칸 3지우고
그럼 3 다음인 4부터 시작 3칸 6 지우고
7에서 시작 3칸이니까 2 지우고
이렇게 지우는 거 같다.
중요한 건 원이 문제인데..
원으로 어떻게 만드는지 안 배웠는데......
ㅋㅋㅋㅋㅋㅋㅋㅋㅋ
맨 마지막의 다음 주소를 처음 주소로 하면 될 거 같은데
생각은 드는데 어떻게 코드를 짜야할지 잘 모르겠다.
지선생은 큐?로 푸는 방식이 가장 좋다고 이야기해 주었으나..
나는 아직 큐를 안 배웠기 때문에 연결리스트로 마음을 먹었다.
답을 봤더니 배열로 사용했다.
배열로 구현한 원형 연결 리스트
함께 알아보자.

pre와 nxt는 i 번째 사람의 왼쪽과 오른쪽을 담당한다.
왼쪽에는 그전사람의 주소가 담기고
오른쪽에는 그다음 사람의 주소가 담겨있도록 했다.
그리고 vector v는 제거되는 순서를 담도록 만들었다.
사실 이것도 5001 개 하면 되긴 하겠다.

이 식은 1부터 N까지 원형으로 연결하는 방식이다.
만약에 pre [i] 내 왼쪽에 식이 1이라면.. 맨 앞이니까
맨뒤의 숫자를 넣어주어야 하니 N을 넣어주게 되고
그게 아니라면 내가 지금 3인데 pre [i]는 2가 나와야 하니까
i-1로 해주는 방식이다.
밑도 마찬가지로
N 일경우 내 오른쪽의 값이 원형에 의해 1이 되어야 하니까
그 상황을 제외하고 다 next인 1을 더해주는 방식이다.
len을 더하는 이유는 길이를 카운트해서 나중에 한 개씩 빼면서
for문을 돌리기 위해서 더하게 된다.

여기서 i는 카운트에 역할을 한다.
k값까지 카운트가 되어야 한다. 그래서
조건문으로 i == k가 나오는 것이다.
연결리스트에서 커서역할을 하는 친구가
cur 이 친구이다.
여기가 중요한데
cur의 nex 사람의 전 주소를 내 전주소로 바꾼다.
아 이게 말로 하면 어렵고

그림으로 나타내면
cur이 5라고 치자
5의 nxt 인 6에 pre값를
현재 5의 pre값인 4로 수정 ( 보라색 화살표 )
5의 pre인 4의 nxt값을
현재 5의 nxt값인 6으로 수정 ( 초록색 화살표 )
이렇게 해서 5의 양쪽 값을 바꿔주게 된다.
지우게 되는 것..!
그리고 5를 벡터에 넣고
그리고 i를 초기화하고 len--한 줄 빼주기 숫자 하나 빠졌으니까
아니면 그냥 i++해서 k값에 맞추고!

다 하고 나서 출력도 나름? 중요한데
그 이유는
꼭 < > 이 친구를 적어달라고 했기 때문
그래서 < 먼저 출력하고
벡터 사이즈만큼 벡터를 출력한다.
그 사이사이에 따옴표도 넣어야 해서
if문으로 한 사이즈보다 작게 돌면서 " , " 해줘야 한다.
그다음에 다시 >로 닫아주기.
하면 끝!
배열로 연결리스트 만들어서 푼 거긴 한데
진짜 std list를 쓰면 어떨지 궁금해서 지피티에게 물어봤다.
그래도 배열로 연결리스트 쓰는 게 동적할당이 적어서 더 성능이 빠르다고 한다.
시간복잡도는 n*k개지만 말이다.
그래서 위에 식이 더 좋다고 해서
그냥 이렇게 하기로 했다.
연결리스트는 이렇게 3문제가 끝이다.
뭔가 엄청 어려운데 문제는 많이 없어서..
... 그냥 지나치고 싶다 ㅎㅎㅋ
아! 답 전체는

고생했다!
강의들으러 가야겠다!!!

'C++을 시작해봐요! > 알고리즘을 공부해봐요!' 카테고리의 다른 글
| 바킹독 0x05 문제2 / 백준 10773번 제로 (1) | 2025.10.15 |
|---|---|
| 바킹독 0x05 문제1 / 백준 10828번 스택 (0) | 2025.10.14 |
| 바킹독 0x04 문제2 - / 백준 5397번 키로거 (0) | 2025.10.01 |
| 바킹독 0x04 문제1 - / 백준 1406번 에디터 (0) | 2025.09.30 |
| 바킹독 0x03 문제8 - 애너그램 만들기 / 백준 1919번 (0) | 2025.09.29 |