inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

3-I

3-I 질문있습니다!

해결된 질문

167

mch473700

작성한 질문수 16

0

코드 리뷰를 한번 보고 로직을 작성했는데
처음에는 이 방식으로 작성했습니다

if (visited[(turn+1) % 2][next]) continue;

visited[(turn+1) % 2][next] = visited[(turn) % 2][now] + 1;

 

500000 0 을 입력했을 때 999가 나오면서 오답인데
선생님 코드는

if (visited[(turn) % 2][next]) continue;

visited[(turn) % 2][next] = visited[(turn +1) % 2][now] + 1;

으로 -1 나오면서 정답인데
두 코드간의 차이를 모르겠습니다

 

 

 

c++ 코딩-테스트

답변 3

1

큰돌

안녕하세요 ㅎㅎ

	visited[0][n] = 1;
	q.push(n);

	if (n == k)
	{
		cout << 0 << "\n";
		return 0;
	}

	while (q.size())
	{
		k += trun;
		if (k > MAX) break;
		if (visited[trun % 2][k])
		{
			ok = true;
			break;
		}

		int size = q.size();
		for (int i = 0; i < size; ++i)
		{
			int now = q.front();
			q.pop();

			for (int next : {now + 1, now - 1, now * 2})
			{
				if (next <0 || next >MAX) continue;
				if (visited[(trun+1) % 2][next]) continue;

이렇게 하게 되면 의미자체가 틀린 코드가 됩니다.

저 for문안에서 하고자 하는 것은 지금의 trun에서 next라는 정점을 갔을 때의 방문을 확인하는 코드인데요.

저기서 + 1을 기반으로 하게 되면 해당 의미가 깨져서 틀리게 됩니다.


 

또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.


0

큰돌

안녕하세요 mch님ㅎㅎ

오랜만이네요.

 

저렇게 할경우에는 turn에 따른 부분을 좀 조정해주어야 할 것 같은데요. 전체 코드 부탁드립니다.

 

감사합니다.

0

mch473700

죄송합니다!! 링크 보내드렸습니다!

http://boj.kr/7a21c5fe5fa548f09c6f7a125085c667

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.
mch473700님께서 문의 주신 코드에 대한 이해를 돕기 위해 추가 설명을 드리겠습니다.

님께서 질문하신 코드 로직에서 사용하는 visited 배열의 인덱스 접근 방식 차이로 인해 결과가 다르게 나오는 것 같습니다.
구체적으로 살펴보면:

  1. 코드 차이점

    • 님의 방법:

      if (visited[(turn+1) % 2][next]) continue;
      visited[(turn+1) % 2][next] = visited[(turn) % 2][now] + 1;
      

      이 방법은 다음 턴의 상태를 방문했는지 체크하고, 방문 기록을 갱신하려고 시도합니다. 이는 논리적인 오류를 발생시킬 수 있습니다.

    • 선생님의 방법:

      if (visited[(turn) % 2][next]) continue;
      visited[(turn) % 2][next] = visited[(turn +1) % 2][now] + 1;
      

      이 방법은 현재 턴의 상태를 적절하게 비교하고, 앞선 턴의 값을 기반으로 방문 기록을 갱신합니다.

  2. 논리적 차이

    • BFS와 같은 탐색 알고리즘에서 visited 배열은 전 방한 여부를 추적하고, 그 안에 저장되는 값이 다음 상태로의 이동에 필요한 비용이나 경과 시간을 나타낼 수 있습니다.
    • 선생님의 방법은 “현재 턴”과 “직전 턴” 정보를 올바르게 활용하여 이동 경로를 추적 및 계산하여 정확한 결과를 내는 것으로 보입니다.

가능하면 기존 답변을 다음 게시글에서 확인해 보시길 권장드립니다:

두 코드를 비교하며 각각의 인덱싱 방식이 어떻게 문제를 해결하는지를 분석하시면 이해에 도움이 될 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

코딩살구클럽 관련 건의사항

0

4

0

코살에 19942 다이어트 문제에 N의 범위가 빠져있슴니다

0

4

0

진행 방법 질문드립니다!

0

32

2

2-I) 왜 이 문제가 그래프이론 카테고리에 있는지 잘 모르겠습니다.

0

55

2

2주차 개념#12 트리 순회

0

25

2

백준사이트가 종료된다고 합니다.

0

284

2

백준 서비스 종료

9

883

1

sk 하이닉스 코테 대비

0

367

2

3-G 최댓값 질문

0

50

1

모듈러 연산 값이 10이 아닌 경우도 있지 않나요?

0

83

2

3-I 코드 질문드립니다.

0

62

2

3-N 질문 있습니다.

0

66

2

학습방법

0

102

2

4-H 질문 있습니다 (코드 리뷰)

0

66

2

코딩테스트 어디까지 준비해야 하는지 질문이 있습니다.

0

169

2

2-O 반례가 무엇일지 어떤 부분이 틀렸는지 잘 모르겠습니다.

0

69

2

2주차 개념 #4-2. 인접행렬 질문있습니다.

0

64

2

1-A 문제풀이 후 궁금한 점이 생겨서 질문드립니다.

0

51

2

조합 재귀 풀이 확인 해주시면 감사하겠습니다.

0

68

2

함수별 시간복잡도

0

73

2

3-h 질문입니다.

0

49

1

안녕하세요 선생님. 시간 복잡도 4번 질문있습니다.

0

53

2

1-I 문제 질문 드립니다.

0

76

2

2-P 질문입니다.

0

56

1