안녕하세요. delay100 입니다!
오늘도 마찬가지로 세션이 진행되었습니다. 벌써 4번째 세션이네요.
저녁먹고 감기약을 먹고 9시 정규 세션에 참가했더니 처음 50분은 졸아서 사실 9시 50분쯤부터 제대로 코딩을 하게 되었어요ㅠㅠ..
그래서 정규 시간 내에는 1번밖에 풀지 못했습니다.. ㅠㅠ 졸려서 머리가 잘 안 굴러가더군용..
아무튼 오늘의 TIL 시작합니다!
미들러 문제
1번. 할인 행사
https://school.programmers.co.kr/learn/courses/30/lessons/131127
이 문제는 HashMap을 두 개 사용하여 해결하였습니다.
// 1. map, map2 초기화
첫 번째 HashMap인 map은 want와 number에 대한 정보가 담겨있는 map입니다. (key-want값, value-number값)
사실 만들지 않아도 되지만, map 2개를 비교하는 모양을 만들고 싶어서 따로 만들어보았습니다.
두 번째 HashMap인 map2는 특정 기간(특정 10일구간)에 현재 담겨있는 구매 목록입니다.
// 2. 최초 10일간의 할인 목록 정보 map2에 담기
문제 조건에 number 길이는 10, discount의 최소길이 10으로 명시되어 있으므로 가능한 방식입니다.
// 3. index가 10인 날짜부터(11일) 확인하는 for문을 작성
index가 9일때 10일째이므로 11일 부터 날짜들이라고 명시했습니다. (index는 0부터 시작)
// 3-1. 현재 날짜까지 할인 품목을 모두 살 수 있는 경우를 확인
10일째 까지는 현재 날짜에 대한 값만 저장했으므로 회원권을 끊어도 괜찮은 지 확인하는 코드를 작성했습니다.
// 3-2. 만약 현재 index가 가장 끝에 있는 날짜인 경우 아래의 작업을 수행하지 않음
index가 가장 끝에 있는 날짜인 경우, 마지막 날을 넘어섰기 때문에 더 이상 아래의 작업을 수행하지 않아도 됩니다.
// 3-2-1. 날짜 중 가장 앞 쪽에 판매되는 물건의 수치를 한 개 줄임(사지 못하므로)
int x값을 이용해 날짜가 지날 수록 +1을 해줘서 관리했습니다.
// 3-2-1. 현재 날짜에 판매되는 물건을 추가(살 물건)
// 바나나 3개, 사과 2개, 쌀 2개, 돼지고기 2개, 냄비 1개
// 14일간 아래 상품 할인
// 3일째에 구매하는 경우
// 1 - 치킨, 2 - 사과, 3 - 사과(1), 4 - 바나나(1), 5 - 쌀(1)
// 6 - 사과(2), 7 - 돼지고기(1), 8 - 바나나(2), 9 - 돼지고기(2), 10 - 쌀(2)
// 11 - 냄비(1), 12 - 바나나(3), 13 - 사과, 14 - 바나나
// = 총 3가지(3, 4, 5일에 회원제 구매 가능)
import java.io.*;
import java.util.*;
class Solution {
public int solution(String[] want, int[] number, String[] discount) {
int answer = 0;
Map<String, Integer> map = new HashMap<String, Integer>();
Map<String, Integer> map2 = new HashMap<String, Integer>();
// 1. map, map2 초기화
for(int i=0; i<want.length; i++) {
map.put(want[i], number[i]);
map2.put(want[i], 0);
}
// 2. 최초 10일간의 할인 목록 정보 map2에 담기
for(int i=0; i<10; i++) { // number 길이는 10, discount의 최소길이 10 이므로 가능
String s = discount[i];
if(map2.containsKey(s)) {
map2.replace(s, map2.get(s) + 1);
}
}
int x = 0;
// 3. index가 10인 날짜부터(11일) 확인하는 for문을 작성
for(int i=10; i<=discount.length; i++) {
// 3-1. 현재 날짜까지 할인 품목을 모두 살 수 있는 경우를 확인
boolean isTrue = false;
for(int j=0; j<want.length; j++) {
if(map.get(want[j]) == map2.get(want[j])) {
isTrue = true;
} else {
isTrue = false;
break;
}
}
if(isTrue) {
answer++;
}
// for(int k=0; k<want.length; k++) {
// System.out.print(map2.get(want[k])+" ");
// }
// System.out.println();
// 3-2. 만약 현재 index가 가장 끝에 있는 날짜인 경우 아래의 작업을 수행하지 않음
if(i==discount.length) break;
String s1 = discount[x];
String s2 = discount[i];
// 3-2-1. 날짜 중 가장 앞 쪽에 판매되는 물건의 수치를 한 개 줄임(사지 못하므로)
if(map2.containsKey(s1)) {
map2.replace(s1, map2.get(s1) - 1);
}
// 3-2-1. 현재 날짜에 판매되는 물건을 추가(살 물건)
if(map2.containsKey(s2)) {
map2.replace(s2, map2.get(s2) + 1);
}
x++;
}
return answer;
}
}
위의 출력문의 주석을 풀어보면 아래와 같이 테스트가 잘 동작하는 것을 볼 수 있습니다.
2번. 카펫
https://school.programmers.co.kr/learn/courses/30/lessons/42842
식을 만들기 위해 테스트케이스 1번에 대해 생각해보았습니다.
yellow의 x, y에 대해서 (안 쪽의 사각형)
1. xy = 2 (yellow넓이)
2. (x+2)*(y+2)= 12 (겉 넓이)
2번 식을 전개해 보면 xy + 2x + 2y + 4 = 12
2(x+y) = 6, x+y = 3
제한사항에 카펫의 가로 길이(x) >= 세로길이(y)가 나와있으므로
현재 값은 x = 2, y = 1이 됩니다.
그런데 이 때 yellow에 대해 x, y이므로 각각 +2를 해주면 정답인 (4, 3)이 나오게 됩니다.
이걸 코드로 풀어보면 아래와 같이 풀 수 있습니다.
class Solution {
public int[] solution(int brown, int yellow) {
int[] answer = new int[2];
for(int y=1; y<2000000; y++) {
if(yellow+(y*y) == y*((brown-4)/2)) {
answer[1] = y + 2;
answer[0] = yellow/y + 2;
break;
}
}
return answer;
}
}
+ 비기너 문제
1번.
https://school.programmers.co.kr/learn/courses/30/lessons/12930
2번.
https://school.programmers.co.kr/learn/courses/30/lessons/12947
+ 챌린저 문제
1번.
https://school.programmers.co.kr/learn/courses/30/lessons/118669
2번.
https://school.programmers.co.kr/learn/courses/30/lessons/92343
'항해99 > 99club1기TIL' 카테고리의 다른 글
[99club/TIL] 2주차 - 토요일 TIL(Today I Learned) (0) | 2024.04.06 |
---|---|
[99club/TIL] 2주차 - 금요일 TIL(Today I Learned) (0) | 2024.04.05 |
[99club/TIL] 2주차 - 수요일 TIL(Today I Learned) (0) | 2024.04.03 |
[99club/TIL] 2주차 - 화요일 TIL(Today I Learned) (0) | 2024.04.02 |
[99club/TIL] 2주차 - 월요일 TIL(Today I Learned) (0) | 2024.04.01 |