내가 생각했을때 문제에서 원하는부분
첫 줄에는 첫 번째 기어 파트를 나타내는 1과 2로 구성된 문자열이 주어진다.
두 번째 줄에는 마찬가지로 두 번째 기어 파트를 나타내는 1, 2로 구성된 문자열이 주어진다.
여기서 1은 홈을, 2는 이를 의미한다. 길이 <= 100
첫 줄에 만들 수 있는 가장 짧은 가로 너비를 출력한다.
내가 이 문제를 보고 생각해본 부분
BufferedReader를 사용하여 사용자로부터 두 개의 기어 문자열을 입력받고, trim() 메서드를 사용하여 앞뒤 공백을 제거한다.
calculateMinWidth() 메서드를 호출하여 최소 너비를 계산하고, 그 결과를 출력한다.
최소 너비 계산메서드 : calculateMinWidth() 메서드가 정의되고, 초기 최소 너비를 두 기어의 길이의 합으로 설정한다.
기어 겹침 확인과 너비 계산 :
offset을 사용하여 두 기어의 상대적인 위치를 조정한다.
offset의 범위는 아래 기어의 길이의 음수부터 위 기어의 길이까지이다.
isValid 변수를 사용하여 현재 오프셋에서 기어가 맞물리는지 여부를 확인한다.
위 기어의 각 인덱스에 대해 아래 기어의 인덱스를 계산하고, 범위를 벗어나지 않는 경우에만 맞물림 검사를 한다.
두 기어의 맞물림 상태는 각 기어의 숫자를 더하여 3을 초과하는지 확인한다.
초과하면 isValid를 false로 설정하고 루프를 종료한다.
유효한 경우 최소 너비 계산 :
isValid가 true인 경우, 현재 오프셋에 대한 너비를 계산한다.
currentWidth는 두 기어의 길이를 고려하여 계산한다.
minWidth를 현재 너비와 비교하여 최소 값을 업데이트해준다.
그리고 계산된 최소 너비를 반환한다.
사용자는 두 기어 문자열을 입력한다.
프로그램은 두 기어가 맞물릴 수 있는 모든 경우를 탐색하여 최소 너비를 계산한다.
최종적으로 계산된 최소 너비를 출력한다.
코드로 구현
package baekjoon.baekjoon_24;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
// 백준 1195번 문제
public class Main856 {
static String upperGear; // 위 기어
static String lowerGear; // 아래 기어
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
upperGear = br.readLine().trim(); // 위 기어 입력
lowerGear = br.readLine().trim(); // 아래 기어 입력
System.out.println(calculateMinWidth());
br.close();
}
// 최소 너비를 계산하는 메서드
static int calculateMinWidth() {
int minWidth = upperGear.length() + lowerGear.length(); // 초기 최소 너비 설정
// 기어의 맞물림을 확인하기 위한 오프셋 범위
for(int offset = -lowerGear.length(); offset <= upperGear.length(); offset++) {
boolean isValid = true; // 현재 오프셋에 대해 유효성 체크
// 각 기어의 맞물림 상태 확인
for(int j = 0; j < upperGear.length(); j++) {
// 겹치는 인덱스 계산
int lowerIndex = j - offset;
if(lowerIndex < 0 || lowerIndex >= lowerGear.length()) {
// 겹치지 않는 경우는 0으로 처리
continue;
}
// 기어의 맞물림 상태 검사
int sum = (lowerGear.charAt(lowerIndex) - '0') + (upperGear.charAt(j) - '0');
if(sum > 3) {
isValid = false; // 맞물리지 않는 경우
break;
}
}
// 유효한 경우 최소 너비 계산
if(isValid) {
int currentWidth = Math.max(offset + lowerGear.length(), upperGear.length()) - Math.min(offset, 0);
minWidth = Math.min(minWidth, currentWidth);
}
}
return minWidth; // 계산된 최소 너비 반환
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.