프로그래머스 코딩테스트 > 연습 > 바탕화면정리
1. 초기 코드
- 문제 잘 못 이해한듯
class Solution {
public int[] solution(String[] wallpaper) {
int[] answer = {};
//바탕화면 상태 문자열 배열 wallpaper
//빈칸은 . 값이 있으면 #
//점 S가 시작점 (lux,luy) ,점 E가 끝점(rdx, rdy)
//거리는 |rdx - lux| + |rdy - luy| ->Math.abs 사용하기
// wallpaper = [".#...", "..#..", "...#."] -> 인수로 받아옴
//최소한의 이동거리를 갖는 드래그의 시작점과 끝점을 담은 정수 배열 return
int n =0;
int m =0;
//일단 wallpaper에서 값이 있는 부분을 확인
for(int i=0; i<wallpaper.length; i++){
//wallpaper의 인수 개수가 x축
//문자열 인수의 길이가 y축
int ynum = wallpaper[0].length(); // y축의 길이 알아내기 -> 항상 고정
for(int j=0; j<wallpaper[i].length(); j++){
char[] c = wallpaper[j].toCharArray(); //j가 0인건 #의 위치를 안다고 해도 그 다음 인덱스는?
if(c[j] == '#'){
n = j+1;
break;
}
}
}
return answer;
}
}
2. 두 번째 코드
- 뭔가 방향은 잡아가는데 문제에서 원하는 것을 확실하게 알지 x
class Solution {
public int[] solution(String[] wallpaper) {
int[] answer = {};
//바탕화면 상태 문자열 배열 wallpaper
//빈칸은 . 값이 있으면 #
//점 S가 시작점 (lux,luy) ,점 E가 끝점(rdx, rdy)
//거리는 |rdx - lux| + |rdy - luy| ->Math.abs 사용하기
// wallpaper = [".#...", "..#..", "...#."] -> 인수로 받아옴
//최소한의 이동거리를 갖는 드래그의 시작점과 끝점을 담은 정수 배열 return
int S = (lux, luy);
int E = (rdx, rdy);
//근데 x,y의 길이를 알 필요가 있남?
//x축의 길이를 알기 - 세로방향 = wallpaper의 길이
int x = wallpaper.length;
//y축의 길이를 알기 - 가로방향 = wallpaper 인수의 길이
int y = wallpaper[0].length;
for(int i=0; i<wallpaper.length; i++){
for(int j=0; j<wallpaper[i].length; j++){
if(wallpaper[i][j] == '#'){
int y = j+1;
S = (x,y);
}else{
continue;
}
}
}
return answer;
}
}
3. 도움받은 코드
class Solution {
public int[] solution(String[] wallpaper) {
//바탕화면 상태 문자열 배열 wallpaper
//빈칸은 . 값이 있으면 #
//점 S가 시작점 (lux,luy) ,점 E가 끝점(rdx, rdy)
//거리는 |rdx - lux| + |rdy - luy| ->Math.abs 사용하기
// wallpaper = [".#...", "..#..", "...#."] -> 인수로 받아옴
//최소한의 이동거리를 갖는 드래그의 시작점과 끝점을 담은 정수 배열 return
/*
2차원 탐색
↓
'#' 발견
↓
가장 위?
가장 왼쪽?
가장 아래?
가장 오른쪽?
계속 갱신
↓
반복 끝
↓
[minRow, minCol, maxRow+1, maxCol+1] */
int h = wallpaper.length;
int w = wallpaper[0].length();
int minRow = h; //배열의 크기 4 열
int minCol = w; //문자열의 길이 5 행
int maxRow =0;
int maxCol =0;
for(int i=0; i<h; i++){
for(int j=0; j<w; j++){
char c = wallpaper[i].charAt(j); //"..#.."의 각 자리
if(c == '#'){
minRow = Math.min(minRow, i); //가장 위
minCol = Math.min(minCol, j); //가장 왼쪽
maxRow = Math.max(maxRow, i); //가장 아래
maxCol = Math.max(maxCol, j); //가장 오른쪽
}
}
}
int[] answer = {minRow, minCol, maxRow+1, maxCol+1};
return answer;
}
}
사고과정
1. 문제 읽고 반환값 봄
2. 입력 봄 -> 2차원 배열 떠올림 => 이중 for문
3. #만나면 뭐? => 함정 조심, 드래그를 구할 필요가 x
4. 가장 작은 사각형? => 문제에서 최소 이동거리 구하라고 했으므로
5. 그럼 사각형은? => 가장 위, 가장 왼쪽, 가장 아래, 가장 오른쪽으로 결정 => 변수 4개 필요
6. #을 볼때마다 혹시 더 위인가? 더 왼쪽인가? ...을 보면 됨 => Math.max / Math.min 사용
- 가장 작은 사각형
- 모든 점 포함
- 최소 범위
- 모든 좌표 포함
- 최소 영역
- 모든 파일 포함
=> minX
minY
maxX
maxY 구하는 문제
'코테 - 자바' 카테고리의 다른 글
| 20260708 프로그래머스 lv.1 (0) | 2026.07.08 |
|---|---|
| 백준_1940_투 포인터 (0) | 2026.03.05 |
| 백준_2018_연속된 자연수의 합 구하기(투 포인터) (1) | 2026.03.05 |
| 백준_11660 구간 합 구하기2 (0) | 2026.03.05 |
| 백준_11659 구간 합 구하기 (0) | 2026.03.05 |