- 진행
일자 | 완료 번호 |
24.07.16 | 1~20 |
24.07.17 | 21~35 |
24.07.18 | 36~42 |
24.07.19 | 43~47 |
24.07.22 | 48~50 |
24.07.23 | 51~55 |
- 회고
51. 푸드파이터 대회 : https://school.programmers.co.kr/learn/courses/30/lessons/134240
- 풀이
// 성능 : 메모리: 97.5 MB, 시간: 31.65 ms
class Solution {
public String solution(int[] food) {
String answer = "";
// 왼쪽사람
for(int i = 1; i < food.length; i++){
for(int j = 0; j < food[i] / 2; j++){
answer += i;
}
}
// 물추가
answer += 0;
// 오른쪽 사람
for(int i = food.length - 1; i >= 1; i--){
for(int j = 0; j < food[i] / 2; j++){
answer += i;
}
}
return answer;
}
}
- 이중 포문 사용으로 비효율적이란 생각이 들었다.
- 다시 생각한 코드
// 성능 : 메모리: 97.1 MB, 시간: 23.34 ms
class Solution {
public String solution(int[] food) {
// 정답 문자열의 길이 구하기
int length = 0;
for(int n : food) {
length += n / 2;
}
length = length * 2 + 1;
// 정답 문자열 배열 생성
String[] arr = new String[length];
// while문 내부 변수 선언
int l = 0;
int r = length - 1;
int i = 1;
int j = 0;
while(length / 2 > l) {
if(food[i] < 2) {
i++;
}else {
arr[l] = Integer.toString(i);
arr[r] = Integer.toString(i);
j++;
l++;
r--;
if(j >= food[i] / 2) {
j = 0;
i++;
}
}
}
// 가운데 추가하기
arr[length / 2] = "0";
// 정답 출력
String answer = "";
for(String s : arr) {
answer += s;
}
return answer;
}
}
- 이중 for문을 while문으로 개선
- 처음 코드에서 문자열 생성시 사용하는 "+="
※ 위 코드에서 StringBuilder을 사용하게 되면 성능이 [ 메모리: 79.9 MB, 시간: 2.71 ms] 다음과 같이 엄청 개선된다.
- Stirng과 StringBuilder의 성능차이 이유
54. 2016년 : https://school.programmers.co.kr/learn/courses/30/lessons/12901
- 풀이
import java.util.*;
class Solution {
public String solution(int a, int b) {
String answer = week(day(a,b));
return answer;
}
public static int day(int a, int b) {
int day = 0;
if(a == 1) {
return b;
}else {
for(int i = 1; i < a; i++) {
if(i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12) {
day += 31;
}else if(i == 4 || i == 6 || i == 9 || i == 11) {
day += 30;
}else {
day += 29;
}
}
day += b;
}return day;
}
public static String week(int d) {
Map<Integer, String> wek = new HashMap<>();
wek.put(1, "FRI");
wek.put(2, "SAT");
wek.put(3, "SUN");
wek.put(4, "MON");
wek.put(5, "TUE");
wek.put(6, "WED");
wek.put(0, "THU");
return wek.get(d % 7);
}
}
- 총 일수를 구하는 day 함수 구현
- map을 통해 요일을 구하는 week 함수 구현
- 개선
class Solution {
public String solution(int a, int b) {
int[] year = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
String[] week = {"THU", "FRI", "SAT", "SUN", "MON", "TUE", "WED"};
int day = 0;
for(int i = 0; i < a - 1; i++){
day += year[i];
}
day += b;
String answer = week[(day % 7)] ;
return answer;
}
}
- 각 월마다의 일수와 요일 모두 인덱스가 정해져있다고 보면 되기 때문에 위와같이 풀 수 있다.
55. 카드뭉치 : https://school.programmers.co.kr/learn/courses/30/lessons/159994
- 풀이
class Solution {
public String solution(String[] cards1, String[] cards2, String[] goal) {
String answer = "Yes";
int c1 = 0;
int c2 = 0;
for(int i = 0; i < goal.length; i++) {
if(goal[i].equals(cards1[c1])) {
if(c1 < cards1.length - 1){
c1++;
}
}else if(goal[i].equals(cards2[c2])) {
if(c2 < cards2.length - 1){
c2++;
}
}else {
return "No";
}
}
return answer;
}
}
- goal배열을 순회하며 card1뭉치와 card2뭉치의 인덱스를 각각 선언하여 찾아가는 과정
- 처음 했을 때 OutOfBounds 에러가 발생하여 급조하여 아래 if문 추가
if(c1 < cards1.length - 1)
- 정답은 맞췄으나 if문이 저렇게 있을 이유가 없다고 생각하여 && 연산자를 통해 아래와같이 수정
f(goal[i].equals(cards1[c1]) && (c1 < cards1.length))
- 수정하니 다시 OutOfBounds 에러 발생
- 조건문도 순서가 중요하다는 사실을 학습함
'Java & Spring > 코딩테스트' 카테고리의 다른 글
9일차 - 알고리즘 코드카타 (0) | 2024.07.25 |
---|---|
8일차 - 알고리즘 코드카타 (0) | 2024.07.24 |
6일차 - 알고리즘 코드카타 (0) | 2024.07.22 |
5일차 - 알고리즘 코드카타 (0) | 2024.07.19 |
4일차 - 알고리즘 코드카타 (0) | 2024.07.18 |