문제 이해
N x N의 문자 배열에서 임의의 한 점을 인점한 배열의 요소와 교환한 후 연속된 문자의 최대값을 출력하면 된다.(애니팡과 유사)
문제 해결
순서
교환 --> 최대 연속 찾기 이것을 반복하면 된다.
우선 인접한 요소와 교환을 해야 하므로 swap 함수를 만들어 준다.
<Swap 함수>
public static void swap(int x,int y, int a , int b){
char tmp=arr[x][y];
arr[x][y]=arr[a][b];
arr[a][b]=tmp;
}
교환을 했을때의 최대 연속을 찾아주는 search 함수를 만들어준다.
<Search 함수>
public static void search(){
//행마다 비교
for(int i=0; i<N; i++){
int count =1;
//옆이랑 비교
for(int j=0; j<N-1; j++){
if(arr[i][j]==arr[i][j+1]){
count++;
max=Math.max(count,max);
}
else{
count=1;
}
}
}
//열마다 비교
for(int i=0; i<N; i++){
int count=1;
for(int j=0; j<N-1; j++){
if(arr[j][i]==arr[j+1][i]){
count++;
max=Math.max(count,max);
}
else{
count=1;
}
}
}
}
* 열을 기준으로 비교할때는 선택된 점의 오른쪽 요소와 비교를 한다.
O--> | ---> | --> |
* 행을 기준으로 비교할때는 선택된 점의 아래 요소와 비교를 한다.
O | ||
| | ||
| |
메인함수에서 swap함수와 search함수를 이용해서 나올수 있는 모든 경우의 수를 비교한다.
//행을 기준으로 오른쪽과 비교
for(int i=0; i<N; i++){
for(int j=0; j<N-1; j++){
swap(i,j,i,j+1);
search();
swap(i,j+1,i,j);
}
}
//열 기준으로 아래와 비교
for(int i=0; i<N-1; i++){
for(int j=0; j<N; j++){
swap(i,j,i+1,j);
search();
swap(i+1,j,i,j);
}
}
행을 기준으로 할때는 swap을 오른쪽 요소와 한 경우이고, 열을 기준으로 할때는 아래 요소와 한 경우이다.
<전체 코드>
import java.util.Scanner;
public class Problem3085 {
static char[][] arr;
static int N;
static int max=1;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
N = scanner.nextInt();
arr=new char[N][N];
for(int i=0; i<N; i++){
String s=scanner.next();
for(int j=0; j<N; j++){
arr[i][j]=s.charAt(j);
}
}
//행을 기준으로 오른쪽과 비교
for(int i=0; i<N; i++){
for(int j=0; j<N-1; j++){
swap(i,j,i,j+1);
search();
swap(i,j+1,i,j);
}
}
//열 기준으로 아래와 비교
for(int i=0; i<N-1; i++){
for(int j=0; j<N; j++){
swap(i,j,i+1,j);
search();
swap(i+1,j,i,j);
}
}
System.out.println(max);
}
public static void swap(int x,int y, int a , int b){
char tmp=arr[x][y];
arr[x][y]=arr[a][b];
arr[a][b]=tmp;
}
public static void search(){
//행마다 비교
for(int i=0; i<N; i++){
int count =1;
//옆이랑 비교
for(int j=0; j<N-1; j++){
if(arr[i][j]==arr[i][j+1]){
count++;
max=Math.max(count,max);
}
else{
count=1;
}
}
}
//열마다 비교
for(int i=0; i<N; i++){
int count=1;
for(int j=0; j<N-1; j++){
if(arr[j][i]==arr[j+1][i]){
count++;
max=Math.max(count,max);
}
else{
count=1;
}
}
}
}
}
어려웠던 점 : 아래 요소, 오른쪽 요소와는 교환을 하는데 왼쪽이나 위 요소와는 교환을 안하는 이유 ==> 아래, 오른쪽 요소와 교환을 했을때 다 확인이 된 경우이기 때문에 다시 하지 않는다.
'알고리즘 > 백준' 카테고리의 다른 글
백준-1748번/수 이어 쓰기 1 (java) (0) | 2024.06.27 |
---|---|
백준-1476번/날짜 계산 (java) (1) | 2024.06.26 |
백준-2309번/일곱 난쟁이 (java) (0) | 2024.06.25 |
백준-2156번/포도주 시식 (java) (2) | 2024.02.28 |
백준-11057번/오르막 수 (java) (0) | 2024.02.23 |