본문 바로가기

알고리즘/일반

백준 10610번: 30 (JAVA) <문자열 슬라이싱(substring)>

728x90

 

문제 해석

 

숫자 N이 주어지고 N을 각 자리수로 분해하여 ( 120이면 1, 2, 0) 자유롭게 조합 후

마르코가 만들고 싶어하는 수가 존재한다면 출력, 존재하지 않응면 -1 출력

마르코가 만들고 싶어하는 수는 30의 배수가 되는 가장 큰 수이다.

 

알고리즘

 

30의 배수가 되기 위해서는 두 가지 조건을 만족해야 한다.

1. 각 자리 수를 모두 합하였을 때 3의 배수여야 한다.

2. 1의 자리 수가 0이여야 한다.

 

숫자 N을 각 자리수로 분해해야 하기 때문에 N을 문자열로 받고 분해 후 정수형으로 배열에 저장하는 방법이 좋을 것 같았다. 이후 배열을 정렬하고 첫번째 인덱스에 0이 들어있으면 2번째 조건을 만족한다 여기고 1번째 조건도 만족할 시 내림차순으로 출력한다.

마르코는 30의 배수가 되는 수들 중 가장 큰 값을 원하고 1번째 조건으로 보아 1번째 조건을 만족하는 상태에서는 내림차순으로 출력하는 것이 최댓값을 출력하게 한다는 것을 알 수 있다.

ex) 120, 210 모두 30의 배수이다. 0을 1의 자리에 무조건 놓아야하는 상태에서 각 자리수의 합이 3의 배수이면 1의 자리를 제외한 나머지를 어떻게 조합하든 30의 배수가 나온다.

따라서 값을 비교할 필요없이 내림차순으로 정렬한 것을 출력하면 마르코가 만들고 싶어하는 수가 된다.

 

코드

 

문자열로 입력을 받아 저장하고 슬라이싱 후 담을 배열을 만든다.

parseInt와 substring을 이용하여 각 자리수로 나누어 배열에 저장한다.

배열을 오름차순으로 정렬한다.

각 자리수의 합이 3의 배수이고 첫번째 인덱스에 0이 들어있다면

내림차순으로 배열을 출력하고

아닌 경우는 -1을 출력한다.

 

substring

 

자바에서 제공하는 문자열 슬라이싱 함수로

인자를 하나만 넣을시 해당 위치부터 마지막 위치까지의 문자열이 출력되고

인자를 두개 넣으면 구간을 지정할 수 있다.

728x90

'알고리즘 > 일반' 카테고리의 다른 글

백준 11652: 카드 (JAVA)  (0) 2023.03.30
백준 1049번: 기타줄 (JAVA)  (0) 2023.03.29
백준 2217번: 로프 (JAVA)  (0) 2023.03.28
백준 1026번: 보물 (JAVA)  (0) 2023.03.28
백준 1158: 요세푸스 문제 (JAVA) <Queue 활용>  (0) 2023.03.28