나 개발자 진짜 되냐?

코딩테스트 입문 - 공 던지기 ( 원형벡터, 시계 & 반시계 ) 본문

프로그래머스를 풀어보아요!/C++

코딩테스트 입문 - 공 던지기 ( 원형벡터, 시계 & 반시계 )

Snow Rabbit 2026. 5. 1. 02:47

 

 

 

 

추억을 향수처럼

병에 담을 수 있다면 어떨까?

아무 때나 열어볼 수 있게.

 

 

레베카 뮤지컬을 보러 간 어느 날

 

정말 생각만 해오던 이 말이,

가끔 생각하던 이 문장이

레베카에서 나오는 명대사라는 것을 알았다.

 

그 뒤로 이 문장을 좋아한다.

 

과거의 추억과 따뜻함 그리고 행복함을 위해

나는 자주 갤러리에 가서

5년 전 사진과 대화들을 보고 또 보고 그런다.

 

누구에게나 잊고 싶지 않은 감정이 있듯...

그 감정을 향수처럼 담을 수 있다면

그때를 더욱더 기억하기 좋을 거 같다는 생각이 들었다.

 

그래서 나는 이 문장을 좋아한다.

 

 

사실,

오늘 그리고 내일이 가장 행복해야 하는데..

과거를 자꾸 너무 자주 열어보는 것도..

좋은 건 아닐 거 같다는 생각도 들었다.


 

 

 

보기에는 원형으로 풀면 좋을 거 같다고 생각은 드는데..? 원으로 어떻게 풀지..? 싶어서

 

인지 씨를 찾았다.

그리고 이건 던지는 번째이지

받은 친구가 아니라는 사실을 잊으면 안 된다.

 

 

이런 원형문제를 풀기 위해서 어떻게 해야 하냐고 물었더니

마법의 친구라며 소개해준 건..

%

인지 씨 말로는

어떤 숫자를 % 배열의 크기로 해주면 아무리 숫자가 커도

배열의 크기를 넘지 않고 뱅글뱅글 돌 수 있다고 한다.

 

근데 어떻게.. 나누기를 쓰라는 건지?!?

 

이해가 안 갔다.

 

더 어렵다고 힌트를 달라고 졸랐다.

 

인지 씨는 규칙을 생각해 보라고 했다.

 

첫 번째로 던지는 사람 = 0 번째

두 번째로 던지는 사람 = 0번째에서 2칸 갔으니 2번째 

세 번째로 던지는 사람 = 2번째에서 2칸 갔으니 4번째..

 

이것을 규칙으로 하면

 

( 던지는 순서 - 1 ) = 던지는 사람

( 던지는 순서 - 1 ) * 2를 해준 것.

2칸이니까!

 

이러면 k번째 던지는 사람은

( k - 1 ) * 2

 

오케이.

 

이제 아까 위에서 활용하려는 %를 해보자

만약에 위에처럼 4번째여야 하는데..

방에 3명뿐이면? 안되니까

4 % 3 하면.. 1이 나오니까..?

인덱스 1인 답 2가 되게 되는 것..!!

 

그래서 답이

 

 

이렇게 한 줄로 충분히 만들어진다.

 

하지만!

이렇게 하면 답이 안 나온다.

왜냐면 우리는

인덱스만 구했기 때문!!!

 

( k -1 ) * 2를 할 때 우리는 0 번째의 위치부터 시작했다.

 

 

그래서 인덱스이기 때문에 값을 넣어줘야 한다.

 

진짜 답!!

 


 

 

인지 씨에게 이런 원형으로 푸는 문제에

치트키 같은 매직 없냐고 물었다.

 

%를 활용하며 풀면 좋다고 했다.

 

시계방향으로 돌 때

( 현재 위치 + 이동할 칸 수 ) % 전체 크기

우리는 현재 위치가 0부터 시작이었고

이동할 칸 수는

( k - 1) * 2였다.

 

내가 아까

 던지는 번째가 중요하다고 했다.

받은 친구가 아니라는 사실을 잊으면 안 된다.

 

 던지는 번째를 구할 땐 벡터[방번호]

받은 친구는 누구냐?? 순서는 누구냐?

구한 방번호 + 1

 

첫 번째 던지는 그 위치는 0이기 때문에

k-1이 맞다.

 

반시계방향으로 돌 때

( 현재 위치 - 이동할 칸 수 + 전체 크기 ) % 전체 크기

뒤로 가라 혹은 왼쪽으로 가세요! 할 때 쓰는 것으로

왜 전체크기를 또 더해줄까?

예를 들면

1에서 2칸 뒤로 가요 하면 -1인데

c++은 -1은.. 방이 없어..! 난 0부터 시작해! 하면서

에러를 낸다고 한다.

 

그래서 음수가 되는 것을 막기 위해 전체크기를 더해준다고 한다.

 

 

 

 

마냥 쉬운 문제는 아니었다.

하지만 치트키를 배웠으니

다음에도 활용하고 싶다.

그러고 싶다.