- 숫자가 3의 배수거나, 3이 들어가있으면 안됨
- n은 1~100 사이의 숫자
30분정도 걸렸고, +9점 획득 ⭐️
처음엔, 멍하니 생각만 했다.
3이 들어가면 안되고, 3의 배수도 안되고 ..
늘어나는 숫자에 규칙이 없어서, 어떻게 풀어야 하나 생각하다가,
어차피 제한사항이 n
은 100까지 밖에 주어지지 않는다.
그렇기에 3x의 숫자도 제한적일 수 밖에 없다고 생각했다.
n
은 정직하게 1 부터 100까지, 10진법 숫자(1씩 늘어나는)니까,
3x마을에서 쓸 숫자를 배열에 담아, n
을 index
로 쓰면 되지 않을까?!
하는 생각에 도달했다.
👇🏻
function solution(n) {
let noThree = 0;
const noThreeArr = [];
while (noThree <= 200) {
++noThree;
(!(String(noThree).includes('3')) && noThree % 3 !== 0)
&& noThreeArr.push(noThree);
}
return noThreeArr[n-1];
}
noThree
변수를 만들었다.noThree
를 담아줄 배열을 만들었다. (noThreeArr
)noThree
가 200이하일 동안 while
문 돌도록 조건 설정.while
문을 도는 동안 noThree
가 1씩 점진적으로 더해지게끔 noThree++
;noThree
에 3이 포함되는지 조건 설정noThree
의 type은 number
이므로 includes()
를 사용할 수 없으니, toString()
을 사용하여 문자로 바꿔주자!)noThree
가 3의 배수인지 검사해야하므로, 3으로 나눴을 시 나머지가 0인 조건 설정!
를 붙여주었다.!조건2개
가 true
일 경우 noThree
숫자를 매번 noThreeArr
배열에 push
시켜라!noThreeArr
에 3x마을에서 쓰는 200이하의 숫자들만 담긴다. n
을 noThreeArr
배열의 index
로 접근해야 하므로, -1을 해준 값을 return
해준다. (배열의 index
는 0부터 시작하기 때문이다)이렇게 풀어냈다!
그러나 문제점은, n의 숫자가 제한적이여야만 가능한 함수다 ㅜㅜ
그리고 n 숫자가 커질수록 whild 문 조건 숫자도 매번 수정해줘야 한다.
n
의 숫자가 제한적이지 않아도, 언제나 작동할 수 있는 함수!
다른 사람이 푼 것을 그대로 가져와보았다.
function solution(n) {
var answer = 0;
for(let i=1; i<=n; i++){
if(i%3 == 0){
n++;
}
if(String(i).includes("3")& i%3 != 0){
n++
}
}
return n;
}
일반 for문
을 쓰셨다.
i
는 1이고, i
가 인자n
보다 작을동안 (0이 들어올 수 없으므로 항상 작다), i
에 1씩 더해가며 for문
을 돌려라.
n
이 어떤 숫자가 들어오냐에 따라서, for문
의 횟수도 변한다.
예를 들어 n
이 6일 경우,
for문
은 총 6번 돌게되고 👇🏻
i가 1일 땐 두 조건에 노부합 n = 6
i가 2일 때에도 두 조건에 노부합 n = 6
i가 3일 땐 첫번째 조건에 부합 n = 7, 두번째 조건에 노부합 n = 7
i가 4일 땐 두 조건에 노부합 n = 7
i가 5일 땐 두 조건에 노부합 n = 7
i가 6일 땐 첫번째 조건에 부합 n = 8, 두번째 조건에 노부합 n = 8
와우.. 대단한 풀이다. 일반 for문을 가지고 이렇게 생각할 수 있다니 ㅜㅜ
나는 하나하나 대입해서 풀어보니까 이해가 가는데, 처음부터 이 생각은 못할 것 같다 ㅜㅜ