코딍코딍
코딩기록
코딍코딍
전체 방문자
오늘
어제
  • 분류 전체보기 (271)
    • 개발 (2)
    • Java (1)
    • 스프링 (28)
    • JPA (11)
    • Git (3)
    • 알고리즘 (160)
      • 백준 (132)
      • 프로그래머스 (8)
      • SWEA (20)
    • 토이 프로젝트 (14)
      • 간단한 Springboot CRUD (1)
      • 게시판 프로젝트 (13)
    • 알고리즘 개념정리 (8)
    • 오류 해결 (13)
    • 보류 (0)
    • AWS (5)
    • 트러블 슈팅 (0)
    • 회고 (3)
    • CS (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

최근 글

티스토리

hELLO · Designed By 정상우.
코딍코딍

코딩기록

알고리즘/백준

17615번 : 볼 모으기

2022. 10. 2. 15:46

https://www.acmicpc.net/problem/17615

 

17615번: 볼 모으기

첫 번째 줄에는 볼의 총 개수 N이 주어진다. (1 ≤ N ≤ 500,000) 다음 줄에는 볼의 색깔을 나타내는 문자 R(빨간색 볼) 또는 B(파란색 볼)가 공백 없이 주어진다. 문자열에는 R 또는 B 중 한 종류만 주

www.acmicpc.net

 

 

문제

 

 

코드

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        String str = br.readLine();

        int blueN=0; //맨 왼쪽 또는 맨 오른쪽에 뭉쳐있지 않은 파란공의 개수
        int redN=0; //맨 왼쪽 또는 맨 오른쪽에 뭉쳐있지 않은 빨간공의 개수
        int acum=0; //누적값

        //오른쪽으로 모으기
        if(str.charAt(0) =='B') blueN=1;
        else redN=1;
        for(int i=1;i<n;i++) {
            if(str.charAt(i) =='B') {
                if(str.charAt(i-1) == 'B') acum++; //연속된 B
                else { //끊긴경우
                    redN+=acum;
                    acum=1;
                }
            }else {
                if(str.charAt(i-1) == 'R') acum++; //연속된 R
                else { //끊긴경우
                    blueN+=acum;
                    acum=1;
                }
            }
        }
        int n1; //오른쪽으로 모았을 때 최소횟수
        if(blueN<=redN) n1=blueN;
        else n1=redN;

        //왼쪽으로 모으기
        blueN = redN = acum = 0;
        if(str.charAt(n-1) =='B') blueN=1;
        else redN=1;
        for(int i=n-2;i>=0;i--) {
            if(str.charAt(i) =='B') {
                if(str.charAt(i+1) == 'B') acum++; //연속된 B
                else { //끊긴경우
                    redN+=acum;
                    acum=1;
                }
            }else {
                if(str.charAt(i+1) == 'R') acum++; //연속된 R
                else { //끊긴경우
                    blueN+=acum;
                    acum=1;
                }
            }
        }
        int n2; //왼쪽으로 모았을 때 최소횟수
        if(blueN<=redN) n2=blueN;
        else n2=redN;

        if(n1>n2) System.out.println(n2);
        else System.out.println(n1);
    }
}

 

 

해결방법

입력받은 공들 중 맨 왼쪽 또는 맨 오른쪽에 뭉쳐있지 않은 파란 공과 빨간 공 개수 중 작은 값이 최소 이동 횟수이다.

오른쪽으로만 공을 이동 가능한 것으로 문제를 잘못 이해하여 2번째 시도만에 해결하였다.

'알고리즘 > 백준' 카테고리의 다른 글

13413번 오셀로 재배치  (0) 2023.01.02
1246번 : 온라인 판매  (0) 2022.12.16
15904번 : UCPC는 무엇의 약자일까?  (0) 2022.09.19
8979번 : 올림픽  (0) 2022.09.18
2437번 : 저울  (0) 2022.09.15
    '알고리즘/백준' 카테고리의 다른 글
    • 13413번 오셀로 재배치
    • 1246번 : 온라인 판매
    • 15904번 : UCPC는 무엇의 약자일까?
    • 8979번 : 올림픽
    코딍코딍
    코딍코딍
    ㅎ2

    티스토리툴바