항해99/99club1기TIL

[99club/TIL] 1주차 - 금요일 TIL(Today I Learned)

delay100 2024. 3. 30. 01:25
728x90
반응형
SMALL

안녕하세요! delay100입니다. 

오늘은 어제 못 풀었던 2번째 미들러 문제, 오늘 출제된 문제를 풀어보겠습니다.


목요일 2번 문제는 아래와 같았습니다.

2번.

https://school.programmers.co.kr/learn/courses/30/lessons/161990

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

코드에 대한 설명은 주석으로 달아두었습니다. 

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

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] 에서 힌트를 얻었습니다.

프로그래머스 42862번 반례


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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

+ 챌린저 문제

점 찍기
https://school.programmers.co.kr/learn/courses/30/lessons/140107

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


봐주셔서 감사합니다!

728x90
반응형
LIST