안녕하세요! delay100입니다.
오늘은 어제 못 풀었던 2번째 미들러 문제, 오늘 출제된 문제를 풀어보겠습니다.
목요일 2번 문제는 아래와 같았습니다.
2번.
https://school.programmers.co.kr/learn/courses/30/lessons/161990
코드에 대한 설명은 주석으로 달아두었습니다.
class Solution {
public int[] solution(String[] wallpaper) {
int wallpaperLength = wallpaper.length;
// a, b는 배열의 최대값이 50까지이므로 최소값을 설정하기 위해 가장 큰 값+1인 51로 설정
int a = 51; // 가장 위쪽 기준으로 시작 x좌표 설정
int b = 51; // 가장 왼쪽 기준으로 시작 y좌표 설정
int c = 0; // 가장 아래 기준으로 끝 x좌표 설정
int d = 0; // 가장 오른쪽 기준으로 끝 y좌표 설정
for(int i=0; i < wallpaperLength; i++) { // x좌표. 아래쪽으로 증가함
int sLength = wallpaper[i].length();
for(int j=0; j < sLength; j++) { // y좌표. 오른쪽으로 증가함
char ch = wallpaper[i].charAt(j);
if(ch == '#') {
a = (a < i) ? a : i; // 가장 위쪽 기준 x좌표를 가장 작게 설정
b = (b < j) ? b : j; // 가장 왼쪽 기준 y좌표를 가장 작게 설정
c = (c < (i+1)) ? (i+1) : c; // 가장 아래쪽 기준 x좌표를 가장 크게 설정
d = (d < (j+1)) ? (j+1) : d; // 가장 오른쪽 기준 y좌표를 가장 크게 설정
}
}
}
int[] answer = {a, b, c, d};
return answer;
}
}
금요일 미들러 문제.
https://school.programmers.co.kr/learn/courses/30/lessons/42862
1. 실패 코드 - 제출 시 83.3점
class Solution {
public int solution(int n, int[] lost, int[] reserve) {
int answer = 0;
boolean[] isUsed = new boolean[reserve.length];
for(int i=0; i<lost.length; i++) {
for(int j=0; j<reserve.length; j++) {
if(!isUsed[j]){
if(((lost[i]-1) == reserve[j]) || ((lost[i]+1) == reserve[j])) {
isUsed[j] = true;
answer++;
break;
}
}
}
}
answer += (n-lost.length);
return answer;
}
}
위의 코드에서 문제점이 2가지가 있는데,
1. 첫 번째 문제점
놓친 조건이 있습니다.
여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.
2. 두 번째 문제점
5 7 12 24번 테스트케이스가 틀렸을 때. 아래의 반례를 확인해보면 됩니다!
특히 가장 마지막 반례인 n=5, lost(int[])=[4, 5], reserve(int[])=[3, 4] 에서 힌트를 얻었습니다.
2. 성공 코드
여벌 체육복을 가져온 학생이 도난 당했을 경우를 처리해주는 코드를 추가했습니다.
이 때 lostIsUsed 배열은 도난 당한 학생들 중에 여벌 체육복을 챙겨온 학생을 true로 바꾸는 배열입니다.
이렇게 하지 않으면
n=5, lost(int[])=[4, 5], reserve(int[])=[3, 4] 이 반례에서 4에 대해 계산 시, 4번 학생에 대 reserve의 3이 계산되어 값이 틀리게 됩니다.
import java.io.*;
import java.util.*;
class Solution {
public int solution(int n, int[] lost, int[] reserve) {
int answer = 0;
boolean[] isUsed = new boolean[reserve.length]; // reserve 배열에서 누군가에게 빌려준 경우 true로 표시
boolean[] lostIsUsed = new boolean[lost.length]; // lost 배열에서 자기 자신에게 빌려준 경우 true로 표시
// 배열을 오름차순 정렬해줌 -> 정렬하지 않으면 테스트 18번 통과x
// 정렬하지 않으면 배열 순서가 꼬임
Arrays.sort(lost);
Arrays.sort(reserve);
// 여벌 체육복 가져온 학생이 도난 당했을 경우
for(int i=0; i<lost.length; i++) {
for(int j=0; j<reserve.length; j++) {
if(lost[i]==reserve[j]) {
isUsed[j] = true;
lostIsUsed[i] = true;
answer++;
break;
}
}
}
for(int i=0; i<lost.length; i++) {
for(int j=0; j<reserve.length; j++) {
if(!isUsed[j] && !lostIsUsed[i]){
if(((lost[i]-1) == reserve[j]) || ((lost[i]+1) == reserve[j])) {
isUsed[j] = true;
answer++;
break;
}
}
}
}
answer += (n-lost.length);
return answer;
}
}
+ 비기너 문제
부족한 금액 계산하기
https://school.programmers.co.kr/learn/courses/30/lessons/82612
+ 챌린저 문제
점 찍기
https://school.programmers.co.kr/learn/courses/30/lessons/140107
봐주셔서 감사합니다!
'항해99 > 99club1기TIL' 카테고리의 다른 글
[99club/TIL] 1주차 - 일요일 TIL(Today I Learned) (0) | 2024.03.31 |
---|---|
[99club/TIL] 1주차 - 토요일 TIL(Today I Learned) (0) | 2024.03.30 |
[99club/TIL] 1주차 - 목요일 TIL(Today I Learned) (0) | 2024.03.28 |
[99club/TIL] 1주차 - 화요일 TIL(Today I Learned) (1) | 2024.03.26 |
[99club/TIL] 1주차 - 월요일 TIL(Today I Learned) (1) | 2024.03.25 |