inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

5-T

17143_낚시왕 질문

313

amenable

작성한 질문수 7

0

큰돌님 안녕하세요

17143_낚시왕 문제에 질문이 있어서 글을 적습니다.

제가 짠 코드의 기본적인 로직은 큰돌님께서 하신것처럼
1. 상어 잡기
2. 상어들 이동
으로 하고, 상어가 먹혀서 없는 것들도 고려를 하였습니다.

그런데 코드를 제출하면 계속해서 '바로' 틀렸다고 합니다.

코드에서 문제를 제가 찾고 싶지만 도저히 감을 못 잡아서 글을 올려봅니다.

혹시 어떤 부분이 잘 못 된건지 알 수 있을까요?

#include<bits/stdc++.h>
using namespace std;

int R, C, M, ret;
int r, c;
int m[104][104], a[10004][10], no_exist[10004];
// a -> r, c, s, d, z -> r, c, 속도, 방향, 사이즈 



int eatting(int idx){	
	for(int i = 0; i < R; i++){
		if(m[i][idx]){
			no_exist[m[i][idx]] = 1; // 해당 상어는 먹혀서 존재하지 않는 것! 
			return a[m[i][idx]][4]; // 해당 상어의 사이즈를 return 
		}
	}
	return 0; 
}

void sharks_move(){
	memset(m, 0, sizeof(m)); // 현재 상어 위치 초기화 // 새로운 공간에 상어를 배치할 것이라서 
	
	for(int i = 1; i <= M; i++){
		if(no_exist[i]){ // 잡아먹혀서 없는 경우 
			continue; 
		}
		
		for(int j = 0; j < a[i][2]; j++){ // 속도만큼 움직이는 것 
			if(a[i][3] == 1){ // 위로 이동 
				if(a[i][0] == 0){ // 막혀있는 경우 
					a[i][3] = 2; // 아래로 방향 전환 
					a[i][0]++; // 아래로 이동 
				}
				else{
					a[i][0]--; 
				}
			}
			else if(a[i][3] == 2){ // 밑으로 이동
				if(a[i][0] == R-1){ // 막혀있는 경우 
					a[i][3] = 1; // 위쪽으로 방향 전환 
					a[i][0]--; // 위로 이동 
				}
				else{
					a[i][0]++; 
				}
			}
			else if(a[i][3] == 3){ // 오른쪽으로 이동 
				if(a[i][1] == C - 1){
					a[i][3] = 4;
					a[i][1]--;
				}
				else{
					a[i][1]++;
				}
			}
			else if(a[i][3] == 4){ // 왼쪽으로 이동 
				if(a[i][1] == 0){
					a[i][3] = 3;
					a[i][1]++;
				}
				else{
					a[i][1]--;
				}
			}
			
		}

		// 이동을 마친 후 맵에 상어 번호 매기기 
		if(m[a[i][0]][a[i][1]]){ // 이미 상어가 있는 경우 
			if(m[a[i][0]][a[i][1]] > a[i][4]){ // 기존꺼가 더 큰 경우 
				no_exist[i] = 1; // 기존꺼에 잡아 먹힌  것 
			}
			else{
				no_exist[m[a[i][0]][a[i][1]]] = 1; // 기존꺼 잡아먹기
				m[a[i][0]][a[i][1]] = i; // 새롭게 맵 갱신 
			}
		}
		else{
			m[a[i][0]][a[i][1]] = i;
		}
	}
	return;
}

int person_go(int idx){
	int size = eatting(idx);
	
	sharks_move();
	
	return size;
}


int main(){
	cin >> R >> C >> M;
	for(int i = 1; i <= M; i++){
		cin >> r >> c >> a[i][2] >> a[i][3] >> a[i][4];
		r--; c--;
		a[i][0] = r;
		a[i][1] = c;
		
		m[r][c] = i;
	}
	
	if(M == 0){
		cout << 0;
		return 0;	
	}
	
	for(int i = 0; i < C; i++){
		ret += person_go(i);
	}
		
	cout << ret;
	
	return 0;
}

C++ 코테 준비 같이 해요!

답변 1

1

큰돌

안녕하세요. ㅎㅎ

반례입니다.

100 7 7
3 2 2 3 9
3 3 1 3 3
3 5 1 4 7
3 6 2 4 6
2 4 1 2 8
1 4 2 2 4
4 4 1 1 5

답 : 0

가보자고 님의 답 : 5

아 근데 상어의 상태를 저렇게 배열로 하면 보기 힘들지 않나요? struct 어떠신가요?

감사합니다.

1-E질문입니다!

0

533

2

3-L 틀린 부분 피드백 부탁드립니다.

0

835

2

1-A문제 순열재귀함수 질문입니다.

0

396

1

1-A 일곱난쟁이문제입니다

0

470

1

문제 풀 때 방향성에 대해

0

809

1

맥에서 vs code로 실행 관련 질문입니다

0

530

1

17071번 메모리 초과

0

390

1

1-C질문입니다!

0

428

2

2-B BFS 시간초과질문

0

638

2

1-O 13번 라인

0

447

1

6-J 놀이공원 문제 질문

0

389

1

구현관련 질문

0

491

1

강의 교안

0

322

1

실력을 더 올리고나서 강의를 보는 것이 맞을까요?

0

550

1

안녕하세요! 재귀함수에 관해서 질문드립니다

0

540

1

1-K

0

481

2

3-G번 질문있습니다.

1

480

3

3-C 실행 시간 질문드립니다.

0

503

1

4-A 문제 풀이 질문있습니다.

0

601

2

비트마스킹 연산자 "1의 보수" 영문 표기법

0

441

1

격자탐색 문제에서 BFS 시간복잡도 질문드립니다.

0

349

1

3-O go 함수 질문 드립니다.

1

453

2

4-A 출력 질문

0

308

1

1주차 1-O 질문드립니다

0

265

1