본문 바로가기
코테 - 자바

20260708 프로그래머스 lv.1

by BIGENGINEER 2026. 7. 8.

 

<덧칠하기>

 

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]를 반환한다.