https://school.programmers.co.kr/learn/courses/30/lessons/70129
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제
문제 설명
0과 1로 이루어진 어떤 문자열 x에 대한 이진 변환을 다음과 같이 정의합니다.
x의 모든 0을 제거합니다.
x의 길이를 c라고 하면, x를 "c를 2진법으로 표현한 문자열"로 바꿉니다.
예를 들어, x = "0111010"이라면, x에 이진 변환을 가하면 x = "0111010" -> "1111" -> "100" 이 됩니다.
0과 1로 이루어진 문자열 s가 매개변수로 주어집니다. s가 "1"이 될 때까지 계속해서 s에 이진 변환을 가했을 때, 이진 변환의 횟수와 변환 과정에서 제거된 모든 0의 개수를 각각 배열에 담아 return 하도록 solution 함수를 완성해주세요.
제한사항
s의 길이는 1 이상 150,000 이하입니다.
s에는 '1'이 최소 하나 이상 포함되어 있습니다.
입출력 예
s result
"110010101001" [3,8]
"01110" [3,3]
"1111111" [4,1]
입출력 예 설명
입출력 예 #1
"110010101001"이 "1"이 될 때까지 이진 변환을 가하는 과정은 다음과 같습니다.
회차 이진 변환 이전 제거할 0의 개수 0 제거 후 길이 이진 변환 결과
1 "110010101001" 6 6 "110"
2 "110" 1 2 "10"
3 "10" 1 1 "1"
3번의 이진 변환을 하는 동안 8개의 0을 제거했으므로, [3,8]을 return 해야 합니다.
입출력 예 #2
"01110"이 "1"이 될 때까지 이진 변환을 가하는 과정은 다음과 같습니다.
회차 이진 변환 이전 제거할 0의 개수 0 제거 후 길이 이진 변환 결과
1 "01110" 2 3 "11"
2 "11" 0 2 "10"
3 "10" 1 1 "1"
3번의 이진 변환을 하는 동안 3개의 0을 제거했으므로, [3,3]을 return 해야 합니다.
입출력 예 #3
"1111111"이 "1"이 될 때까지 이진 변환을 가하는 과정은 다음과 같습니다.
회차 이진 변환 이전 제거할 0의 개수 0 제거 후 길이 이진 변환 결과
1 "1111111" 0 7 "111"
2 "111" 0 3 "11"
3 "11" 0 2 "10"
4 "10" 1 1 "1"
문제 해결을 위한 과정
주어진 문자열 s가 "1"이 될 때까지 무한 루프를 돌며 문제에 제시된 연산을 순서대로 수행하는 시뮬레이션 방식으로 접근했습니다.
- 탈출 조건 설정: s.equals("1")을 검사하여 "1"이 되면 즉시 전체 루프를 빠져나갑니다.
- 0의 개수 누적 및 1의 개수 카운트: 문자열 s를 한 글자씩 순회하며 0을 만나면 제거된 0의 총개수(num1)를 증가시키고, 1을 만나면 변환된 문자열의 길이를 뜻할 cnt를 증가시킵니다.
- 남은 길이를 2진수로 변환: cnt 값을 2로 나눈 나머지(% 2)를 temp 문자열에 계속 더해주고 cnt를 2로 나누며( /= 2) 이진수 변환을 수행합니다.
- 이진수 문자열 뒤집기: 뒤에서부터 연산된 2진수 값(temp)을 올바른 순서로 정렬하기 위해, 역순으로 순회하며 새로운 문자열 s를 재조립합니다.
- 이 과정을 반복한 뒤 누적된 변환 횟수(num)와 제거된 0의 개수(num1)를 배열에 담아 반환합니다.
소스코드
import java.util.*;
class Solution {
public int[] solution(String s) {
int[] answer = new int[2];
int num = 0;
int num1 = 0;
while(true) {
if(s.equals("1"))
break;
num += 1;
int cnt = 0;
for(int i = 0; i < s.length(); i++) {
if(s.charAt(i) == '1')
cnt += 1;
else
num1 += 1;
}
String temp = "";
while(true) {
if(cnt == 0)
break;
temp += String.valueOf(cnt % 2);
cnt /= 2;
}
s = "";
for(int i = temp.length() - 1; i >= 0; i--) {
s += String.valueOf(temp.charAt(i));
}
}
answer[0] = num;
answer[1] = num1;
return answer;
}
}'알고리즘 > 프로그래머스' 카테고리의 다른 글
| n^2 배열 자르기(Level2 Java) (0) | 2026.07.14 |
|---|---|
| 프로그래머스 연속 부분 수열 합의 개수 (Level2 Java) (0) | 2026.07.04 |
| 프로그래머스 N개의 최소공배수 (Level2 Java) (0) | 2026.06.30 |
| 프로그래머스 멀리 뛰기 (Level2 Java) (0) | 2026.06.28 |
| 프로그래머스 숫자와 표현 (Level2 Java) (0) | 2026.06.27 |