실수 모음(이게 뭐지?)
한 번 했던 실수 또 하지 말자!
~ 실수했던 특정 문제 모음 ~
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. 문제 답을 오름차순/또는 내림차순으로 정렬해서 제출하라고 했는데 정렬하지않고 제출함
-> 문제를 꼼꼼히 읽으세요~
틀렸던 방식으로 똑같이 틀리지만 말자!