본문 바로가기
백준 알고리즘 자바

3085번

by leko 2023. 7. 7.

1. 행검사

열검사 할때, 배열 범위를 벗어나지않게 주의하기

if(candy[i][j]== candy[i][j+1]) {

cnt++;

}이 코드때문에

for(int j=0;j<n-1;j++)

j가 n-1전까지

 

2.

for(int i=0;i<n;i++) {

int cnt = 1; // 이거 초기화 꼭 해주기!!

for(int j=0;j<n-1;j++) { //배열 범위 벗어나지않게 주의

if(candy[i][j]== candy[i][j+1]) {

cnt++;

}

else {

cnt =1;

}

if(maxCount <cnt) {

maxCount =cnt; //cnt1값 저장

}

 

}

}

 

3. 문자열 CCP를 차례로 배열에 저장하고 싶다

     1) 일단 Stirng str = sc.next(); 입력받고

     2) str.charAt(j); 문자열의 각 인덱스에 접근하고 해당위치에 있는 문자를 반환한다

 

4. 가로방향/ 세로방향

인접한 사탕 교한한다 (tmp 사용 ) -> 최대 캔디 개수 구한다 -> 다시 복원시킨다.

 

5.

for(int i=0;i<n;i++) {

for(int j=0;j<n-1;j++) {

if(candy[j][i] != candy[j+1][i]) {  // 이렇게 쓴 이유는 [i][j]라고 쓰나 [j][i]라고 쓰나 상관없지만 배열 순서를 고려하면 [j][i]로 쓰는게 더 적절함

char tmp = candy[j][i];

candy[j][i] = candy[j+1][i];

candy[j+1][i]= tmp;

 

 

maxCandy2 = Math.max(maxCandy2, findCandy(candy, n));

tmp = candy[j][i];

candy[j][i] = candy[j+1][i];

candy[j+1][i]= tmp;

}

}

}

 

 

 

package boj;

import java.util.Scanner;

public class BOJ_3085 {
// 인접한 서로 다른 사탕 2개 고르기
// 두개 위치바꾸기
// 행검사 인접한 행이 같은 사탕일경우 최대길이
// 열검사
	
	//3
	//CCP
	//CCP
	//PPC
	public static int findCandy(char [][]candy, int n) {
		
		int maxCount = 0;			
		//행 검사
		for(int i=0;i<n;i++) {
			int cnt = 1;
			for(int j=0;j<n-1;j++) { //배열 범위 벗어나지않게 주의
				if(candy[i][j]== candy[i][j+1]) {
					cnt++;
				}
				else {
					cnt =1;
				}
				if(maxCount <cnt) {
					maxCount =cnt; //cnt1값 저장
				}
				
			}
		}
		//열 검사
		for(int i=0;i<n;i++) {
			int cnt = 1;
			for(int j=0;j<n-1;j++) {
				if(candy[j][i]== candy[j+1][i]) {
					cnt++;
				}
				else {
					cnt =1;
				}
				if(maxCount<cnt) {
					maxCount =cnt; // 순서 헷갈리면 노노
				}
				
			}
		}
		return maxCount;
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		char candy[][] = new char [n][n];
		
		for(int i=0;i<n;i++) {
			String row = sc.next();//CCP 입력받고
			for(int j=0;j<n;j++) {
				candy[i][j] = row.charAt(j); // 문자열 row의 각 인덱스에 접근하고 해당 위치에 있는 문자를 반환 // C // C // P 반환 
			}
		}
		
		int maxCandy1 = 0;
		int maxCandy2 = 0;

		// 가로 방향으로 인접한 사탕 교환하기
		for(int i=0;i<n;i++) {
			for(int j=0;j<n-1;j++) {
				if(candy[i][j] != candy[i][j+1]) {
					char tmp = candy[i][j];
					candy[i][j] = candy[i][j+1];
					candy[i][j+1]= tmp;
					
				
				
				maxCandy1 = Math.max(maxCandy1,findCandy(candy, n));
			
				tmp = candy[i][j];
				candy[i][j] = candy[i][j+1];
				candy[i][j+1]= tmp;
			}	
			}
		}
		
		// 세로 방향으로 인접한 사탕 교환하기
				for(int i=0;i<n;i++) {
					for(int j=0;j<n-1;j++) {
						if(candy[j][i] != candy[j+1][i]) {
							char tmp = candy[j][i];
							candy[j][i] = candy[j+1][i];
							candy[j+1][i]= tmp;
						
						
						maxCandy2 = Math.max(maxCandy2, findCandy(candy, n));
						tmp = candy[j][i];
						candy[j][i] = candy[j+1][i];
						candy[j+1][i]= tmp;
					}
				}
			}
		if(maxCandy1 >= maxCandy2) {
			System.out.println( maxCandy1);
		}
		else {
			System.out.println( maxCandy2);
		}

}
	}

 

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

17427번  (0) 2023.07.06
2309번  (0) 2023.07.06
1929번  (0) 2023.07.06
1978번  (0) 2023.07.06
1037번  (0) 2023.06.27