문제
https://school.programmers.co.kr/learn/courses/30/lessons/120871
처음 쓴 코드
처음에는 백, 십, 일의 자리를 구분해서 3과 비교해야 한다는 생각에 아래와 같이 코드를 작성하였다.
using namespace std;
int solution(int n) {
int answer = 0;
int count=0;
int hundred=0; // 현재 숫자의 백의자리, n이 100까지 이므로 결과인 answer는 100을 넘어감
int ten=0; //현재 숫자의 십의자리
int one=0; //현재 숫자의 일의자리
while(count < n) {
answer++;
hundred = answer/100;
ten = (answer-hundred*100)/10;
one = answer-(hundred*100+ten*10);
if(answer%3==0) {continue;}
else if(one==3) {continue;}
else if(ten==3) {continue;}
else if(hundred==3) {continue;}
else {count++;}
}
return answer;
}
수정한 코드
제출 후 다른 사람들의 코드를 보니 굳이 백, 십, 일의 자리를 각각 변수에 할당하기 보다 반복문에서 구하면서 true, false만 return한 점이 더 좋다고 느꼈고, 수정한 코드에 적용해 보았다.
십, 일의 자리를 구할 때 굳이 answer에서 ten, one을 100, 10과 곱한 값을 빼낸 것보다, 그냥 anser에 100, 10을 나눈 나머지 값에서 다시 10으로 나머지 연산을 해 그 값이 3인지 구하는게 더 가독성이 높다고 생각했기 때문에 이 부분도 고려해 수정하였다.
프로그래머스에서 처음 에디터를 열면 solution 함수의 틀이 제공되기 때문에 새로운 함수를 만들어볼 생각도 안해봤는데 다른 분들의 코드를 보면서 '당연한 것을... 안하고 있었네' 하는 생각이 들었다.
using namespace std;
bool isContain3(int n) {
while(n >0) {
if((n % 10) == 3) return true;
n =n/10;
}
return false;
}
int solution(int n) {
int answer = 0;
int vcount = 0;
while(vcount<n) {
answer++;
if(isContain3(answer)||(answer % 3 == 0)) {continue;}
else vcount++;
}
return answer;
}