코테
[java] 프로그래머스스쿨 연습문제 Lv.1 문제 모음 1
상똥
2023. 4. 13. 22:10
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;
}
}