요약
1. 문자열 선언할 때 오타
ex) string arr[10] = {"zer","one", "two", "thr", "fou", "fiv", "six", "sen", "eig", "nin"};
2. string 띄어쓰기 단위로 분류
https://chbuljumeok1997.tistory.com/42
3. 시간복잡도, 공간복잡도 계산
4. 전체적인 구성 생각 후 코딩
5. 중간 중간 생각대로 코딩됐는지 cout 등으로 찍어보기
6. 중간 계산값이 int형 범위를 넘는 경우
7. 문자열 변환 실수
ex)
int n = 12;
(char)(n +'0')
8. 테스트 케이스 추가하기
ex) 답이 없을 경우, 최솟값, 최댓값, 전부 같은 경우, 전부 다른 경우, 전부 답인 경우, 전부 답이 아닌 경우
첫 제출에 백점이 아닌 문제들
https://programmers.co.kr/learn/courses/30/lessons/42862#
오답 풀이 :
1. 귀찮아서 문제의 전체적인 풀이를 먼저 생각하지 않고 부분적인 구성을 먼저 생각했음.
-> 오히려 더 복잡한 코드를 작성하게 됨
-> 최적의 자료구조를 사용해서 알고리즘을 간결하게 만들자.
2. 중간중간에 cout이나 테스트 케이스를 안 돌리고 코드를 전부 다 작성하고 실행함.
-> 주석 처리하며 번거롭게 디버깅 에러를 찾음.
-> 중간중간 코드 실행하며 잘 동작하는지 cout으로 찍자.
3. 위의 문제로 인해서 직관적이지 않은 복잡한 코드를 작성
<오답>
int solution(~) {
lost와 reserve 정렬
중복제거
다시 정렬
vector<int> v(n, 1);
벡터v에 lost와 reserve 매핑
범위를 신경써가면서 복잡한 구조로 구성
for(;;) {
if(i-1 >= 0) {
if(v[i-1]==2)
continue;
else
answer++;
} else if(i+1 < n) {
if(v[i+1]==2) {
v[i+1]--;
continue;
} else
answer++;
} else
answer++;
}
return n - answer;
<정답>
#include <string>
#include <vector>
using namespace std;
int solution(int n, vector<int> lost, vector<int> reserve) {
int answer = 0;
vector<int> v(n+2, 1);
v[0]=0;
v[n+1]=0;
for(int i=0; i< lost.size(); ++i) {
v[lost[i]] = 0;
}
for(int i=0; i< reserve.size(); ++i) {
v[reserve[i]]++;
}
for(int i=1; i<=n; ++i) {
if(v[i]==0) {
if(v[i-1]==2)
continue;
else if(v[i+1]==2) {
v[i+1]--;
continue;
}else
answer++;
}
}
return n-answer;
}
https://programmers.co.kr/learn/courses/30/lessons/68935
오답 풀이 :
1. 귀찮아서 공간복잡도 계산을 안 했음. 3의 10 제곱이 대충 100,000,000(10^8)을 넘을 것이라고 생각함.
-> 결국 배열 참조해야 하는 수를 넘어서 코어 덤프;
-> 계산기를 애용합시다.
<오답>
20 -> 10
19 -> 9
<정답>
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int solution(int n) {
int answer = 0;
vector<int> a(20, 0), b(20, 0);
for(int i=0;n!=0;++i) {
a[i] = n%3;
n/=3;
}
for(int i=0; i<20; ++i)
b[i] = a[19-i];
int i;
for(i=0; i<20; ++i)
if(a[19-i]!=0)
break;
for(int cnt=1;i<20;++i,cnt*=3)
answer += a[19-i]*cnt;
return answer;
}
https://programmers.co.kr/learn/courses/30/lessons/82612#
오답풀이 :
1. 귀찮아서 중간 계산 값이 가장 클경우를 생각 안 했음.
-> 계산의 중간값이 int형 범위를 넘어서 long long으로 선언해야 된다.
-> 중간 계산중 price 2500, count, 2500일 때 2500*2500*1250 = 7,812,500,000으로 int형 범위를 초과함
-> int : –2,147,483,648 ~ 2,147,483,647
-> long long : –9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
https://programmers.co.kr/learn/courses/30/lessons/12943
오답 풀이 :
1. 홀수 -> 짝수 -> 홀수 -> 짝수 형태를 계속 반복하면 num이 int 형이라서 오버플로우 발생
-> 주어진 매개변수가 int형이어서 long형으로 바꿀 생각을 못했음
https://programmers.co.kr/learn/courses/30/lessons/12919
오답 풀이 :
n은 정수 (0<=n<=19)
1. answer += (char)(n +'0');
-> 두 자릿수 이상일 경우 fail, 고로 아스키코드를 더해서 스트링을 만드는 건 지양하자.
-> 여러 가지 함수에 오버라이딩 되어있는 to_string 함수를 애용하자
https://programmers.co.kr/learn/courses/30/lessons/12921
오답풀이 :
1. 시간 복잡도 계산을 안 했음
-> 시간복잡도가 10^12라서 1000초 정도 걸리게 됨.
-> 시간복잡도 계산을 합시다
-> 메모이제이션으로 시간 줄임.
'Algorithm > Basic' 카테고리의 다른 글
알고리즘 메모장[자바] (0) | 2024.09.03 |
---|---|
다이나믹 프로그래밍[Dynamic Programming] 문제풀이-2 (10문제) (0) | 2022.04.17 |
알고리즘 문제풀이 메모장 (3) | 2021.10.10 |
트리(Tree) (0) | 2021.02.14 |
그래프(Graph) (0) | 2021.02.05 |