프로그래머스 1일차

·2024년 12월 4일
0

코테

목록 보기
8/11

목표
✨ 프로그래머스 레벨2 혼자 풀기

문제 1 - 달리기 경주

  • 일단 인덱스를 아는 게 중요할 것 같음 -> 배열에서 할 수 없으니 map 사용
  • map.get()은 인덱스를 통해 값을 가져오는 것. 그러니 map을 저장할 때 <인덱스, 값> 형태로 저장
import java.util.*;

class Solution {
    public String[] solution(String[] players, String[] callings) {
        
        Map<String, Integer> map = new HashMap<>();
		 
		 int index = 0;
		 for(String p : players) map.put(p, index++);
		 
		 for(String c : callings) {
			 int callingsIndex = map.get(c).intValue(); // get 함수는 값을 가져오는 것. 즉 인덱스 추출
			 int targetIndex = callingsIndex - 1; // 자리가 바뀔 선수의 인덱스
			 
			 String targetPlayer = players[targetIndex]; // 원래 순위 사람 저장
			 players[targetIndex] = c; // 앞에 순위로 바꿔줌
			 players[callingsIndex] = targetPlayer; // 원래 순위 사람은 뒤로
			 
			 // map에 저장
			 map.put(targetPlayer, callingsIndex);
			 map.put(c, targetIndex);
			 System.out.println(map);
		 }
		 
         return players;
    }
}

문제 2 - 추억 점수

  • 2차원 배열 안의 배열의 길이를 구하고 싶을 땐 배열이름[i].length 사용
  • map에 값이 없을 땐 null이 출력된다.
import java.util.*;

class Solution {
    public int[] solution(String[] name, int[] yearning, String[][] photo) {
        
        int[] result = new int[photo.length];
        
        // map에 저장
        Map<String, Integer> map = new HashMap<>();
        
        for(int i = 0; i < name.length; i++){
            map.put(name[i], yearning[i]);
        }
        
        // 계산        
        for(int i = 0; i < photo.length; i++) {
            int sum = 0;
            for(int j = 0; j < photo[i].length; j++) {
                if(map.get(photo[i][j]) != null) {
            		 sum += map.get(photo[i][j]).intValue();
            	 } else {
            		 sum += 0;
            	 }
            }
            
            result[i] = sum;
        }
        
        return result;
    }
}

문제 3 - 공원 산책

🔎 접근법
1. 문제는 배열에 OOO 이렇게 담겨 있는 걸 어떻게 직사각형의 모양으로 생각하면서? 풀 수 있는가임 --> 2차원 배열을 활용할까 싶음
2. 명령어가 "E 2"이런 형식인데 이걸 분해해서 전달해야 할 것 같은데.. 움 -> split() 사용하장
3. 내가 간과한 것 -> 시작 위치 설정

class Solution {
    static char [][] cPark;
	static int [] now; // 현재 위치
	
    public int[] solution(String[] park, String[] routes) {

    	// 정원 만들기
    	cPark = new char[park.length][park[0].length()]; 
    	
    	for(int i = 0; i < park.length; i++) {
    		for(int j = 0; j < park[i].length(); j++) {
    			cPark[i][j] = park[i].charAt(j);
    		}
    	}
    	
    	// 시작 위치 설정
    	now = new int[2];
    	
    	for(int i = 0; i < park.length; i++) {
    		for(int j = 0; j < park[i].length(); j++) {
    			if(cPark[i][j] == 'S') {
    				now[0] = i;
    				now[1] = j;
    				break;
    			}
    		}
    	}
    	
    	// 명령 처리
    	for(int i = 0; i < routes.length; i++) {
    		boolean isCorrect = move(routes[i].split(" ")[0], Integer.parseInt(routes[i].split(" ")[1]));
    	}
    	
        return now;
    }
    
    
    public static boolean move(String direction, int distance) {
    	
    	int x = now[1]; // 현재 가로
        int y = now[0]; // 현재 세로
    	
    	// 이동 시키기
    	for(int i = 0; i < distance; i++) {
    		
    		switch (direction) {
    		case "N": y--; break;
    		case "S": y++; break;
    		case "W": x--; break;
    		case "E": x++; break;
    		}
    		
    		
    		// 범위 넘는지 확인
    		if (y < 0 || y >= cPark.length || x < 0 || x >= cPark[0].length) {
                return false; // 공원을 벗어나면 이동하지 않음
            }
    		
    		// X면 실행하지 않기
    		if(cPark[y][x] == 'X') {
    			return false;
    		}
    		
    	}
    	
		now[0] = y;
		now[1] = x;
		
		return true;
    }
    	
}

가로 세로 헷갈려 죽는줄 ㅡㅡ ;;;


문제 4 - 바탕화면 정리

🔎 접근법
1. #가 존재하는 최대 x, y와 최소 x, y를 구해야 함
2. 최대는 +1 해줘야 함 !!

    public int[] solution(String[] wallpaper) {
        
        char[][] arr = new char[wallpaper.length][wallpaper[0].length()];
        
        // char로 변환
        for(int i = 0; i < wallpaper.length; i++) {
            for(int j = 0; j < wallpaper[i].length(); j++) {
                arr[i][j] = wallpaper[i].charAt(j);
            }
        }
        
        // 계산
        // #가 존재하는 최대 x, y와 최소 x, y를 구해야 함
        
        int xMin = 50;                                 
        int xMax = 0;
        int yMin = 50;
        int yMax = 0;
        
        // j가 x 좌표 i가 y좌표
        for(int i = 0; i < wallpaper.length; i++) {
            for(int j = 0; j < wallpaper[i].length(); j++) {
                if(arr[i][j] == '#') {
                    if(j > xMax) xMax = j;
                    if(j < xMin) xMin = j;
                    
                    if(i > yMax) yMax = i;
                    if(i < yMin) yMin = i;
                }
            }
        }
        
        int [] drag = new int[] {yMin, xMin, yMax + 1, xMax + 1};
        
        return drag;
    }

문제 5 - 덧칠하기

🔎 접근법

  • 일단 길이 구해서 페인트 길이랑 비교하는 건 알겟음 그 담은 어케 함유..? 부분배열..? 그 길이를 어케해여...?
    --> 칠한 길이를 저장할 변수 만들기
class Solution {
    public int solution(int n, int m, int[] section) {
        
        int distance = 0;
        int count = 0;
        
        for(int i = 0; i < section.length; i++) {
            if(distance >= section[i]) continue;
            distance = section[i] + m - 1;
            count++;
        }
        
        return count;
    }
}

원래는 칠한 여부를 표시하는 배열을 만들까 했는데 복잡해질 것 같아서 변경함


할수있겠져 저 🥺 잘하고 있는거겠지,,ㅡㅠㅜㅠㅓㅜ?

profile
~*

0개의 댓글