요약
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#
코딩테스트 연습 - 체육복
점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번
programmers.co.kr
오답 풀이 :
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
코딩테스트 연습 - 3진법 뒤집기
자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요. 제한사항 n은 1 이상 100,000,000 이하인 자연수
programmers.co.kr
오답 풀이 :
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#
코딩테스트 연습 - 부족한 금액 계산하기
새로 생긴 놀이기구는 인기가 매우 많아 줄이 끊이질 않습니다. 이 놀이기구의 원래 이용료는 price원 인데, 놀이기구를 N 번 째 이용한다면 원래 이용료의 N배를 받기로 하였습니다. 즉, 처음 이
programmers.co.kr
오답풀이 :
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
코딩테스트 연습 - 콜라츠 추측
1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다. 1-1. 입력된 수가 짝수라면 2
programmers.co.kr
오답 풀이 :
1. 홀수 -> 짝수 -> 홀수 -> 짝수 형태를 계속 반복하면 num이 int 형이라서 오버플로우 발생
-> 주어진 매개변수가 int형이어서 long형으로 바꿀 생각을 못했음
https://programmers.co.kr/learn/courses/30/lessons/12919
코딩테스트 연습 - 서울에서 김서방 찾기
String형 배열 seoul의 element중 "Kim"의 위치 x를 찾아, "김서방은 x에 있다"는 String을 반환하는 함수, solution을 완성하세요. seoul에 "Kim"은 오직 한 번만 나타나며 잘못된 값이 입력되는 경우는 없습니
programmers.co.kr
오답 풀이 :
n은 정수 (0<=n<=19)
1. answer += (char)(n +'0');
-> 두 자릿수 이상일 경우 fail, 고로 아스키코드를 더해서 스트링을 만드는 건 지양하자.
-> 여러 가지 함수에 오버라이딩 되어있는 to_string 함수를 애용하자
https://programmers.co.kr/learn/courses/30/lessons/12921
코딩테스트 연습 - 소수 찾기
1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요. 소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다. (1은 소수가 아닙니다.) 제한 조건 n은 2이상
programmers.co.kr
오답풀이 :
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 |