반응형

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

 

프로그래머스

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

programmers.co.kr

 

문제 설명
프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.

또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.

먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.

제한 사항

작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.
작업 진도는 100 미만의 자연수입니다.
작업 속도는 100 이하의 자연수입니다.
배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.

 

입출력 예 #1
첫 번째 기능은 93% 완료되어 있고 하루에 1%씩 작업이 가능하므로 7일간 작업 후 배포가 가능합니다.
두 번째 기능은 30%가 완료되어 있고 하루에 30%씩 작업이 가능하므로 3일간 작업 후 배포가 가능합니다. 하지만 이전 첫 번째 기능이 아직 완성된 상태가 아니기 때문에 첫 번째 기능이 배포되는 7일째 배포됩니다.
세 번째 기능은 55%가 완료되어 있고 하루에 5%씩 작업이 가능하므로 9일간 작업 후 배포가 가능합니다.

따라서 7일째에 2개의 기능, 9일째에 1개의 기능이 배포됩니다.

입출력 예 #2
모든 기능이 하루에 1%씩 작업이 가능하므로, 작업이 끝나기까지 남은 일수는 각각 5일, 10일, 1일, 1일, 20일, 1일입니다. 어떤 기능이 먼저 완성되었더라도 앞에 있는 모든 기능이 완성되지 않으면 배포가 불가능합니다.

따라서 5일째에 1개의 기능, 10일째에 3개의 기능, 20일째에 2개의 기능이 배포됩니다.

 

 


Key Point

- Queue에 배포할 수 있는 날짜를 넣는 게 좋다. 처음에는 배열 그대로 Queue에 넣고 poll하면서 계산하려고 했는데, 반복되는 것이 너무 많아서 사공이 배로 갔다..

앞으로 큐 문제가 있으면, 큐에 넣는 값을 먼저 조정하는 것부터 해야겠다.

 

import java.util.*;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        // 0. 초기환경 셋팅
        Queue<Integer> q = new LinkedList<>();
        ArrayList<Integer> list = new ArrayList<>();
        
        for(int i = 0; i < progresses.length; i++) {
            // 배포되는 날짜 계산
            // 100 - progresses / speeds 나머지가 0이면 몫이 배포 날짜, 아니면 몫 + 1
            if((100 - progresses[i]) % speeds[i] == 0) {
                q.offer((100 - progresses[i]) / speeds[i]);
            }
            else {
                q.offer(((100 - progresses[i]) / speeds[i]) + 1 );
            }
        }
        
        int x = q.poll();
        int count = 1;
        while(!q.isEmpty()) {
            // x > q.peek는 앞에 있는 프로세스가 더 오래 걸릴 경우
            if(x >= q.peek()){
                count++;    // 개수 증가
                q.poll();
            }
            else {
                list.add(count);
                count = 1;
                x = q.poll();
            }
        }
        list.add(count);
        
        return list.stream().mapToInt(Integer::intValue).toArray();
    }
}

 


레퍼런스

https://velog.io/@kimmjieun/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EA%B8%B0%EB%8A%A5%EA%B0%9C%EB%B0%9C

 

[프로그래머스] 기능개발 - Java, 자바

레벨 2https://programmers.co.kr/learn/courses/30/lessons/42586스택/큐 유형에 속한 문제지만 그 유형으로 해결할 방법이 떠오르지 않아 배열로 문제를 해결했다. 문제 풀이 순서1\. 작업일 수 배열(works)을 구

velog.io

 

반응형
반응형

 

8. 응급실

설명

메디컬 병원 응급실에는 의사가 한 명밖에 없습니다.

응급실은 환자가 도착한 순서대로 진료를 합니다. 하지만 위험도가 높은 환자는 빨리 응급조치를 의사가 해야 합니다.

이런 문제를 보완하기 위해 응급실은 다음과 같은 방법으로 환자의 진료순서를 정합니다.

• 환자가 접수한 순서대로의 목록에서 제일 앞에 있는 환자목록을 꺼냅니다.

• 나머지 대기 목록에서 꺼낸 환자 보다 위험도가 높은 환자가 존재하면 대기목록 제일 뒤로 다시 넣습니다. 그렇지 않으면 진료를 받습니다.

즉 대기목록에 자기 보다 위험도가 높은 환자가 없을 때 자신이 진료를 받는 구조입니다.

현재 N명의 환자가 대기목록에 있습니다.

N명의 대기목록 순서의 환자 위험도가 주어지면, 대기목록상의 M번째 환자는 몇 번째로 진료를 받는지 출력하는 프로그램을 작성하세요.

대기목록상의 M번째는 대기목록의 제일 처음 환자를 0번째로 간주하여 표현한 것입니다.

입력

첫 줄에 자연수 N(5<=N<=100)과 M(0<=M<N) 주어집니다.

두 번째 줄에 접수한 순서대로 환자의 위험도(50<=위험도<=100)가 주어집니다.

위험도는 값이 높을 수록 더 위험하다는 뜻입니다. 같은 값의 위험도가 존재할 수 있습니다.

출력

M번째 환자의 몇 번째로 진료받는지 출력하세요.

예시 입력 1 

5 2
60 50 70 80 90

예시 출력 1

3

예시 입력 2 

6 3
70 60 90 60 60 60

예시 출력 2

4

 


접근방법

 

Queue를 활용하여 풀 건데, 이전과는 다르게 큐에 값을 하나만 넣는 것이 아니라 두 개를 넣어야 한다는 문제가 있다.

보통, 큐나 스택을 설명하면 아래의 그림처럼 하나의 필드만을 얘기하는데, 두 필드를 활용하려면 어떻게 해야 할까?

 

 

바로, 객체를 생성하여 큐에 객체의 주소를 집어넣는 것이다.

이렇게 하면, 주어진 m과 id가 같을 때의 값을 출력하면 된다.

 

import java.util.*;

class Person{
	int id;
	int priority;
	public Person(int id, int priority) {
		this.id = id;
		this.priority = priority;
	}
}

class Main{
	
	public int solution(int n, int m, int[] arr) {
		int answer = 0;
		Queue<Person> Q = new LinkedList<>();
		for(int i = 0; i < n; i++) {
			Q.offer(new Person(i, arr[i]));
		}
		
		while(!Q.isEmpty()) {
			Person tmp = Q.poll();
			for(Person x : Q) {
				if(x.priority > tmp.priority) {
					Q.offer(tmp);
					tmp = null;
					break;
				}
			}
			if(tmp!=null) {
				answer++;
				if(tmp.id == m)	return answer;
			}
			
		}
		
		return answer;
	}
	
	public static void main(String args[]) {
		
		Main T = new Main();
		
		Scanner sc = new Scanner(System.in);

		int n = sc.nextInt();
		int m = sc.nextInt();
		int[] arr = new int[n];
		for(int i = 0; i < n; i++)	arr[i] = sc.nextInt();
		System.out.println(T.solution(n, m, arr));
		
	}		
}
반응형
반응형

설명

오름차순으로 정렬이 된 두 배열이 주어지면 두 배열을 오름차순으로 합쳐 출력하는 프로그램을 작성하세요.

입력

첫 번째 줄에 첫 번째 배열의 크기 N(1<=N<=100)이 주어집니다.

두 번째 줄에 N개의 배열 원소가 오름차순으로 주어집니다.

세 번째 줄에 두 번째 배열의 크기 M(1<=M<=100)이 주어집니다.

네 번째 줄에 M개의 배열 원소가 오름차순으로 주어집니다.

각 리스트의 원소는 int형 변수의 크기를 넘지 않습니다.

출력

오름차순으로 정렬된 배열을 출력합니다.

예시 입력 1 

3
1 3 5
5
2 3 6 7 9

예시 출력 1

1 2 3 3 5 6 7 9

 


접근 방법

우선, 출력값을 보니 중복을 허용하는 것을 알 수 있다. 그렇다면 Collection 프레임워크의 sort 메소드를 사용한다 해도, set은 안되겠다고 생각했다. 그래서 list를 활용하거나, 단순 구현을 통해 해결 할 수 있다고 생각했다.

 

1. 단순 구현 (two pointer)

 

import java.util.*;

class Main{
	
	public ArrayList<Integer> solution(int N, int M, int[] arr1, int[] arr2) {
		
		ArrayList<Integer> answer = new ArrayList<>();
		int p1 = 0;
		int p2 = 0;
		
		while(p1 < arr1.length && p2 < arr2.length) {
			if(arr1[p1] < arr2[p2]) answer.add(arr1[p1++]);
			else answer.add(arr2[p2++]);
		}
		while(p1 < arr1.length) answer.add(arr1[p1++]);
		while(p2 < arr2.length) answer.add(arr2[p2++]); 
		
		return answer;
	}
	
	public static void main(String args[]) {
		
		Scanner sc = new Scanner(System.in);
		Main T = new Main();

		int N = sc.nextInt();
		int[] arr1 = new int[N];
		
		for(int i = 0; i < N; i++) {
			arr1[i] = sc.nextInt();
		}
		
		int M = sc.nextInt();
		int[] arr2 = new int[M];
		
		for(int i = 0; i < M; i++) {
			arr2[i] = sc.nextInt();
		}
		System.out.println(T.solution(N, M, arr1, arr2));
	}		
}

 

 

2. sort를 활용한 방법

import java.util.*;
import java.io.*;
public class Main {
    static int N, M;

    public static void main(String args[]) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter((System.out)));

        LinkedList<Integer> list = new LinkedList<>();

        StringTokenizer st = new StringTokenizer(br.readLine());

        N = Integer.parseInt(st.nextToken());
        String []str = br.readLine().split(" ");

        for (int i = 0; i < N; i++) {
            list.add(Integer.parseInt(str[i]));
        }

        st = new StringTokenizer(br.readLine());
        M = Integer.parseInt(st.nextToken());
        String[] str1 = br.readLine().split(" ");
        for (int i = 0; i < M; i++) {
            list.add(Integer.parseInt(str1[i]));
        }

        Collections.sort(list);

        for (int x : list) {
            System.out.print(x + " ");
        }
    }
}

 

강의에 나온대로 풀이를 풀어도 되고, 두번째 방법은 백준 스타일로 문제를 풀어봤다.

이렇게 유연하게 대처할 수 있어야 실제 코테에서는 잘 해결할 수 있으니까..!!

물론, 대부분의 기업이 프로그래머스에서 시험을 치기 때문에, 직접 입력값과 출력값을 넘기는 부분까지는 하지 않아도 된다. 그래도 손코딩 하다보면 더 잘 이해가 되는 경향이 있으니까, 귀찮아도 반복 또 반복하는 게 좋다.


이 글의 문제는 인프런 강의에서 참고하였습니다.

 

https://www.inflearn.com/course/%EC%9E%90%EB%B0%94-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4-%EC%BD%94%ED%85%8C%EB%8C%80%EB%B9%84/dashboard

 

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 강의 - 인프런

자바(Java)로 코딩테스트를 준비하시는 분을 위한 강좌입니다. 코딩테스트에서 가장 많이 출제되는 Top 10 Topic을 다루고 있습니다. 주제와 연동하여 기초문제부터 중급문제까지 단계적으로 구성

www.inflearn.com

 

반응형
반응형

 

설명

학급 회장을 뽑는데 후보로 기호 A, B, C, D, E 후보가 등록을 했습니다.

투표용지에는 반 학생들이 자기가 선택한 후보의 기호(알파벳)가 쓰여져 있으며 선생님은 그 기호를 발표하고 있습니다.

선생님의 발표가 끝난 후 어떤 기호의 후보가 학급 회장이 되었는지 출력하는 프로그램을 작성하세요.

반드시 한 명의 학급회장이 선출되도록 투표결과가 나왔다고 가정합니다.

 

입력

첫 줄에는 반 학생수 N(5<=N<=50)이 주어집니다.

두 번째 줄에 N개의 투표용지에 쓰여져 있던 각 후보의 기호가 선생님이 발표한 순서대로 문자열로 입력됩니다.

 

출력

학급 회장으로 선택된 기호를 출력합니다.

예시 입력 1 

15
BACBACCACCBDEDE

 

예시 출력 1

C

 


 

접근 방법

우선, 입출력 될 값들을 구분한다.

입력 : n (HashMap key의 개수), str(HashMap key의 값)

출력 : HashMap의 value 중에서 가장 큰 값(max)

 

 

import java.util.*;
 
class Main{
	public char solution(int n, String s) {
		char answer = ' ';
		HashMap<Character, Integer> map = new HashMap<>();
		for(char x : s.toCharArray()) {
			map.put(x, map.getOrDefault(x, 0) + 1);
		}
		int max = Integer.MIN_VALUE;
		for(char key : map.keySet()) {
			if(map.get(key) > max) {
				max = map.get(key);
				answer = key;
			}
		}
		return answer;
	}
	public static void main(String args[]) {
		
		Scanner sc = new Scanner(System.in);
		Main T = new Main();
		int k = sc.nextInt();
		String str = sc.next();
		System.out.println(T.solution(k, str));
	}		
}

 


HashMap에 대한 간단한 분석

해쉬맵은, 자바의 Map 인터페이스의 구현체 중 하나이다. 그래서 Map의 특성인 key : value 특성을 그대로 가지고 온다.

 

위 그림과 같이 HashMap은 내부에 키와 값을 저장하는 자료 구조를 가지고 있다. 해시 함수를 통해 키와 값이 저장되는 위치를 결정하므로, 그 위치를 알 수 없고 삽입되는 순서와 들어 있는 위치 또한 관계가 없다.

(삽입한 순서에 따라 정렬되지 않는다.)

 

알고리즘 문제를 풀 때, HashMap 자료구조를 사용하며 자주 사용되는 함수들이 몇 가지 있다. 간단하게 정리해보자.

get(), getOrDefault(), keySet()

 

get() 함수

get()함수는 매개변수(괄호안에)의 value 값을 찾아서 출력한다.

 

HashMap<Character, Integer> map = new HashMap<>();
map.put('A', 1);
map.put('B', 2);
map.put('C', 3);
map.put('D', 4);
map.put('E', 5);

System.out.print(map.get('A'));
System.out.print(map.get('B'));
System.out.print(map.get('C'));
System.out.print(map.get('D'));
System.out.print(map.get('E'));

// 12345 출력

 

getOrDefault()함수

이 함수는 알고리즘을 풀 때 빈도가 높은 함수니까 잘 봐두는 것을 권장한다. 

getOrDefault는 HashMap의 key가 있으면 그  키의 value를 가져오고, key가 없으면 무엇을 반환할지 사용자가 설정할 수 있다.

HashMap<Character, Integer> map = new HashMap<>();
for(char x : s.toCharArray()) {
    map.put(x, map.getOrDefault(x, 0) + 1);	//key가 있으면 value를 반환하고, 없으면 0을 반환한다. 그리고 + 1 을 하여 카운팅
}

for(char key : map.keySet()) {
    System.out.println(key + " " + map.get(key));
}

// 아래와 같은 값 출력
A 3
B 3
C 5
D 2
E 2

 

여기서, getOrDefault(x, 0) + 2 를 한다면, value의 값들이 1씩 증가해서 나올 것이다.

또한, getOrDefault(x, 1) + 1 를 한다면, key값이 없을 때 0이 아닌 1을 반환하여 나온다.

 

keySet() 함수

keySet() 함수는 HashMap에 저장되어 있는 key 값을 출력해준다.

HashMap<Character, Integer> map = new HashMap<>();
    
map.put('A', 1);
map.put('B', 2);
map.put('C', 3);
map.put('D', 4);
map.put('E', 5);

for(char key : map.keySet()) {
    System.out.print(key + " ");
}

// A B C D E 출력

 

 

 


이 글의 문제는 인프런 강의에서, HashMap에 대한 분석은 아래 블로그에서 참고하였습니다.

 

https://www.inflearn.com/course/%EC%9E%90%EB%B0%94-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4-%EC%BD%94%ED%85%8C%EB%8C%80%EB%B9%84/dashboard

 

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 강의 - 인프런

자바(Java)로 코딩테스트를 준비하시는 분을 위한 강좌입니다. 코딩테스트에서 가장 많이 출제되는 Top 10 Topic을 다루고 있습니다. 주제와 연동하여 기초문제부터 중급문제까지 단계적으로 구성

www.inflearn.com

https://lordofkangs.tistory.com/78

 

[자료구조] HashMap 파헤치기 1 (Linked List + Red Black Tree)

나는 HashMap이 잘 이해되지 않았다. 인덱스가 없으니 배열이나 List에 비해 확실히 더 어렵고 직관적으로 이해하기가 힘들었다. 그래서 오늘 HashMap 자료구조가 어떤 원리로 돌아가는지 파헤쳐볼까

lordofkangs.tistory.com

https://velog.io/@db_jam/Java-%ED%95%B4%EC%8B%9C%EB%A7%B5HashMap-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%A0%95%EB%A6%AC

 

[Java] 해시맵(HashMap) 자료구조 정리

해시맵은 이름 그대로 해싱(Hashing)된 맵(Map)이다. 해싱을 사용하기 때문에 많은 양의 데이터를 검색하는 데 있어서 뛰어난 성능을 보인다.

velog.io

 

반응형
반응형

 

전자공학을 전공하다가 프로그래밍에 흥미를 느끼게 된 나.. 근데, 생각보다 실력이 늘지 않아서 작심삼일을 거듭했다. 

그 유명한 김영한 선생님의 인프런 강의도 결국 80%를 채우고 손을 놓았는데.. 음... 역시 국비교육을 들으면서 개인 프로젝트 + 취준 (원서 73개 냈음)을 병행하는 건 무리였다. 결국 2023 하반기 취업에 성공을 못했다.

 

서류 합격을 했으나 코테 합격률은 0%.... 코테 보면 항상 0솔 하거나, 겨우 1솔~ 2솔에 머무는 수준이었다. 내가 좀 심각하구나..를 느끼며, 개인 프로젝트와 코테를 병행해야겠다고 생각했고, 비교적 난이도가 쉬운 홍팍시리즈를 선택하게 됐다.

 

내돈 내산이며, 이 책을 기점으로 꼭 취업할 수 있길 바란다!!

 

화이팅~~

 

https://www.yes24.com/Product/Goods/119952151

 

코딩 자율학습 스프링 부트 3 자바 백엔드 개발 입문 - 예스24

스프링 부트 백엔드 개발,실습 문턱을 낮추고 자신 있게 시작하자!스프링 부트를 처음 접하는 입문자와 이미 공부했지만 부족하다고 느끼는 분들을 위한 책입니다. 게시판을 만들며 클라이언트

www.yes24.com

 

반응형
반응형

자바를 공부하다 보면 헷갈리는 용어가 많은데, 특히 오버로딩(Overloading)과 오버라이딩(Overriding)이 비슷해서 많이 헷갈린다. 그런데, 사실 둘은 아무 관계 없는 내용이다. 둘의 차이점을 알아보자.

 

  오버로딩(Overloading) 오버라이딩(Overriding)
접근 제어 달라도 됨 같음
반환형 달라도 됨 같음
메서드 이름 같음 같음
매개변수 달라도 됨 같음

 

1. 오버로딩(Overloading)

같은 클래스 내에서 매소드를 확장하기 위한 것. 메소드 명은 같지만, 매개 변수, 반환형 등을 다르게 하여 편리하게 사용 가능하다.

  • 메서드 이름이 같다.
  • 매개 변수, 반환형(return)은 달라도 된다. 
  • 같은 클래스 내에 선언 되어야 한다.
  • 만약 매개 변수의 개수가 같다면 자료형이 달라야 하고, 자료형이 모두 같다면 매개 변수의 개수를 다르게 해야 한다.

코드 예시를 통해 개념을 익혀보자.

class Hello {
    void overL() {
        System.out.println("오버로딩을 위한 메서드");
    }

    void overL(String str){
        System.out.println("매개 변수 타입이 String 이고, 값은 " + str);
    }

    void overL(int k){
        System.out.println("매개 변수 타입이 int 이고, 값은 " + k);
    }

    int overL(int x, int y){
        System.out.println("반환형이 다른 메서드");
        return x;
    }
}


public class HelloJava {
    public static void main(String[] args) {

        Hello ov = new Hello();

        ov.overL();
        ov.overL("오버로딩 예제");
        int num = ov.overL(5, 6);
        System.out.println(num);

    }
}

 

2. 오버라이딩(Overriding)

부모 클래스의 메서드를 자식 클래스에서 메서드를 '재정의'하는 것이다. 

  • 메서드 명, 매개 변수, 반환형, 접근 제어자가 모두 같다.
  • 상속 받은 부모 클래스의 메서드를 재정의 하는 것이다. 다른 클래스의 메서드를 재정의 하는 것이 아니다!
class Animal {
    public void makeSound() {
        System.out.println("동물이 소리를 내고 있습니다.");
    }
}

class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("강아지가 멍멍 소리를 내고 있습니다.");
    }
}

public class HelloJava {
    public static void main(String[] args) {
        Animal animal = new Animal();
        Dog dog = new Dog();

        animal.makeSound(); // "동물이 소리를 내고 있습니다." 출력
        dog.makeSound();    // "강아지가 멍멍 소리를 내고 있습니다." 출력

    }
}

 

반응형
반응형

추상클래스란?

1. 추상 메소드와 완성된 메소드로 구성되어 있는 클래스.
 
2. 추상 메소드(Abstract Method)선언부만 존재하며, 구현부 {}는 존재하지 않는다.
 
3. 만약 main 함수에서 추상 클래스 자료형의 객체를 생성하려면, 상속 클래스를 통해 추상 메소드를 구현(구현부를 작성)을 해야 한다.
 
4. 추상 클래스를 상속받은 클래스는 추상 클래스에 있는 추상 메소드를 구현해줘야한다. 단, 상속 받은 클래스가 추상 클래스일 경우에는 모든 추상 메소드를 구현하지 않아도 된다.

우선 첫 번쨰와 두 번째 정의를 살펴보자.

 

1. 추상 메소드와 완성된 메소드로 구성되어 있는 클래스.

2. 추상 메소드(Abstract Method)는 선언부만 존재하며구현부 {}는 존재하지 않는다.

초록색 네모 안에는 class 앞에 abstract를 사용하여 추상 클래스임을 확인할 수 있다.

빨간색 네모 안에 있는 abstract void move(int x, int y);는 여타 메소드와는 다르게 구현부 {}, 중괄호로 되어 있는 부분이 없다. 이런 메소드를 추상 메소드라고 불리며, 껍데기만 있다고 표현할 수 있다.

검은 네모 안에 있는 메소드는 흔히 볼 수 있는 메소드이다. 선언부에 void stop()이 있고, 구현부에는 값을 출력하는 것을 보이고 있다.

이처럼 추상 클래스는 클래스 내에 추상 메소드, 일반 메소드가 모두 존재할 수 있다. 하지만, 인터페이스는 무조건 추상 메소드만 있어야 한다는 것이 추상 클래스와의 차이점이다.

 

3. 만약 main 함수에서 추상 클래스 자료형의 객체를 생성하려면상속 클래스를 통해 추상 메소드를 구현(구현부를 작성)을 해야 한다.

abstract class Unit {       // 추상 클래스에는 일반 메서드도 포함. 인터페이스는 무조건 추상메서드
    int x, y;
    abstract void move(int x, int y);
    void stop() {/* 현재 위치에 정지 */}
}

class Marine extends Unit {
    void move(int x, int y){
        System.out.println("Marine[ x = " + x + ", y = " + y + "]");
    }
}

class Tank extends Unit {
    void move(int x, int y){
        System.out.println("Tank[ x = " + x + ", y = " + y + "]");
    }
}   

class Dropship extends Unit {
    void move(int x, int y) {
        System.out.println("Dropship[ x = " + x + ", y = " + y + "]");
    }
}

public class Abstract3 {
    public static void main(String args[]){
//      Unit[] group = {new Marine(), new Dropship(), new Tank()}; 아래 세 줄을 한 줄로 줄인 것   // 추상 클래스 객체를 만드는 건 불가능. 왜냐면 추상 클래스에는 추상 메서드가 있을 수 있기 때문. 그래서 상속받은 클래스 형으로 객체를 생성해야 함.
        Unit[] group = new Unit[3];
        group[0] = new Marine();
        group[1] = new Dropship();
        group[2] = new Tank();
    
        group[0].move(100, 200);
        group[1].move(100, 200);
        group[2].move(100, 200);

    }
}

 

우측이 추상 클래스, 좌측이 추상 클래스를 상속받은 Marine, Tank, Dropship 클래스

Unit 이라는 추상 클래스를 상속 받은 Marine, Tank, Dropship 클래스들은 추상 메서드인 abstract void move(int x, int y);를 구현(완성)하고 있는 것을 확인할 수 있다. 만약 Unit 추상 클래스를 상속받은 일반 클래스에서, move 메서드를 구현하지 않았다면 컴파일러에서 에러를 발견하여 빨간 줄이 뜨는 걸 볼 수 있다. 이렇게 추상 매서드를 구현해야 main에서 Unit 객체를 생성할 수 있다.

 

이렇듯, 여러 클래스에 공통적으로 사용될 수 있는 추상 클래스를 바로 작성하거나 기존 클래스의 공통 부분을 뽑아서 추상 클래스를 만들 수 있다.

 

(참고, Marine, Tank, Dropship 객체를 생성하되 참조변수는 Unit 으로 선언할 수 있다. 왜냐하면 상속 받았기 때문!

 

ex) Unit[] group = new Unit[3]; 

Unit[] group = new Marine[3];

Unit[] group = new Tank[3];

Unit[] group = new Dropship[3] ;

 

하지만 Marine 객체를 선언하면 Marine 클래스 내에 있는 메소드와 상속 받은 Unit 클래스 내에 있는 메소드만 사용 가능하다. 나머지도 동일!)

 

4. 추상 클래스를 상속받은 클래스는 추상 클래스에 있는 추상 메소드를 구현해줘야한다. 단, 상속 받은 클래스가 추상 클래스일 경우에는 모든 추상 메소드를 구현하지 않아도 된다.

 

이게 무슨 뜻인지 아래 코드를 보며 이해해보자.

 

좌측이 추상 클래스, 우측이 Marine 클래스

추상 클래스 Unit에는 세 가지의 메서드가 있다.

abstact void move, abstract void fly, void stop.

 

<만약 main 함수에서 추상 클래스 자료형의 객체를 생성하려면상속 클래스를 통해 추상 메소드를 구현(구현부를 작성)을 해야 한다>라는 3번의 정의에 따르면,  현재 Marine 클래스에는 move 메서드는 구현했지만 fly 메서드는 구현하지 않았다. 그래서 빨간 줄이 나오는 것을 볼 수 있다. 

 

하지만, 여기서 Marine 클래스를 추상 클래스로 선언한다면, 굳이 모든 추상 메서드를 구현할 필요가 없어진다.

반응형
반응형

 

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

 

프로그래머스

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

programmers.co.kr


1. 문제 설명

정수 리스트 num_list와 정수 n이 주어질 때, n 번째 원소부터 마지막 원소까지의 모든 원소를 담은 리스트를 return하도록 solution 함수를 완성해주세요.

 

 

2. 접근 방법

  1. answer 배열의 크기가 num_list.length - n + 1 것을 파악한다.
  2. num_list[n-1] 부터 num_list[n], num_list[n+1]의 수를 각각 answer[0], answer[1], answer[2] 이렇게 차례로 넣을 for 문을 만든다.

 

3. 코드

class Solution {
    public int[] solution(int[] num_list, int n) {
        int[] answer = new int[num_list.length - n + 1];
        
        for(int i = 0; i < answer.length; i++){
            answer[i] = num_list[n-1];
            n++;	// n을 1씩 증가시켜서 anser[i+1]에는 num_list[n]이 오도록 한다
        }
        return answer;
    }
}
반응형
반응형

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

 

프로그래머스

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

programmers.co.kr


1. 문제 설명

정수가 담긴 리스트 num_list가 주어집니다. num_list의 홀수만 순서대로 이어 붙인 수와 짝수만 순서대로 이어 붙인 수의 합을 return하도록 solution 함수를 완성해주세요.

 

2. 접근 방법

1) 일단 if문으로 짝수, 홀수 나눠서 새로운 배열에 저장한다. 이떄, num_list에 있는 int 형을 String으로 변환하여 각각 짝수 문자열(even)과 홀수 문자열(odd)에 저장.

 

2) String으로 저장된 값을 Integer.parseInt()로 형변환 하여 두 배열의 합을 구한다.

 

class Solution {
    public int solution(int[] num_list) {
        int answer = 0;
        
        String even = "";
        String odd = "";
        
        for(int i = 0; i < num_list.length; i++){
            if(num_list[i] % 2 == 0){
                even = even + Integer.toString(num_list[i]);	//짝수 입력
            }
            else{
                odd = odd + Integer.toString(num_list[i]);		// 홀수 입력
            }
            
        }
        answer = Integer.parseInt(even) + Integer.parseInt(odd);
        return answer;
    }
}

 

3. 회고

처음에는 Integer 객체를 쓰지 않고 구현하려고 했다.  근데 너무 복잡하게 생각했던 나머지, 그냥 String으로 변환해서 풀기로 했다. 굳이 10의 제곱수를 만들기 위해 2중 for문을 안 만들어도 됐었는데.. 역시 알고리즘 풀 때는 간단하게 생각해야 하는 것 같다.

 

반응형
반응형

--<백준 2562번 :: 최댓값 - JAVA>--


이문제도 굉장히 쉬운 문제이다. 배열과 배열의 인덱스만 이해한다면 1분조차 안걸려서 풀 수 있다.

그러나... 처음 알고리즘을 공부하거나 배열에 익숙하지 않는다면 조금 힘들 수 있다!! 

괜찮다. 지금부터 배우면 되니까.

나도 완벽하지 않은데 누굴 가르치겠냐만은... 같이 공부하는 느낌으로 해보는 거다!

 

 

1. 배열을 사용하면 쉽게 해결!

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        
        Scanner input = new Scanner(System.in);

        int[] array = new int[9];
        int max = 0;
        int index = 0;;

        for(int i = 0; i < array.length; i++){
            array[i] = input.nextInt();
            if(array[i] > max){
                max = array[i];
                index = i;
            }    
        }

        System.out.println(max);
        System.out.println(index + 1);
    }
}

여기서 마지막에 index + 1을 출력한 이유는, 배열의 번호는 0번부터 시작하기 때문이다.

문제의 출력 값을 보면 8번째의 수는 '8'번째의 위치에 있다고 했다. 만약 index를 그대로 출력했다면 7이 나왔을 것이다.

 

알고리즘 공부하는 모두들 화이팅!

반응형

+ Recent posts