7일차 - 알고리즘 코드카타

2024. 7. 23. 11:05·Java & Spring/코딩테스트

- 진행

일자 완료 번호
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

 

프로그래머스

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

programmers.co.kr

- 풀이

// 성능 : 메모리: 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;
    }
}
  1. 이중 포문 사용으로 비효율적이란 생각이 들었다.

- 다시 생각한 코드

// 성능 : 메모리: 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;
    }
}
  1. 이중 for문을 while문으로 개선
  2. 처음 코드에서 문자열 생성시 사용하는 "+="

※ 위 코드에서 StringBuilder을 사용하게 되면 성능이 [ 메모리: 79.9 MB, 시간: 2.71 ms] 다음과 같이 엄청 개선된다.

- Stirng과 StringBuilder의 성능차이 이유

 

54. 2016년 : https://school.programmers.co.kr/learn/courses/30/lessons/12901

 

프로그래머스

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

programmers.co.kr

- 풀이

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);
	}
}
  1. 총 일수를 구하는 day 함수 구현
  2. 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;
    }
}
  1. 각 월마다의 일수와 요일 모두 인덱스가 정해져있다고 보면 되기 때문에 위와같이 풀 수 있다.

55. 카드뭉치 : https://school.programmers.co.kr/learn/courses/30/lessons/159994

 

프로그래머스

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

programmers.co.kr

- 풀이

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;
    }
}
  1. goal배열을 순회하며 card1뭉치와 card2뭉치의 인덱스를 각각 선언하여 찾아가는 과정
  2. 처음 했을 때 OutOfBounds 에러가 발생하여 급조하여 아래 if문 추가
    if(c1 < cards1.length - 1)


  3. 정답은 맞췄으나 if문이 저렇게 있을 이유가 없다고 생각하여 && 연산자를 통해 아래와같이 수정
    f(goal[i].equals(cards1[c1]) && (c1 < cards1.length))


  4. 수정하니 다시 OutOfBounds 에러 발생
  5. 조건문도 순서가 중요하다는 사실을 학습함

 

 

'Java & Spring > 코딩테스트' 카테고리의 다른 글

9일차 - 알고리즘 코드카타  (0) 2024.07.25
8일차 - 알고리즘 코드카타  (1) 2024.07.24
6일차 - 알고리즘 코드카타  (1) 2024.07.22
5일차 - 알고리즘 코드카타  (1) 2024.07.19
4일차 - 알고리즘 코드카타  (0) 2024.07.18
'Java & Spring/코딩테스트' 카테고리의 다른 글
  • 9일차 - 알고리즘 코드카타
  • 8일차 - 알고리즘 코드카타
  • 6일차 - 알고리즘 코드카타
  • 5일차 - 알고리즘 코드카타
DJ.Kang
DJ.Kang
백엔드 개발 기록 블로그
  • DJ.Kang
    DJ Hello World
    DJ.Kang
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 이론공부
        • 개념
        • 정보처리기사 필기
        • 정보처리기사 실기 기출
        • 네트워크관리사 2급
        • SQLD
      • 시스템설계
      • Java & Spring
        • TIL
        • 트러블슈팅
        • 고도화
        • 알고리즘
        • 코딩테스트
        • Java
        • Spring
        • Thymeleaf
      • 프로젝트
        • coin-trading
        • 트러블슈팅
      • Docker
      • 웹
      • git & github
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Java this
    java 메서드
    데이터 크기
    프로그래머스 java 기초트레이닝
    Java 생성자
    개발로드맵
    java 유클리드 호제법
    java super
    자료구조
    프로그래머스 java 기초 트레이닝
    java enhance switch
    데이터 타입
    java arrays.copyofrnage()
    java 제어자
    java 멤버
    java기초
    java 에라토스테네스의 체
    java two-pointer
    java 세수의합
    java
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
DJ.Kang
7일차 - 알고리즘 코드카타
상단으로

티스토리툴바