
내가 생각했을때 문제에서 원하는부분
모든 자리의 숫자가 다른 정수 N이 주어진다.
각 자리의 숫자는 1이상이고, 1 ≤ N ≤ 987654321이다.
N의 회전 결과들을 모두 더한 값을 출력한다.
단, 결과값을 32비트 정수형으로 처리할 수 없을 수 있음에 유의하라.
내가 이 문제를 보고 생각해본 부분
변수 선언 및 초기화:
String initialNStr = br.readLine();: 사용자로부터 입력받은 N을 문자열 형태로 initialNStr 변수에 저장한다.
숫자로 직접 연산하는 대신 문자열로 다루는 것이 숫자의 자릿수를 바꾸는 '회전' 작업에 더 편리한다.
String currentNStr = initialNStr;: 현재 처리 중인 회전된 숫자를 문자열 형태로 저장할 변수이다.
초기에는 initialNStr와 동일한 값을 가진다.
이 변수는 루프를 돌면서 계속 새로운 회전 값으로 변경된다.
long totalSum = 0;: 회전된 모든 숫자들의 합계를 저장할 변수이다.
문제에서 합계가 int의 범위를 초과할 수 있다고 했으므로, 안정적으로 long 타입을 사용한다.
do-while 루프를 사용한 회전 및 합계 계산:
do-while 루프: 이 루프는 do 블록 안의 코드를 최소한 한 번은 실행하고, 그 후에 while 조건식을 확인한다.
이 문제에서는 N 자체도 합계에 포함되어야 하고, 한 번의 회전 과정이 반드시 필요하므로 do-while이 적절하다.
totalSum += Long.parseLong(currentNStr);: currentNStr에 저장된 문자열 형태의 숫자를 Long.parseLong() 메서드를 이용해 long 타입의 숫자로 변환한 다음, totalSum에 더한다.
char lastChar = currentNStr.charAt(currentNStr.length() - 1);: currentNStr 문자열의 가장 마지막 문자(숫자)를 추출한다.
예를 들어, currentNStr가 "12345"라면 lastChar는 '5'가 된다.
String remainingChars = currentNStr.substring(0, currentNStr.length() - 1);: currentNStr 문자열의 시작(0 인덱스)부터 마지막 문자 바로 앞까지(length() - 1 인덱스 제외)의 부분 문자열을 추출한다.
예를 들어, "12345"에서 remainingChars는 "1234"가 된다.
currentNStr = lastChar + remainingChars;: 추출한 lastChar와 remainingChars를 합쳐서 새로운 회전된 문자열을 만든다.
char와 String을 + 연산자로 연결하면 String으로 자동 변환된다.
"5" + "1234"는 "51234"가 됩니다. 이렇게 currentNStr가 다음 회전된 숫자로 변경된다.
while (!currentNStr.equals(initialNStr));: 이 조건식은 현재 회전된 숫자(currentNStr)가 처음에 입력받은 숫자(initialNStr)와 같아지지 않는 동안 루프를 계속 반복하라는 의미이다.
equals()는 문자열의 내용을 비교하는 메서드이고, 앞에 !가 붙어 있으므로 "같지 않으면" 참(true)이 된다.
currentNStr가 initialNStr와 같아지면 루프가 종료된다.
결과 출력 및 자원 해제:
모든 회전 과정이 끝나고 최종적으로 계산된 totalSum을 콘솔에 출력한다.
br.close(): BufferedReader는 시스템 자원을 사용하므로, 사용이 완료되면 반드시 close() 메서드를 호출하여 자원을 반환해주는 것이 좋다.
코드로 구현
package baekjoon.baekjoon_31;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
// 백준 23813번 문제
public class Main1205 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// N을 문자열로 읽어들여 숫자를 쉽게 조작할 수 있도록 합니다.
String initialNStr = br.readLine();
String currentNStr = initialNStr; // 현재 회전된 숫자를 문자열로 저장합니다.
long totalSum = 0; // 회전된 숫자들의 합을 저장할 변수입니다. int 범위를 넘을 수 있으므로 long을 사용합니다.
// do-while 루프를 사용하여 회전 작업을 수행합니다.
// 첫 번째 숫자는 반드시 더해야 하므로 do 블록에서 먼저 처리하고,
// 마지막에 원래 숫자로 돌아왔는지 확인합니다.
do {
// 현재 문자열 숫자를 long으로 변환하여 totalSum에 더합니다.
totalSum += Long.parseLong(currentNStr);
// 현재 문자열의 마지막 문자를 가져옵니다.
char lastChar = currentNStr.charAt(currentNStr.length() - 1);
// 현재 문자열의 처음부터 마지막 문자 직전까지를 가져옵니다.
String remainingChars = currentNStr.substring(0, currentNStr.length() - 1);
// 마지막 문자를 맨 앞에 붙여 새로운 회전된 문자열을 만듭니다.
currentNStr = lastChar + remainingChars;
} while (!currentNStr.equals(initialNStr)); // 현재 숫자가 처음 N과 같아지면 루프를 종료합니다.
// 최종 합계를 출력합니다.
System.out.println(totalSum);
br.close();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.