실험실에서 산성 용액의 전파 효과를 테스트합니다. 실험대에 놓인 비커들은 산성 용액이 떨어졌을 때 특정한 패턴으로 반응하며, 각 비커에 담긴 물의 양이 다릅니다. 이번 실험에서 어떤 비커를 선택했을 때 가장 많은 양의 물이 산성으로 변하는지 알아보려 합니다.
산성 용액의 전파 패턴
산성 용액이 떨어진 비커를 중심으로 상하좌우로 전파됩니다
* 중심 비커와 상하좌우 4개의 비커가 영향을 받습니다
* 예시: 아래 배치에서 19에 떨어뜨리면 19,14,18,24,20가 산성으로 변합니다

제한사항
입력 형식
2
4 4
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
5 5
2 4 6 8 10
12 14 16 18 20
22 24 26 28 30
32 34 36 38 40
42 44 46 48 50
출력 형식
#1 56
#2 190
예시 상황 설명
다음과 같은 실험대가 주어졌을 때, 최적의 위치를 찾아 최대값을 반환하면 됩니다:
4x4 실험대의 경우:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
중앙의 6에 떨어뜨린 경우:
5x5 실험대의 경우:
2 4 6 8 10
12 14 16 18 20
22 24 26 28 30
32 34 36 38 40
42 44 46 48 50
26을 중심으로 선택한 경우:
내 코드
main
public class Faintest {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int count;
int length;
int width;
System.out.println("세로와 가로 길이를 입력하세요: ");
length = scanner.nextInt();
width = scanner.nextInt();
Beaker.amount(length,width);
}
}
beaker
public class Beaker {
public static void amount(int length, int width){
Scanner sc = new Scanner(System.in);
System.out.println(length + "X" + width + " 크기의 실험대");
int[][] beakers = new int[length][width];
for(int i = 0; i < length; i++){
for(int j = 0; j < width; j++) {
beakers[i][j] = sc.nextInt();
}
}
int[][] amounts = new int[length][width];
final int[] dx = {0, 0, 0, -1, 1};
final int[] dy = {0, -1, 1, 0, 0};
for (int i = 0; i < length; i++) {
for (int j = 0; j < width; j++) {
int sum = 0;
for (int d = 0; d < 5; d++) {
int ni = i + dx[d];
int nj = j + dy[d];
if (ni >= 0 && ni < length && nj >= 0 && nj < width) {
sum += beakers[ni][nj];
}
}
amounts[i][j] = sum;
}
}
int maximum = Integer.MIN_VALUE;
int maxi = Integer.MIN_VALUE;
int maxj = Integer.MIN_VALUE;
for (int i = 0; i < length; i++) {
for (int j = 0; j < width; j++) {
if (maximum<amounts[i][j]) {
maximum = amounts[i][j];
maxi = i;
maxj = j;
}
}
}
System.out.println("최댓값: " + maximum);
System.out.println("좌표: [" + maxi+1 + "," + maxj+1 + "]");
sc.close();
}
}
for(int i = 0; i < length; i++){
for(int j = 0; j < width; j++) {
if(j == 0){
if(i == 0){
amounts[i][j] = beakers[i][j] + beakers[i][j+1] + beakers[i+1][j];
}
else if(i == length-1){
amounts[i][j] = beakers[i-1][j] + beakers[i][j] + beakers[i][j+1];
}
else{
amounts[i][j] = beakers[i-1][j] + beakers[i][j] + beakers[i][j+1] + beakers[i+1][j];
}
}
else if(j == width-1) {
if(i == 0){
amounts[i][j] = beakers[i][j-1] + beakers[i][j] + beakers[i+1][j];
}
else if(i==length-1){
amounts[i][j] = beakers[i-1][j] + beakers[i][j-1] + beakers[i][j];
}
else{
amounts[i][j] = beakers[i-1][j] + beakers[i][j-1] + beakers[i][j] + beakers[i+1][j];
}
}
else {
if(i == 0){
amounts[i][j] = beakers[i][j-1] +beakers[i][j] + beakers[i][j+1] + beakers[i+1][j];
}
else if(i == length-1){
amounts[i][j] = beakers[i-1][j] + beakers[i][j-1] + beakers[i][j] + beakers[i][j+1];
}
else{
amounts[i][j] = beakers[i-1][j] + beakers[i][j-1] + beakers[i][j] + beakers[i][j+1] + beakers[i+1][j];
}
}
}
}
기존에 사용한 코드. 가독성이 떨어져서 변경
Key와 Value로 이루어진 데이터를 정리하는 방식Value는 또 다른 Key/Value가 될 수 있다Java) 플랫폼을 위한 오픈 소스 애플리케이션 프레임워크. Spring)이라고 부름RESTful API/넣지않기_대신 -사용 +대문자 사용하지않기Annotation@OverrideAnnotation기반으로 동작하며, 주로 컴파일 시점에 소스 코드를 변환하여 필요한 메서드를 자동으로 생성보일러 플레이트 코드(Boilerplate code)란?
->getter/setter메서드, 생성자, toString 메서드 등과 같이 반복적으로 작성되는 코드
@Getter, @Setter@ToString@NoArgsConstructor@AllArgsConstructor@RequiredArgsConstructor@Slf4jLogger 객체를 자동생성의존성(Dependency)은 우리 프로젝트가 제대로 동작하기 위해 필요한 외부 라이브러리나 외부 코드를 의미Gradle을 주로 사용build.gradle이라는 파일을 사용하며, 그루비(Groovy)나 코틀린(Kotlin)이라는 프로그래밍 언어를 사용해 작성Maven이 Gradle보다 먼저 만들어졌기 때문에 Gradle Repository가 아니라 Maven Repository라고 부름jakarta.servlet.http.HttpServlet 클래스를 상속받아 구현@ServletComponentScanServlet이 혼자 모든 것을 처리하던 문제를 해결하기 위해 애플리케이션의 코드를 세 가지 역할로 명확하게 나누는 설계 방식@Controller가 붙은 클래스가 이 역할을 수행서버에서 완성된 HTML을 통째로 주는 것클라이언트에서 자바스크립트로 그 때 그 때 HTML을 그려내는 것