본문 바로가기
코테

[java] 프로그래머스스쿨 연습문제 Lv.1 문제 모음 1

by 상똥 2023. 4. 13.

1. 달리기 경주

https://school.programmers.co.kr/learn/courses/30/lessons/178871
풀이
1. 해쉬맵 두 개를 선언한 후 하나는 key값을 이름 value값을 등수로, 다른 하나는 key값을 등수 value값을 이름으로 설정한다.
1-1. map1 : 이름을 통해 등수를 도출할 때 사용
1-2. map2 : 등수를 통해 이름을 도출할 때 사용
2. for문을 통해 각 해쉬맵에 players 배열을 사용해 값을 입력한다.
3. callings 배열을 for문으로 읽어가며 해쉬맵의 값을 바꾼다.
3-1. name이라는 String변수에 바로 앞에 있는 사람의 이름을 저장한다.
3-2. rank라는 int변수에 바로 앞에 있는 사람의 등수를 저장한다.
3-3. map2에서 해당 순위의 이름을 바꿔준다.
3-4. map1에서 선수들의 순위를 바꿔준다.
4. map2의 정보를 answer배열에 복사한다.
회고
- List를 사용해서 추월할때마다 remove(callings[index]), add(index-1, callings[i])를 했는데 시간초과,,,
- 당연히!! 배열을 사용해도 시간 초과 ㅜ ㅜ
- O(n²)를 O(n)으로 바꾸고 싶을 때는 map을 활용하자
- value값으로 key값 도출하려고 하지 말고 그냥 맵 두 개 쓰면 편하고 좋다!
- 이게,,,레벨1,,,? 정답률 38%던데;;; 자바 초보라 그런가 정말정말 어렴다 ㅜㅜ
코드 (접은 글)
더보기
class Solution {
    public String[] solution(String[] players, String[] callings) {
        HashMap<String, Integer> map1 = new HashMap<>(players.length);
        HashMap<Integer, String> map2 = new HashMap<>(players.length);
        for (int i = 0; i < players.length; i++) {
            map1.put(players[i], i);
            map2.put(i, players[i]);
        }

        for (int i = 0; i < callings.length; i++) {
            String name = map2.get(map1.get(callings[i]) - 1);
            int rank = map1.get(name);
            map2.put(map1.get(callings[i]) - 1, callings[i]);
            map2.put(map1.get(callings[i]), name);
            map1.put(name, rank + 1);
            map1.put(callings[i], rank);
        }
        String[] answer = new String[map2.size()];
        for (int i = 0; i < answer.length; i++)
            answer[i] = map2.get(i);
        return answer;
    }
}

 

2. 추억 점수

https://school.programmers.co.kr/learn/courses/30/lessons/176963
풀이
1. HashMap map을 key값을 이름, value값을 추억점수로 선언한다.
1-1. for문으로 map의 key값에 name[index], value값에 yearning[index]를 넣어준다.
2. int형 배열 answer의 길이를 photo의 행 수 만큼 설정한다.
3. for문으로 answer에 photo행 별 추억점수를 삽입한다.
3-1. map에 photo[index-row][index-column]의 값이 없다면 continue
3-2. 있다면 answer[index]=0으로 설정한 값에 map에서 도출한 추억점수를 더한다.
회고
- map의 key에 찾는 값이 있는지 확인하려면 map.containsKey(찾고자하는 값)
코드 (접은 글)
더보기
import java.util. *;

        class Solution {
            public int[] solution(String[] name, int[] yearning, String[][] photo) {
                HashMap<String, Integer> map = new HashMap<>(name.length);
                for (int i = 0; i < name.length; i++) {
                    map.put(name[i], yearning[i]);
                }

                int[] answer = new int[photo.length];
                for (int i = 0; i < answer.length; i++) {
                    answer[i] = 0;
                    for (int j = 0; j < photo[i].length; j++) {
                        if (!map.containsKey(photo[i][j]))
                            continue;
                        answer[i] += map.get(photo[i][j]);
                    }
                }

                return answer;
            }
        }

 

3. 공원산책

https://school.programmers.co.kr/learn/courses/30/lessons/172928
풀이
1. HashMap 두 개를 선언해서 동, 서, 남, 북 별로 행과 열의 좌표가 변해야 할 방향에 따라 값을 입력한다.
1-1. 행 : 북 => -1, 남 => +1, 동&서 => 0
1-2. 열 : 서 => -1, 동 => +1, 북&남 => 0
2. 2차원 배열 map을 선언하여 공원의 전체 좌표를 입력한다.
2-1. 시작 위치와 장애물이 없는 곳은 1, 장애물이 있는 곳은 0으로 입력
3. routes를 for문으로 읽으며 움직일 방향과 횟수에 따라 임의로 선언한 행 r과 열c의 값을 변화시킨다.
3-1. 3번에서 만약 행 또는 열이 map밖으로 벗어나면 움직임을 취소한다.
3-2. 3번에서 만약 움직인 후의 위치가 장애물이 있는 곳이라면 움직임을 취소한다.
3-3. 움직임을 취소하면 boolean check를 true로 바꾸고 다음 route로 넘어간다.
3-4. boolean check가 false라면 answer값에 움직인 후의 r과 c를 저장한다.
회고
- 무난하게 풀었던 문제
- 근데 이런 문제를 풀 때 마다 범위를 헷갈린다 ㅡㅡ
코드 (접은 글)
더보기
import java.util.*;

class Solution {
    public int[] solution(String[] park, String[] routes) {
        int[] answer = new int[2];
        HashMap<String, Integer> directionR = new HashMap<>(4);
        HashMap<String, Integer> directionC = new HashMap<>(4);
        directionR.put("N", -1);
        directionC.put("N", 0);
        directionR.put("E", 0);
        directionC.put("E", 1);
        directionR.put("W", 0);
        directionC.put("W", -1);
        directionR.put("S", 1);
        directionC.put("S", 0);
        int[][] map = new int[park.length][park[0].length()];
        for (int i = 0; i < park.length; i++) {
            for (int j = 0; j < park[i].length(); j++) {
                String parkPoint = park[i].substring(j, j + 1);
                if (parkPoint.equals("S")) {
                    answer[0] = i;
                    answer[1] = j;
                    map[i][j] = 1;
                } else if (parkPoint.equals("O")) {
                    map[i][j] = 1;
                } else if (parkPoint.equals("X")) {
                    map[i][j] = 0;
                }
            }
        }

        for (int i = 0; i < routes.length; i++) {
            boolean check = false;
            int r = answer[0];
            int c = answer[1];
            for (int j = 0; j < Integer.parseInt(routes[i].substring(2, 3)); j++) {
                String direction = routes[i].substring(0, 1);
                r += directionR.get(direction);
                c += directionC.get(direction);
                if (r < 0 || c < 0 || r >= map.length || c >= map[r].length) {
                    check = true;
                    break;
                } else if (map[r][c] == 0) {
                    check = true;
                    break;
                }
            }
            if (check == false) {
                answer[0] = r;
                answer[1] = c;
            }
        }
        return answer;
    }
}

 

4. 바탕화면 정리

https://school.programmers.co.kr/learn/courses/30/lessons/161990
풀이
1. lux, luy, rdx, rdy를 선언한다. (사실 굳이 안해도 되는데 난 answer쓰기 귀찮아서 그냥 함)
1-1. 시작점 lux, luy는 그 값을 점점 줄여나갈 것이므로 가능한 숫자 중 가장 큰 값으로 설정
1-2. 끝나는 점 rdx, rdy는 그 값을 점점 키울 것이므로 가능한 숫자 중 가장 작은 값으로 설정
2. #이 있는 자리의 좌표를 1의 네 가지 변수와 비교한다.
2-1. 행이 lux보다 작다면 lux의 값을 바꾸고 rdx의 값보다 크다면 rdx의 값을 바꾼다.
2-2. 열이 luy보다 작다면 luy의 값을 바꾸고 rdy의 값보다 크다면 rdy의 값을 바꾼다.
2-3. 이때 배열의 구조 상 rdx, rdy는 행, 열보다 1씩 큰 값과 비교해야 한다.
회고
- 3, 21, 23, 24가 안풀린다면,,, lux, luy를 최댓값인 51로 설정해보시오,,!!!
코드 (접은 글)
더보기
class Solution {
    public int[] solution(String[] wallpaper) {
        int lux = 51, luy = 51, rdx = 1, rdy = 1;
        int[] answer = new int[4];

        for (int i = 0; i < wallpaper.length; i++) 
            for (int j = 0; j < wallpaper[0].length(); j++)
                if (wallpaper[i].substring(j, j + 1).equals("#")) {
                    if (i < lux)
                        lux = i;
                    if (j < luy)
                        luy = j;
                    if (i + 1 > rdx)
                        rdx = i + 1;
                    if (j + 1 > rdy)
                        rdy = j + 1;
                }
        
        answer[0] = lux;
        answer[1] = luy;
        answer[2] = rdx;
        answer[3] = rdy;
        return answer;
    }
}

 

5. 덧칠하기

https://school.programmers.co.kr/learn/courses/30/lessons/161989
풀이
1. 벽의 칸을 나타내는 인덱스(indexWall = section[0])와 section배열의 인덱스(indexSection=0)을 각각 선언한다.
1-1. 시간을 단축하기 위해 indexWall은 section의 첫 번째 요소로 설정
1-2. 만약 m=1이라면 answer = section.length로 설정한 후 return answer로 종료. (시간 절약!!)
2. 벽의 칸과 section의 원소들을 비교해가며 answer를 하나식 증가시킨다.
2-1. while문을 사용하여 indexWall<=n && indexSection<section.length일 동안 반복
3. 만약 두 인덱스가 다른 경우
3-1. indexWall>indexSection이면 indexSection++
3-2. 반대면 indexWall의 값을 section[indexSection]값으로 설정한다. (시간 절약!!)
4. 만약 두 인덱스가 같은 경우 색칠 횟수가 늘어나므로 answer++, indexWall+=m, indexSection++
회고
- 범위 좀 헷갈리지 말자 제발,,,^^
코드 (접은 글)
더보기
class Solution {
    public int solution(int n, int m, int[] section) {
        int answer = 0;
        if (m == 1) {
            answer = section.length;
            return answer;
        }

        int indexWall = section[0];
        int indexSection = 0;

        while (indexWall <= n && indexSection < section.length) {
            if (indexWall != section[indexSection]) {
                if (indexWall > section[indexSection])
                    indexSection++;
                else
                    indexWall = section[indexSection];
            } else {
                answer++;
                indexWall += m;
                indexSection++;
            }
        }
        return answer;
    }
}

 

'코테' 카테고리의 다른 글

[java] 짝지어 제거하기  (0) 2024.01.11
[java] 귤 고르기  (1) 2024.01.11
[python] 프로그래머스스쿨 더 맵게  (0) 2023.12.14
[Java] 심화 1단계  (1) 2023.11.13
[java] 프로그래머스스쿨 연습문제 Lv.1 문제 모음 2  (0) 2023.04.24