<덧칠하기>
1. 초기코드
class Solution {
public int solution(int n, int m, int[] section) {
int answer = 0;
//전체 벽 길이 : n
//롤러의 길이 : m
//section은 페인트 칠해지지 않은 곳
int count =0;
int end =0;
//현재 안 칠해진 위치가 이전 롤러 범위 안에 들어왔는지
//section을 앞에서부터 본다
for(int i=0; i<section.length; i++){
//section이 2라면, 2부터 롤러 길이만큼 칠함.
//끝이 어디인지 확인
end = section[i] + m-1;
count++;
//end보다 원소가 크면 = 안칠해진 위치
if(section[i] > end){
count++;
}else{
continue;
}
answer = count;
}
return answer;
}
}
- 아래 if 문을 쓸 수가 없음
2. 수정코드
class Solution {
public int solution(int n, int m, int[] section) {
int answer = 0;
//전체 벽 길이 : n
//롤러의 길이 : m
//section은 페인트 칠해지지 않은 곳
int count =0;
int end =0;
//현재 안 칠해진 위치가 이전 롤러 범위 안에 들어왔는지
//section을 앞에서부터 본다
for(int i=0; i<section.length; i++){
//end보다 원소가 크면 = 안칠해진 위치
if(section[i] > end){
count++;
end = section[i] + m-1;
}else{
continue;
}
answer = count;
}
return answer;
}
}
<공원산책> -> 7/9 다시 풀것
1. 초기코드
- 좌표판을 생성하고 움직이려고 함
class Solution {
public int[] solution(String[] park, String[] routes) {
int[] answer = {};
//공원 : park
//명령 : routes
//명령 수행 후 위치 [세로, 가로] 반환
//s : 시작 , o : 통과 , x : 못 감
//park 행, 열
int h = park.length;
int w = park[0].length;
//좌표 판 생성
for(int i =0; i<h; i++){
for(int j=0; j<w; j++){
char c = park[i].charAt(j);
//공원 벗어나거나, 장애물 만났을 때 무시
//공원을 벗어남. -> h,w 좌표를 벗어났을 때..
if(c == 'X' && )
}
}
// routes를 가져와서 좌표에서 이동
return answer;
}
}
2. 두 번째 삽질
- c 는 밖에서 사용할 수 없
class Solution {
public int[] solution(String[] park, String[] routes) {
int[] answer = {};
//공원 : park
//명령 : routes
//명령 수행 후 위치 [세로, 가로] 반환
//s : 시작 , o : 통과 , x : 못 감
//park 행, 열
int h = park.length; //행
int w = park[0].length; //열
//시작 좌표부터 찾아야함.
int x = 0;
int y = 0;
for(int i=0; i<h; i++){
for(int j=0; j<w; j++){
char c = park[i].charAt(j);
if(c == 'S'){
x = i;
y = j;
}
}
}
//움직일 임시좌표
int nx =0;
int ny =0;
//routes 배열
for(int i=0; i<routes.length; i++){
String[] arr = routes[i].split(" ");
String dist = arr[0]; //방향
int num = Integer.parseInt(arr[1]); //거리
nx = x;
ny = y;
while(nx > 0 && ny > 0 && nx < h && ny <w && c !='X'){
//이동
if(dist.equals("E")){
ny = ny + num;
}eles if(dist.equals("S")){
nx = nx + num;
}else if(dist.equals("W")){
ny = ny - num;
}
x = nx;
y = ny;
}
}
return answer;
}
}
3. 최종 코드
class Solution {
public int[] solution(String[] park, String[] routes) {
int[] answer = new int[2];
//공원 : park
//명령 : routes
//명령 수행 후 위치 [세로, 가로] 반환
//s : 시작 , o : 통과 , x : 못 감
//park 행, 열
int h = park.length; //행
int w = park[0].length(); //열
//시작 좌표부터 찾아야함.
int x = 0;
int y = 0;
for(int i=0; i<h; i++){
for(int j=0; j<w; j++){
char c = park[i].charAt(j);
if(c == 'S'){
x = i;
y = j;
}
}
}
//움직일 임시좌표
int nx =0;
int ny =0;
//routes 배열
for(int i=0; i<routes.length; i++){
String[] arr = routes[i].split(" ");
String dist = arr[0]; //방향
int num = Integer.parseInt(arr[1]); //거리
nx = x;
ny = y;
boolean possible = true;
//왜 num? -> 한 칸씩 이동할 때마다 확인해야되기 때문에
for(int step =0; step <num; step++){
if(dist.equals("E")){
ny++;
}else if(dist.equals("S")){
nx++;
}else if(dist.equals("W")){
ny--;
}else if(dist.equals("N")){
nx--;
}
if(nx < 0 || ny < 0 || nx >= h || ny >= w){
possible = false;
break;
}else{
if(park[nx].charAt(ny) == 'X'){
possible = false;
break;
}
}
}
if(possible){
x = nx;
y = ny;
}
}
answer[0] = x;
answer[1] = y;
return answer;
}
}
[ 정리 ]
명령 하나를 바로 실행하지 말고, 먼저 가능한지 시뮬레이션해 본 뒤 성공했을 대만 실제 위치를 바꾸는 것
헷갈린 점 : 이동하다 실패하면 원래 위치로 돌아가야 한다는 것
1. 시작 위치 S에서 출발한다.
2. routes 명령을 순서대로 수행한다.
3. 이동 중 공원 밖으로 나가면 그 명령은 무시한다.
4. 이동 중 장애물 X를 만나도 그 명령은 무시한다.
5. 명령이 완전히 성공했을 때만 현재 위치를 갱신한다.
< 풀이 과정 >
1. park에서 시작 좌표 s 찾기
- park는 문자열 배열이므로 2차원 배열처럼 생각
- 처음에 park를 돌면서 s를 찾아, 그 위치를 x, y로 저장
2. routes 명령 하나씩 해석
- 문자열 안에 필요한 값이 두 개 있으므로 공백 기준으로 나눔
- 방향에 따라서 좌표 이동 생각
3. 임시 좌표로 먼저 이동
- 한 칸씩 이동
4. possible을 사용하는 이유
- 이번 명령이 끝까지 성공했는지 기억하는 변수
<사고 과정>
1. park의 크기 h, w를 구한다.
2. park를 순회하면서 S의 위치를 찾는다.
3. routes를 하나씩 꺼낸다.
4. 현재 위치 x, y를 임시 좌표 nx, ny에 복사한다.
5. num만큼 한 칸씩 이동한다.
6. 이동할 때마다 공원 밖인지 확인한다.
7. 이동할 때마다 X인지 확인한다.
8. 중간에 실패하면 possible = false.
9. 끝까지 성공했으면 x, y를 nx, ny로 갱신한다.
10. 모든 명령이 끝나면 [x, y]를 반환한다.
'코테 - 자바' 카테고리의 다른 글
| 프로그래머스_바탕화면정리 (0) | 2026.07.01 |
|---|---|
| 백준_1940_투 포인터 (0) | 2026.03.05 |
| 백준_2018_연속된 자연수의 합 구하기(투 포인터) (1) | 2026.03.05 |
| 백준_11660 구간 합 구하기2 (0) | 2026.03.05 |
| 백준_11659 구간 합 구하기 (0) | 2026.03.05 |