PS

실수 모음(이게 뭐지?)

왕방토 2023. 1. 4. 20:10
728x90

한 번 했던 실수 또 하지 말자!

 


~ 실수했던 특정 문제 모음 ~

 

 

1. cnt 세줄 때 idx를 cnt 기준으로 생각하지 않고 원래 자료구조 기준으로 생각함

 

문제: 프로그래머스 귤 고르기

(정답 코드)

#include <string>
#include <vector>
#include <algorithm>
#define TAN_MAX 10000000
using namespace std;

int cnt[TAN_MAX + 1];

int solution(int k, vector<int> tangerine) {
    int answer = 0;
    
    int tan_max = -1;
    for(int t:tangerine) {
        tan_max = max(tan_max, t);
        cnt[t]++;
    }

    sort(cnt+1, cnt + tan_max + 1, greater<>());
    
    //답 계산
    for(int i = 1; i<=tan_max; i++) {
        k -= cnt[i];
        answer++;
        if(k<=0) break;
        if(cnt[i] == 0) break;//뒤에도 다 0이므로 볼 필요 없음
    }
    
    return answer;
}

위의 코드를 보면 tangerine 이라는 벡터에 있는 t들은 1 이상 10,000,000이하의 값을 갖는 원소들이다

해당 원소들이 몇개 있는지 세주기 위해서 cnt 배열을 사용한건데, 이 배열을 sort해줄때나 봐줄때도 모두

tangerine의 원소 개수에 따라서!!! 해줬었다

실수했던 코드

충격적인 코드...

 

귤 고르기 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/138476

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


2. 입력으로 들어오는 string에서, key에 해당하는 부분 string이 있는지 확인하는 문제

 

실수했던 코드

#include<iostream>

using namespace std;

int code[100];
int user[100];

int main(int argc, char** argv)
{
   int M, N, K;
   scanf("%d%d%d", &M, &N, &K);
   for(int i = 0; i<M; i++) {
      scanf("%d", &code[i]);
   }
   for(int i = 0; i<N; i++) {
      scanf("%d", &user[i]);
   }
   //check
   int count = 0;
   bool found = false;
   for(int i = 0; i<N; i++) {
      if(user[i] == code[count]) {
         count++;
         if(count == M) {
            found = true;
            break;
         }
      }
      else {
         count = 0;
         if(user[i] == code[0]) count++;
      }
   }
   if(found) printf("secret");
   else printf("normal");
   return 0;
}

이렇게 푼다면,

비밀번호가 22224 이고,

입력으로 1222224 가 들어온다면

틀렸다고 함.

 

이런 코너케이스를 어떻게 알아내느냐?? 그게 능력이다!

 

다시 푼 코드(시간복잡도 때문에 이렇게 하기 싫었지만 아무리 생각해도 이 방법이 제일 안전하다)

#include<iostream>

using namespace std;

int code[100];
int user[100];

int main(int argc, char** argv)
{
	int M, N, K;
	scanf("%d%d%d", &M, &N, &K);
	for(int i = 0; i<M; i++) {
		scanf("%d", &code[i]);
	}
	for(int i = 0; i<N; i++) {
		scanf("%d", &user[i]);
	}
	//check
	bool found = false;
	for(int i = 0; i<N; i++) {
		if(user[i] == code[0]) {
			int cnt = 1;
			for(int j = 1; j<M; j++) {
				if(i+j >= N) break;
				if(user[i+j] == code[j]) cnt++;
				else break;
			}
			if(cnt == M) {
				found = true;
				break;
			}
		}
	}
	if(found) printf("secret");
	else printf("normal");
	return 0;
}

 

해당문제 링크: https://softeer.ai/practice/info.do?idx=1&eid=623&sw_prbl_sbms_sn=117770 

 

Softeer

연습문제를 담을 Set을 선택해주세요. 취소 확인

softeer.ai

 

 

 


 

그냥 자주하는 실수들 모음

 

 

1. bfs 시작전 visit true 안해주는 실수

-> 사실 엄청 치명적인건 아닌데 문제나 테케에 따라 무한루프 걸릴 수 있으므로 이런 경우에는 치명적이다
아니 그냥 생각한대로 짠게 아니니까 치명적인게 맞는거같다


2. 함수 불러놓고 () 안해줌

예를들어... fun1() 라는 함수가 있으면 func1 만 써놓음...
무슨경우지?



3. ni nj 만들어줄 때 didj[k][0], didj[k][1] 로 해야되는데 자꾸 둘다 didj[k][0] 으로 해놨다가 나중에 안돌아가면 오류 발견함

-> 특히 ctrl+D가 되는 비주얼 스튜디오에서 이런 실수를 자주 함 ni 만들어놓고 nj 도 ctrl+D로 복사해놨다가 nj만 수정...

 

 

 

4. 문제 답을 오름차순/또는 내림차순으로 정렬해서 제출하라고 했는데 정렬하지않고 제출함

-> 문제를 꼼꼼히 읽으세요~

 

 

 

틀렸던 방식으로 똑같이 틀리지만 말자!