[프로그래머스] 77886 - 110 옮기기 (Java)

2025. 3. 27. 11:27·Algorithm

문제 파악

https://school.programmers.co.kr/learn/courses/30/lessons/77886

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

풀이

크게 두 가지 구현이 필요하다

  1. 주어진 문자열에서 110을 모두 제거
  2. 규칙에 따라 110들을 사전순으로 이른 위치에 삽입

1. 주어진 문자열에서 110을 모두 제거

StringBuffer를 활용하여 주어진 문자열을 순환하며 가장 끝자리가 110이라면 삭제하고,
그렇지 않으면 계속 버퍼에 쌓아주자

2. 규칙에 따라 110들을 사전순으로 이른 위치에 삽입

규칙을 찾기 위해 세 자리까지만 나열해 보도록 하자..

한 자리 수 두 자리 수 세 자리 수
0 ➡️ 0[110]
1 ➡️ [110]1
00 ➡️ 00[110]
10 ➡️ 10[110]
01 ➡️ 0[110]1
11 ➡️ [110]11
000 ➡️ 000[110]
100 ➡️ 100[110]
010 ➡️ 010[110]
001 ➡️ 00[110]1
101 ➡️ 10[110]1
011 ➡️ 0[110]11
111 ➡️ [110]111
110 ➡️ 110[110] 이미 모두 제거된 상태

위 규칙을 살펴보면 다음 규칙을 확인할 수 있다.

  • 가장 마지막 0의 오른쪽에 110을 삽입
  • 남은 문자열에 0이 없다면 가장 앞에 삽입

이 두 과정을 구현하면 아래와 같다.

코드

public class Main {
    public String[] solution(String[] s) {
        String[] answer = new String[s.length];
        for (int i = 0; i < answer.length; i++) {
            answer[i] = replacedResult(s[i]);
        }
        return answer;
    }

    private String replacedResult(String s) {
        String bf = s;
        s = remove110(s);
        String com = "110".repeat((bf.length() - s.length()) / 3);
        if (s.length() == 0) {
            return com;
        }
        int fZero = s.lastIndexOf("0");
        int insertPos = fZero == -1 ? 0 : fZero + 1;
        return s.substring(0, insertPos) + com + s.substring(insertPos);
    }

    public static String remove110(String s) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            sb.append(s.charAt(i));
            if (sb.length() >= 3 &&
                    sb.charAt(sb.length() - 3) == '1' &&
                    sb.charAt(sb.length() - 2) == '1' &&
                    sb.charAt(sb.length() - 1) == '0') {
                sb.delete(sb.length() - 3, sb.length());
            }
        }
        return sb.toString();
    }
}

 

저작자표시 비영리 변경금지 (새창열림)

'Algorithm' 카테고리의 다른 글

[백준] 1074 - Z(Java)  (0) 2025.04.04
[백준] 1101 - 카드 정리 1(Java)  (0) 2025.04.01
[백준] 17070 - 파이프 옮기기 1(Java)  (0) 2025.03.25
[백준] 1679 - 숫자놀이(Java)  (0) 2025.03.21
[프로그래머스] 388353 - 지게차와 크레인(Java)  (0) 2025.03.19
'Algorithm' 카테고리의 다른 글
  • [백준] 1074 - Z(Java)
  • [백준] 1101 - 카드 정리 1(Java)
  • [백준] 17070 - 파이프 옮기기 1(Java)
  • [백준] 1679 - 숫자놀이(Java)
코드파고
코드파고
  • 코드파고
    Digging Code
    코드파고
  • 전체
    오늘
    어제
    • 분류 전체보기 (99)
      • Memorization (12)
      • Spring (18)
      • Java (1)
      • Algorithm (40)
      • Server (2)
      • DB (0)
      • CS (0)
      • CI & CD (4)
      • Architecture (0)
      • Design Patterns (0)
      • Study (1)
      • Book (9)
        • DEV (7)
        • Non-DEV (0)
      • Infra (1)
        • Kafka (6)
        • AWS (4)
      • TroubleShooting (1)
        • Etc (1)
      • Tools (0)
  • 블로그 메뉴

    • 홈
    • Github
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    SpringFramework
    Spring독학
    Clean Code
    클린아키텍쳐
    Spring Boot
    clean architecture
    Spring
    architecture
    헥사고날아키텍쳐
    알고리즘
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
코드파고
[프로그래머스] 77886 - 110 옮기기 (Java)
상단으로

티스토리툴바