2023. 10. 7. 19:17, 알고리즘/프로그래머스
https://school.programmers.co.kr/learn/courses/30/lessons/120871
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int a[105];
bool not3(int n){
int tmp=0;
while(n>0){
tmp=n%10;
if(tmp!=0 && tmp==3) return false;
n/=10;
}
return true;
}
//3이 들어간 숫자도 사용하지 않는다. 3의 배수가 들어간 숫자를 사용하지 않는게 아니다. 주의
int solution(int n) {
int answer = 0;
int t=0;
for(int i=1; i<=105; i++){
t++;
while(t%3==0 || !not3(t)) t++;
a[i]=t;
}
return a[n];
}
3의 배수일때, 혹은 숫자 3이 들어간 수일때 a[i]에 대입할 수를 while 문을 통해 그러한 조건을 넘어설때까지 t++를 해주면서 증가시키고, 그 조건을 만족하지 않게 된 수를 a[i]에 대입하는 형태로 코드를 작성하였다. 이때에 초반에 각각의 수들이 3의 배수인 경우까지 제거해주는 형태로 코드를 작성했다가( 이 경우 not3함수에서 if(tmp!=0 && tmp%3==0) 으로 작성했었다. ) 제출해보니 잘못되어서, 예시안을 보다보니 숫자 16을 사용하는 것을 보고, 3의 배수 숫자들을 모두 막는것이 아니라 3의 배수 혹은 숫자 3이 들어간 수 라는형태로 수정하여서 통과할 수 있었다.
전반적으로 다른 사람의 풀이를 보니 내가 작성한 형태처럼 만든 코드들이 많았는데, 가장 좋아요를 많이 받은 코드를 첨부해보면, 어떻게든 이런 식으로라도 돌아갈 수 있는 프로그램을 작성하는것이 우선이라는 생각이 드는 풀이를 첨부해본다.
#include <string>
#include <vector>
using namespace std;
int solution(int n) {
int answer[] = {0,1,2,4,5,7,8,10,11,14,16,17,19,20,22,25,26,28,29,40,41,44,46,47,49,50,52,55,56,58,59,61,62,64,65,67,68,70,71,74,76,77,79,80,82,85,86,88,89,91,92,94,95,97,98,100,101,104,106,107,109,110,112,115,116,118,119,121,122,124,125,127,128,140,142,145,146,148,149,151,152,154,155,157,158,160,161,164,166,167,169,170,172,175,176,178,179,181,182,184,185};
return answer[n];
}
이 풀이의 경우 좋아요가 33개를 받을정도로 사람들의 큰 지지를 받는 풀이였는데, 결국 원하는 바를 얻어낼 수 있는 프로그램을 작성해서 제출하였으니 만약 정해진 시간 안에 해결해낼 수 있는 더욱 더 효율적인 코드를 생각해내지 못한다면 이렇게라도 프로그램을 작성해서 돌아가게 만드는것이 좋을것 같다는 생각이 든다.
멋진 프로그램이다.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
| Lv 0. 겹치는 선분의 길이. *다시 풀어보기* (0) | 2023.10.08 |
|---|---|
| Lv 0. 평행 (0) | 2023.10.08 |
| Lv 0. 외계어 사전 - string 속에서 string을 찾으려면 find() 함수를, 못찾으면 string::npos를 떠올리자. *다시 풀어보기* (0) | 2023.10.06 |
| Lv 0. 삼각형의 완성조건 (2) (0) | 2023.10.06 |
| Lv 0. 안전지대 (0) | 2023.10.06 |
Comments, Trackbacks
