본문 바로가기

algorithm/middle

프로그래머스 레벨 1 ALL SOLVED, 오답정리


요약


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초 정도 걸리게 됨.
-> 시간복잡도 계산을 합시다
-> 메모이제이션으로 시간 줄임.