📑 1. 문제설명


💡 2. 풀이과정
우리가 구하려는 것은 3x 마을에서 3의 배수도 아니고 숫자에 3도 안 들어간 숫자들을 n번째까지 골라서, 그 n번째 숫자가 뭐냐?를 알고 싶은 것이다.
- 3, 6, 9 등 3의 배수 제외
- 13, 23 등 3의 배수는 아니더라도 숫자 자체에 3이 들어간 것은 제외
num: 1 → 통과 → cnt: 1
num: 2 → 통과 → cnt: 2
num: 3 → 실패 (3의 배수)
num: 4 → 통과 → cnt: 3
num: 5 → 통과 → cnt: 4
num: 6 → 실패 (3의 배수)
num: 7 → 통과 → cnt: 5 → 멈춤
▶ 이때 최종 num == 7, cnt == 5
검사할 숫자 변수 num을 선언하고, 이를 1씩 계속 증가시키면서 조건 검사를 수행한다.
만약 현재 숫자가 3의 배수가 아니고, 숫자에 '3'이 포함되어 있지 않다면, cnt++를 수행한다.
여기서 cnt는 조건을 통과한 3x 마을 숫자의 개수이다. 지금까지 몇 개의 유효한 숫자를 골랐는지를 나타낸다.
반면 num은 모든 숫자를 하나씩 검사하는 변수이므로,
3의 배수이거나 숫자에 '3'이 들어간 경우에도 계속 1씩 증가하기 대문에
num은 항상 cnt보다 크거나 같고 최종적으로는 n보다 더 커질 수 있다.
이렇게 cnt가 n과 같아 지면 그 때의 num을 반환하는 것이 정답이다.
만약 while문 조건을 `cnt <= n`으로 하면, n+1번째까지 검사하게 되어 오답이 나올 수 있다.
`while (cnt < n)` 조건은, 정확히 n개를 골라야 반복을 멈추기 위해 사용된다.
결과적으로, 반복문이 종료되는 시점은 cnt == n일 때이며,
이때의 num 값이 우리가 찾는 n번째 3x 마을 숫자가 된다. 따라서 최종적으로 num을 반환한다.
👨💻 3. 정답코드
class Solution {
public int solution(int n) {
int cnt = 0; // 지금까지 골라낸 3x 마을 숫자의 개수
int num = 0; // 검사할 숫자 (1부터 계속 증가)
while(cnt < n) {
num++; // 숫자를 하나씩 늘려가
if(num%3 != 0 && !String.valueOf(num).contains("3")) {
cnt++; // 이 숫자가 3의 배수도 아니고 3도 안들어가면 카운트
}
}
return num; // n번째로 골라진 3x 마을 숫자!
}
}
👏🏻 4. 좋아요 가장 많이 받은 코드
반대로 정답을 0으로 설정하고 하나씩 증가하면서 3의 배수이거나 3이 포함된 글자를 제외하고 답을 리턴할 수도 있다.
class Solution {
public int solution(int n) {
int answer = 0;
for (int i = 1; i <= n; i++) {
answer++;
if (answer % 3 == 0 || String.valueOf(answer).contains("3")) {
i--;
}
}
return answer;
}
}
'코딩테스트 > JAVA테스트' 카테고리의 다른 글
[프로그래머스] (Java) 겹치는 선분의 길이 (2) | 2025.06.12 |
---|---|
[프로그래머스] (Java) 평행 (5) | 2025.06.11 |
[프로그래머스] (Java) 외계어사전 (2) | 2025.06.06 |
[프로그래머스] (Java) 삼각형의 완성조건 (2) (2) | 2025.06.03 |
[프로그래머스] (Java) 숨어있는 숫자의 덧셈 (2) (7) | 2025.06.02 |
📑 1. 문제설명


💡 2. 풀이과정
우리가 구하려는 것은 3x 마을에서 3의 배수도 아니고 숫자에 3도 안 들어간 숫자들을 n번째까지 골라서, 그 n번째 숫자가 뭐냐?를 알고 싶은 것이다.
- 3, 6, 9 등 3의 배수 제외
- 13, 23 등 3의 배수는 아니더라도 숫자 자체에 3이 들어간 것은 제외
num: 1 → 통과 → cnt: 1 num: 2 → 통과 → cnt: 2 num: 3 → 실패 (3의 배수) num: 4 → 통과 → cnt: 3 num: 5 → 통과 → cnt: 4 num: 6 → 실패 (3의 배수) num: 7 → 통과 → cnt: 5 → 멈춤 ▶ 이때 최종 num == 7, cnt == 5
검사할 숫자 변수 num을 선언하고, 이를 1씩 계속 증가시키면서 조건 검사를 수행한다.
만약 현재 숫자가 3의 배수가 아니고, 숫자에 '3'이 포함되어 있지 않다면, cnt++를 수행한다.
여기서 cnt는 조건을 통과한 3x 마을 숫자의 개수이다. 지금까지 몇 개의 유효한 숫자를 골랐는지를 나타낸다.
반면 num은 모든 숫자를 하나씩 검사하는 변수이므로,
3의 배수이거나 숫자에 '3'이 들어간 경우에도 계속 1씩 증가하기 대문에
num은 항상 cnt보다 크거나 같고 최종적으로는 n보다 더 커질 수 있다.
이렇게 cnt가 n과 같아 지면 그 때의 num을 반환하는 것이 정답이다.
만약 while문 조건을 cnt <= n
으로 하면, n+1번째까지 검사하게 되어 오답이 나올 수 있다. while (cnt < n)
조건은, 정확히 n개를 골라야 반복을 멈추기 위해 사용된다.
결과적으로, 반복문이 종료되는 시점은 cnt == n일 때이며,
이때의 num 값이 우리가 찾는 n번째 3x 마을 숫자가 된다. 따라서 최종적으로 num을 반환한다.
👨💻 3. 정답코드
class Solution { public int solution(int n) { int cnt = 0; // 지금까지 골라낸 3x 마을 숫자의 개수 int num = 0; // 검사할 숫자 (1부터 계속 증가) while(cnt < n) { num++; // 숫자를 하나씩 늘려가 if(num%3 != 0 && !String.valueOf(num).contains("3")) { cnt++; // 이 숫자가 3의 배수도 아니고 3도 안들어가면 카운트 } } return num; // n번째로 골라진 3x 마을 숫자! } }
👏🏻 4. 좋아요 가장 많이 받은 코드
반대로 정답을 0으로 설정하고 하나씩 증가하면서 3의 배수이거나 3이 포함된 글자를 제외하고 답을 리턴할 수도 있다.
class Solution { public int solution(int n) { int answer = 0; for (int i = 1; i <= n; i++) { answer++; if (answer % 3 == 0 || String.valueOf(answer).contains("3")) { i--; } } return answer; } }
'코딩테스트 > JAVA테스트' 카테고리의 다른 글
[프로그래머스] (Java) 겹치는 선분의 길이 (2) | 2025.06.12 |
---|---|
[프로그래머스] (Java) 평행 (5) | 2025.06.11 |
[프로그래머스] (Java) 외계어사전 (2) | 2025.06.06 |
[프로그래머스] (Java) 삼각형의 완성조건 (2) (2) | 2025.06.03 |
[프로그래머스] (Java) 숨어있는 숫자의 덧셈 (2) (7) | 2025.06.02 |