자바: 필드와 생성자
자바에서 필드와 생성자는 모두 클래스의 구성 요소들이다. 클래스의 구성요소는 필드, 메소드, 생성자.  필드객체의 고유 데이터, 속성, 객체의 현재 상태 데이터를 저장변수 선언과 비슷하게 생김클래스 필드와 인스턴스 필드로 나뉜다.  - 클래스 필드 : 모든 객체가 공유하는 변수, 프로그램 종료 시 소멸  - 인스턴스 필드 : 객체마다 별도로 가지는 변수, 인스턴스  public class Person {     // 인스턴스 필드    private String name;     private int age;          // 클래스 필드    private static int population = 0; }   생성자객체 생성 시에만 호출하는 특수한 메서드new 연산자가 객체 생성자를 이용해 객체를..
2024.05.22
자바: 배열 관련(Arrays클래스) 메서드 정리
배열(Arrays 클래스) 주요 메서드  toString(배열) : 배열을 문자열로 변한    int[] arr = {1, 2, 3, 4, 5};     String arrString = Arrays.toString(arr);     System.out.println(arrString); // 출력: [1, 2, 3, 4, 5] sort(배열) : 해당 배열을 오름차순 정렬     int[] arr = {3, 1, 4, 2, 5};      Arrays.sort(arr);      System.out.println(Arrays.toString(arr)); // 출력: [1, 2, 3, 4, 5] copyOf(배열, 길이): 배열을 0번째 인덱스부터 지정된 길이만큼 복사하여 반환     int[] arr ..
2024.05.07
자바: 배열을 리스트로 변환하는 방법, 리스트를 배열로 변환하는 방법 모음
배열 ▶ 리스트 ⊙ Arrays.asList() 사용import java.util.Arrays; import java.util.List; public class ArrayToListExample {     public static void main(String[] args) {         // 배열 정의         Integer[] myArray = {1, 2, 3, 4, 5};         // 리스트로 변환         List myList = Arrays.asList(myArray);         System.out.println(myList);  // 출력: [1, 2, 3, 4, 5]     } }  ⊙ int[] 배열을 Integer리스트로 변환할 경우 type이 맞지 않아 원하는..
2024.05.05
자바: StringBuilder 클래스 메서드 정리
StringBuilder 특징변수 선언 시 객체를 생성하며, 문자열을 자주 수정할 때 사용String과 다르게 가변적인 속성을 가져 문자열 수정이 빠르고 효율적임단, 멀티스레드 환경에서는 안전하지 않음크기를 지정하지 않고 객체 생성 시 초기 용량은 16으로 설정됨         String str = "";        StringBuilder sb = new StringBuilder();        str = str + "a";         str = str + "b";         str = str + "c";    // String은 불변 : 문자열 수정할 때마다 새로운 문자열 객체 생성 >> 메모리 부담        sb.append("a");         sb.append("b");   ..
2024.05.04
no image
자바: 아스키코드(ASCII) 유니코드(Unicode) 정리
아스키코드(ASCII)American Standard Code for Information Interchange미국에서 표준호한 정보교환용 7비트 부호체계우리가 사용하는 대부분의 기호들이 할당되어 있음어느 시스템이든 적용 가능       유니코드(Unicode)전 세계 모든 문자를 다루도록 설계된 표준 문자 전산 처리 방식대부분의 문자 포함, 악보기호, 이모지 등의 기호까지 포함해당 글자의 코드 표기 시 U+(16진수 숫자) 로 씀한글에서 Ctrl+f10 눌렀을 때 '유니코드 문자표' 가 있음  ※  인코딩유니코드를 저장, 표현하는 방식.A라는 글자는 유니코드로 65에 배당되어 있는데,이것을 효율적으로 혹은 특정 목적에 따라 거꾸로 표현하거나 8자릿수로 표현하는 등해당 글자를 표현하는 방식에 따라 인코딩..
2024.05.03
자바: 배열을 문자열로 변환하는 방법, 문자열을 배열로 변환하는 방법 모음
배열 ▶ 문자열 문자열(String) 배열 ▶ 문자열  1. toString() 메서드 사용         String[] arr = {"Hello", " ", "Java", " ", "study"};         String arrToStr  = Arrays.toString(arr);         System.out.println(arrToStr);         // 출력: [Hello,  , Java,  , study]      2. join() 메서드 사용         String[] arr = {"Hello", " ", "Java", " ", "study"};         String arrToStr = String.join("",arr);         System.out.println..
2024.05.01
자바 스캐너(Scanner) 메서드 정리
Scanner 클래스사용자 입력을 받을 때, 보다 간편하게 받을 수 있도록 제공된 클래스java.util 패키지에 포함되어 있어 import java.util.Scanner 필요토큰 기준으로 데이터를 입력받음※ 토큰(T..
2024.04.30
자바 배열 내용 출력하는 방법 (2가지)
배열 내용 출력하는 방법배열은 단순 System.out.println으로 출력 시 아래와 같이 원하는 값으로 출력되지 않는다.         int[] arr = {0, 1, 2, 4, 3};                  System.out.println(arr);         // 출력: [I@b4c966a  따라서 배열의 요소들을 확인하고 싶을 경우 다른 추가적인 방법을 사용해야 하는데, 배열 내용을 출력하는 방법 중 가장 많이 사용되는 것은 2가지가 있다.  반복문을 이용한 출력for문, while문 등을 통해 배열의 인덱스 하나 하나 들어가 요솟값을 출력한다.형변환을 이용한 출력Arrays 메서드인 toString()를 사용하여 문자형으로 형변환하여 출력한다.   1. 반복문을 이용한 출력 ..
2024.04.29
no image
프로그래머스: 큰 수 만들기 (자바, Java)
[프로그래머스] 큰 수 만들기 (Lv.2)https://school.programmers.co.kr/learn/courses/30/lessons/42883  문제어떤 숫자에서 k개의 수를 제거했을 때 얻을 수 있는 가장 큰 숫자를 구하려 한다.예를 들어, 숫자 1924에서 수 두 개를 제거하면 [19, 12, 14, 92, 94, 24] 를 만들 수 있으며, 이 중 가장 큰 숫자는 94이다.문자열 형식으로 숫자 number와 제거할 수의 개수 k가 solution 함수의 매개변수로 주어진다.  number에서 k 개의 수를 제거했을 때 만들 수 있는 수 중 가장 큰 숫자를 문자열 형태로 return 하도록 solution 함수를 완성하라.   나의 답안(오답)내가 생각한 구조는 다음과 같다.  가장 큰 ..
2024.04.28
프로그래머스: 구명보트 (자바, Java)
[프로그래머스] 구명보트 (Lv.2)https://school.programmers.co.kr/learn/courses/30/lessons/42885  문제사람들을 구명보트를 이용하여 구출하려고 한다. 구명보트는 한 번에 최대 2명까지만 탈 수 있고, 무게 제한도 있다.예를 들어, 사람들의 몸무게가 [70kg, 50kg, 80kg, 50kg]이고 구명보트의 무게 제한이 100kg이라면 2번째 사람과 4번째 사람은 같이 탈 수 있지만 1번째 사람과 3번째 사람의 무게의 합은 150kg이므로 구명보트의 무게 제한을 초과하여 같이 탈 수 없다.구명보트를 최대한 적게 사용하여 모든 사람을 구출하려 하며, 사람들의 몸무게를 담은 배열 people과 구명보트의 무게 제한 limit가 매개변수로 주어질 때, 모든 사..
2024.04.27

자바: 필드와 생성자

친환경 개발자
|2024. 5. 22. 22:18

자바에서 필드와 생성자는 모두 클래스의 구성 요소들이다.

 

클래스의 구성요소는 필드, 메소드, 생성자.

 

 

필드

  • 객체의 고유 데이터, 속성, 객체의 현재 상태 데이터를 저장
  • 변수 선언과 비슷하게 생김
  • 클래스 필드와 인스턴스 필드로 나뉜다.
      - 클래스 필드 : 모든 객체가 공유하는 변수, 프로그램 종료 시 소멸
      - 인스턴스 필드 : 객체마다 별도로 가지는 변수, 인스턴스

 

 

public class Person {
    // 인스턴스 필드
    private String name;
    private int age;
    
    // 클래스 필드
    private static int population = 0;
}

 

 

생성자

  • 객체 생성 시에만 호출하는 특수한 메서드
  • new 연산자가 객체 생성자를 이용해 객체를 생성
  • 클래스의 이름과 동일
  • 반환형 없음

 

public class Person {
    private String name;
    private int age;
    
    // 기본 생성자
    public Person1() {
        this.name = "Unknown";
        this.age = 0;
    }

    // 매개변수가 있는 생성자
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // getter 메서드
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }

    public static void main(String[] args) {
        // 기본 생성자를 사용하여 객체 생성
        Person person1 = new Person();
        System.out.println(person1.getName()); // 출력: Unknown
        System.out.println(person1.getAge());  // 출력: 0

        // 매개변수가 있는 생성자를 사용하여 객체 생성
        Person person2 = new Person("Alice", 30);
        System.out.println(person2.getName()); // 출력: Alice
        System.out.println(person2.getAge());  // 출력: 30

 

 

 

 

생성자 오버로딩

생성자는 같은 이름으로 여러 개를 생성할 수 있어 유연성 높임

받는 매개변수의 수를 조절해서 사용

 

public class Person {
    private String name;
    private int age;
    
    // 기본 생성자
    public Person() {
        this.name = "Unknown";
        this.age = 0;
    }

    // 매개변수가 1개인 생성자
    public Person(String name) {
        this.name = name;
        this.age = 0;
    }

    // 매개변수가 2개인 생성자
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // getter 메서드
    public String getName() {
        return name;
    }

    public static void main(String[] args) {
        // 각 생성자를 사용해 객체 생성
        Person person1 = new Person();
        Person person2 = new Person("Park");
        Person person3 = new Person("Lee", 20);

        System.out.println(person1.getName());    // 출력 : Unknown
        System.out.println(person2.getName());    // 출력 : Park
        System.out.println(person3.getName());    // 출력 : Lee
    }
}

 

 

배열(Arrays 클래스) 주요 메서드

 

 

  • toString(배열) : 배열을 문자열로 변한

        int[] arr = {1, 2, 3, 4, 5};
        String arrString = Arrays.toString(arr);
        System.out.println(arrString); // 출력: [1, 2, 3, 4, 5]


  • sort(배열) : 해당 배열을 오름차순 정렬

         int[] arr = {3, 1, 4, 2, 5};
         Arrays.sort(arr);
         System.out.println(Arrays.toString(arr)); // 출력: [1, 2, 3, 4, 5]


  • copyOf(배열, 길이): 배열을 0번째 인덱스부터 지정된 길이만큼 복사하여 반환

         int[] arr = {1, 2, 3, 4, 5};
         int[] copyArr = Arrays.copyOf(arr, 3);
         System.out.println(Arrays.toString(copyArr)); // 출력: [1, 2, 3]

  • copyOfRange(배열, 시작인덱스, 끝인덱스): 배열의 시작인덱스부터 끝인덱스(미포함)를 복사하여 반환

         int[] arr = {1, 2, 3, 4, 5};
         int[] copyArr = Arrays.copyOfRange(arr, 2, 5);
         System.out.println(Arrays.toString(copyArr)); // 출력: [3, 4, 5]


  • equals(): 두 배열의 길이와 요소가 모두 같은 경우에만 true 반환

         int[] arr1 = {1, 2, 3};
         int[] arr2 = {1, 2, 3};
         boolean isEqual = Arrays.equals(arr1, arr2);
         System.out.println("Arrays are equal: " + isEqual); // 출력: Arrays are equal: true


  • deepEquals(): 다차원 배열에서 두 요소가 모두 동일한 경우에만 ture 반환

         int[][] arr1 = {{1, 2}, {3, 4}};
         int[][] arr2 = {{1, 2}, {3, 4}};
         boolean isEqual = Arrays.deepEquals(arr1, arr2);
         System.out.println("Arrays are equal: " + isEqual); // 출력: Arrays are equal: true

배열 ▶ 리스트

 

⊙ Arrays.asList() 사용

import java.util.Arrays;
import java.util.List;

public class ArrayToListExample {
    public static void main(String[] args) {
        // 배열 정의
        Integer[] myArray = {1, 2, 3, 4, 5};

        // 리스트로 변환
        List<Integer> myList = Arrays.asList(myArray);

        System.out.println(myList);  // 출력: [1, 2, 3, 4, 5]
    }
}

 

 

 int[] 배열을 Integer리스트로 변환할 경우 type이 맞지 않아 원하는 변환을 할 수 없다.

    이 경우에는 반복문을 통해 일일이 값을 넣어주거나 Stream을 사용해야 한다.

 

    1) 반복문 사용

        // int 배열 정의
        int[] intArray = {1, 2, 3, 4, 5};

        // Integer 리스트로 변환
        List integerList = new ArrayList<>();
        for (int num : intArray) {
            integerList.add(num);  // 박싱(boxing)
        }

        System.out.println(integerList);  // 출력: [1, 2, 3, 4, 5]

 

    2) Stream 사용

        // int 배열 정의
        int[] intArray = {1, 2, 3, 4, 5};

        // Integer 리스트로 변환
        List<Integer> integerList = Arrays.stream(intArray)  // int 배열을 스트림으로 변환
                                          .boxed()          // int를 Integer로 박싱(boxing)
                                          .collect(Collectors.toList());  // 리스트로 수집

        System.out.println(integerList);  // 출력: [1, 2, 3, 4, 5]

 

 

 

 

리스트 ▶ 배열

 

⊙ toArray() 사용

       // 리스트 정의
        List<Integer> myList = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));

        // 배열로 변환
        Integer[] myArray = myList.toArray(new Integer[0]);

        for (Integer num : myArray) {
            System.print(num + " ");  // 출력: 1 2 3 4 5
        }

StringBuilder 특징

  • 변수 선언 시 객체를 생성하며, 문자열을 자주 수정할 때 사용
  • String과 다르게 가변적인 속성을 가져 문자열 수정이 빠르고 효율적임
  • 단, 멀티스레드 환경에서는 안전하지 않음
  • 크기를 지정하지 않고 객체 생성 시 초기 용량은 16으로 설정됨

 

        String str = "";
        StringBuilder sb = new StringBuilder();

        str = str + "a";
        str = str + "b";
        str = str + "c";    // String은 불변 : 문자열 수정할 때마다 새로운 문자열 객체 생성 >> 메모리 부담

        sb.append("a");
        sb.append("b");
        sb.append("c");    // StringBuilder은 가변 : 문자열 수정 시 기존 객체를 수정 >> 메모리 사용 효율적

 

 

 

 

StringBuilder 주요 메서드

  • append(문자열) : 문자열 추가

         StringBuilder sb = new StringBuilder();
         sb.append("Hello");
         sb.append(" ");
         sb.append("world");
         String result = sb.toString();      // result = "Hello world"


  • insert(인덱스, 문자열) :지정한 위치에 문자열 삽입

         StringBuilder sb = new StringBuilder("Hello");
         sb.insert(5, " world");       // " world"를 인덱스 5에 삽입
         String result = sb.toString(); // result = "Hello world"


  • deleteCharAt(인덱스): 지정된 인덱스의 문자 삭제

         StringBuilder sb = new StringBuilder("Hello world");
         sb.deleteCharAt(5);       // ' ' 문자 삭제
         String result = sb.toString();      // result = "Helloworld"


  • replace(시작인덱스, 끝인덱스, 문자열): 시작위치부터 끝 이전까지의 문자열을 대체

         StringBuilder sb = new StringBuilder("Hello world");
         sb.replace(6, 11, "Java");       // 인덱스 6부터 11 이전까지의 문자열을 "Java"로 대체
         String result = sb.toString();      // result = "Hello Java"


  • reverse(): 문자열을 역순으로 뒤집음

         StringBuilder sb = new StringBuilder("Hello");
         sb.reverse();      // 문자열을 역순으로 변경
         String result = sb.toString();       // result = "olleH"


  • length(): 현재 StringBuilder의 길이를 반환

         StringBuilder sb = new StringBuilder("Hello world");
         sb.replace(6, 11, "Java");      // 인덱스 6부터 11 이전까지의 문자열을 "Java"로 대체
         String result = sb.toString();      // result = "Hello Java"


  • indexOf(문자열): 지정된 문자열이 처음으로 등장하는 인덱스 반환

         StringBuilder sb = new StringBuilder("Hello world");
         int index = sb.indexOf("world");       // index = 6

 

아스키코드(ASCII)

  • American Standard Code for Information Interchange
  • 미국에서 표준호한 정보교환용 7비트 부호체계
  • 우리가 사용하는 대부분의 기호들이 할당되어 있음
  • 어느 시스템이든 적용 가능

A = 065

 

 

 

 

 

 

 

유니코드(Unicode)

  • 전 세계 모든 문자를 다루도록 설계된 표준 문자 전산 처리 방식
  • 대부분의 문자 포함, 악보기호, 이모지 등의 기호까지 포함
  • 해당 글자의 코드 표기 시 U+(16진수 숫자) 로 씀
  • 한글에서 Ctrl+f10 눌렀을 때 '유니코드 문자표' 가 있음

 

 

※  인코딩

유니코드를 저장, 표현하는 방식.

A라는 글자는 유니코드로 65에 배당되어 있는데,

이것을 효율적으로 혹은 특정 목적에 따라 거꾸로 표현하거나 8자릿수로 표현하는 등

해당 글자를 표현하는 방식에 따라 인코딩 종류가 달라진다.

배열 ▶ 문자열

 

문자열(String) 배열 ▶ 문자열

  1. toString() 메서드 사용

 

        String[] arr = {"Hello", " ", "Java", " ", "study"};
        String arrToStr  = Arrays.toString(arr);

        System.out.println(arrToStr);
        // 출력: [Hello,  , Java,  , study]

 

 

 

 

  2. join() 메서드 사용

 

        String[] arr = {"Hello", " ", "Java", " ", "study"};
        String arrToStr = String.join("",arr);

        System.out.println(arrToStr);
        // 출력: Hello Java study

 

 

 

 

문자(char) 배열 ▶ 문자열

  1. String.valueOf() 메서드 사용

 

        char[] charArr = {'H', 'e', 'l', 'l', 'o'};
        String arrToStr = String.valueOf(charArr);

        System.out.println(arrToStr);
        // 출력: Hello

 

 

 

  2. new String()

 

        char[] charArr = {'H', 'e', 'l', 'l', 'o'};
        String arrToStr = new String(charArr);

        System.out.println(arrToStr);
        // 출력: Hello

 

 

 

 

 

 

배열 ▶ 문자열

1. toCharArray() 메서드 사용: 문자열(String) 배열을 문자(char)배열로 변환함

        String str = "developer";
        char[] strToArr = str.toCharArray();    // 문자 배열(char[])

        System.out.println(Arrays.toString(strToArr));   // 배열 출력 시 내용을 보기 위해 Arrays.toString() 사용
        // 출력: [d, e, v, e, l, o, p, e, r]

 

 

 

2. split(구분자) 메서드 사용: 문자열을 지정한 구분자 (쉼표, 따옴표 등)를 기준으로 나누어 배열에 담음

 

        String str = "apple,banana,grape";
        String[] strToArr = str.split(",");    // 문자열 배열(String[])

        System.out.println(Arrays.toString(strToArr));
        // 출력: [apple, banana, grape]

자바 스캐너(Scanner) 메서드 정리

친환경 개발자
|2024. 4. 30. 20:10

Scanner 클래스

  • 사용자 입력을 받을 때, 보다 간편하게 받을 수 있도록 제공된 클래스
  • java.util 패키지에 포함되어 있어 import java.util.Scanner 필요
  • 토큰 기준으로 데이터를 입력받음

※ 토큰(Token) : 한 단어, 탭, 개행 등으로 구분되는 하나의 덩어리

 

 

 

스캐너 클래스 사용

 

▶ 임포트하기


  Scanner 객체 및 입력변수 생성

 

  메서드 이용하여 입력받기

    import java.util.Scanner; 

    System.out.print("문자열을 입력하세요 :");
    Scanner sc = new Scanner(System.in);
    System.out.print("입력한 문자열 : " + sc);
         // 출력 : 문자열을 입력하세요 : Geun
                      입력한 문자열 : Geun

 

 

스캐너 메서드 종류

  • next()  : String을 읽으며, 토큰 기준으로 읽음
  • nextLine() : 한 줄을 읽음. 개행(\n) 이전까지만 읽어들임

  • nextInt() : int를 읽음

  • nextBoolean() : boolean을 읽음

  • nextByte() : byte타입으로 읽음

  • nextShort() : Short타입으로 읽음

  • nextLong() : Long타입으로 읽음

  • nextFloat() : Float 타입으로 읽음

  • nextDouble() : Double 타입으로 읽음

  • hasNext() : 입력이 들어올 때까지 기다렸다가 입력 시 true 반환, 강제 종료 시 false 반환

  • hasNextLine() : 다음 입력받을 Line이 있는지 확인

 

Scanner sc = new Scanner(System.in);

                byte a = sc.nextByte();       
                short b = sc.nextShort();    
                int c = sc.nextInt();        
                long d = sc.nextLong();    
                float e = sc.nextFloat();     
                double f = sc.nextDouble();   
                boolean g = sc.nextBoolean(); 
                String h = sc.next();    
                String i = sc.nextLine();  

                //출력문
                System.out.println(a);
                System.out.println(b);
                System.out.println(c);
                System.out.println(d);
                System.out.println(e);
                System.out.println(f);
                System.out.println(g);
                System.out.println(h);
                System.out.println(i);

배열 내용 출력하는 방법

배열은 단순 System.out.println으로 출력 시 아래와 같이 원하는 값으로 출력되지 않는다.

 

        int[] arr = {0, 1, 2, 4, 3};
        
        System.out.println(arr);
        // 출력: [I@b4c966a

 

 

따라서 배열의 요소들을 확인하고 싶을 경우

 

다른 추가적인 방법을 사용해야 하는데,

 

배열 내용을 출력하는 방법 중 가장 많이 사용되는 것은 2가지가 있다.

 

 

  1. 반복문을 이용한 출력
    for문, while문 등을 통해 배열의 인덱스 하나 하나 들어가 요솟값을 출력한다.

  2. 형변환을 이용한 출력
    Arrays 메서드인 toString()를 사용하여 문자형으로 형변환하여 출력한다.

 

 

 

1. 반복문을 이용한 출력

 

for문, while문 등 반복문을 통해 각 인덱스 값에 들어가 그 값을 하나씩 출력하는 방식이다.

 

       int[] arr = {0, 1, 2, 4, 3};

        for(int i=0; i<arr.length; i++) {
            System.out.print(arr[i]+" ");
        }    // 출력: 0 1 2 4 3
        
        
        int i = 0;
        while (i<arr.length) {
            System.out.print(arr[i++]+" ");
        }  // 출력: 0 1 2 4 3

 

 

 

 

 

 

 

2.  형변환을 이용한 출력

 

Arrays.toString(배열) 형식의 메서드를 사용하면, 간편하고 아름답게(?) 출력이 가능하다.

 

다만 Arrays 메서드이므로 import java.util.Arrays 해주어야 함.

 

        int[] arr = {0, 1, 2, 4, 3};

        System.out.println(Arrays.toString(arr));
        //출력: [0, 1, 2, 4, 3]

[프로그래머스] 큰 수 만들기 (Lv.2)

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

 

 

문제

어떤 숫자에서 k개의 수를 제거했을 때 얻을 수 있는 가장 큰 숫자를 구하려 한다.
예를 들어, 숫자 1924에서 수 두 개를 제거하면 [19, 12, 14, 92, 94, 24] 를 만들 수 있으며, 이 중 가장 큰 숫자는 94이다.
문자열 형식으로 숫자 number와 제거할 수의 개수 k가 solution 함수의 매개변수로 주어진다.  number에서 k 개의 수를 제거했을 때 만들 수 있는 수 중 가장 큰 숫자를 문자열 형태로 return 하도록 solution 함수를 완성하라.

 

 

 

나의 답안(오답)

내가 생각한 구조는 다음과 같다.

 

 

  1. 가장 큰 수가 되기 위해, 주어진 수의 맨 앞에서 k+1번째까지 숫자 중 가장 큰 수가 가장 앞에 놓여야 한다.
  2. 가장 앞에 놓일 수가 정해지고 나면, 그 뒤부턴 그 다음 자리의 숫자와 비교하여 더 작을 경우 하나씩 제거한다.
  3. k개만큼 제거되면 남은 숫자가 답이 된다!

 

 

이를 코딩으로 짜보았으나, 테스트케이스는 통과됐으나 오답으로 처리되었다.

다시 확인해보니 예외가 많았다.

 

다른 풀이법을 찾아보니, 굳이 k+1번째 자리에서 가장 큰 수를 찾을 필요 없이, 맨 앞자리부터 다음 숫자와 비교하여 더 작을 경우, 하나씩 제거해나가면 되는 문제였다..

 

 

<오답입니다>

class Solution {
    public String solution(String number, int k) {
        char[] num_char = number.toCharArray();
        char[] answer = new char[number.length()-k];
        int count = 0;
        answer[0] = num_char[0];

        for (int i=1; i<=k; i++) {
            if (answer[0] <num_char[i]) {
                answer[0] = num_char[i];
                count++;
            }
        }

        int j = 1;
        for (int i=count+1; i<num_char.length; i++) {
            if (count < k) {
                if (i != num_char.length-1 && num_char[i] < num_char[i+1]) {
                    count++;
                } else {
                    answer[j] = num_char[i];
                    j++;
                }
            } else {
                answer[j] = num_char[i];
                j++;
            }
        }

        return String.valueOf(answer);
    }
}

 

모범 답안

  1. 스택 타입의 변수 생성
  2. 다음 자리의 수와 비교하며 현재 숫자가 더 작을 경우 stack에서 제거 후 k값 1 감소
  3. k가 0이 되면 result값을 문자열로 변환하여 반환
import java.util.Stack;

class Solution {
    public String solution(String number, int k) {
        char[] result = new char[number.length() - k];
        Stack<Character> stack = new Stack<>();

        for (int i=0; i<number.length(); i++) {
            char c = number.charAt(i);
            while (!stack.isEmpty() && stack.peek() < c && k-- > 0) {
                stack.pop();
            }
            stack.push(c);
        }
        for (int i=0; i<result.length; i++) {
            result[i] = stack.get(i);
        }
        return new String(result);
    }
}

 

 

<테스트10 통과 X>
class Solution {

    public String solution(String number, int k) {
        StringBuilder sb = new StringBuilder(number);
        for (int i = 0; i+1 < sb.length() && k>0; i++) {
            if(sb.charAt(i) < sb.charAt(i+1)) {
                sb.deleteCharAt(i);
                i=-1;
                k--;
            }
        }
        if(k!=0)
            sb.delete(sb.length()-k, sb.length());
        return sb.toString();
    }
}

 

 

 

그냥 앞에서부터 1개씩 비교해가면 되는 것이었는데 굳이 어렵게 생각하여 풀지 못했다.

 

stack 타입을 이용하여 숫자를 앞에서부터 비교한다는 점이 포인트이다.

 

이런건 대체 어떻게 생각해내는 건지 참 신기하다.

 

나도 언젠간 이렇게 될 수 있겠지..?

 

 

 

 

 

 

복습

1. 문자열 -> 문자배열 : toCharArray()

String str = "abcde"
char[] arr = str.toCharArray();

for (char a: arr ) {
    System.out.println(a);
}     // 출력: a b c d e


2. 문자배열 > 문자열: String.valueOf(객체) / new String(객체)

String str = "abcde";
char[] arr = str.toCharArray();
String result = new String(arr);

System.out.println(String.valueOf(arr));
System.out.println(result);
    // 출력: abcde abcde

 

프로그래머스: 구명보트 (자바, Java)

친환경 개발자
|2024. 4. 27. 22:12

[프로그래머스] 구명보트 (Lv.2)

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

 

 

문제

사람들을 구명보트를 이용하여 구출하려고 한다. 구명보트는 한 번에 최대 2명까지만 탈 수 있고, 무게 제한도 있다.
예를 들어, 사람들의 몸무게가 [70kg, 50kg, 80kg, 50kg]이고 구명보트의 무게 제한이 100kg이라면 2번째 사람과 4번째 사람은 같이 탈 수 있지만 1번째 사람과 3번째 사람의 무게의 합은 150kg이므로 구명보트의 무게 제한을 초과하여 같이 탈 수 없다.


구명보트를 최대한 적게 사용하여 모든 사람을 구출하려 하며, 사람들의 몸무게를 담은 배열 people과 구명보트의 무게 제한 limit가 매개변수로 주어질 때, 모든 사람을 구출하기 위해 필요한 구명보트 개수의 최솟값을 return 하도록 solution 함수를 작성하라

 

 

 

나의 답안(오답)

문제를 풀 때 최대 인원 제한이 2명이라는 것을 미처 생각지 못했다...

 

최대한 limit에 딱 맞게 태우면 최소한으로 배를 사용할 수 있겠다는 생각에

각 인덱스값에 limit을 나눠보기도 하고, 더했을 때 limit에 딱 맞는 사람 먼저 태워 보내는 것 등

여러 알고리즘을 생각해 봤지만 딱 맞는 알고리즘을 생각해내지 못했다.

 

그래서 오름차순으로 정렬 후 가벼운 사람들 먼저 태우자는 생각을 하여

코드를 작성했지만 답이 계속 틀렸고,

 

뒤늦게 인원제한이 있다는 것을 깨닫고 코드를 다시 짰다 ㅠㅠ

 

  1.  오름차순으로 정렬
  2. 무게 제한에서 해당 인덱스 무게를 빼가며 무게제한을 초과하지 않을 때까지 연산
  3. 무게제한 초과 시 count변수에 1을 더함
  4. 마지막 인원까지 태워 count+1을 return

 

 

<오답입니다>

import java.util.Arrays;

class Solution {
    public int solution(int[] people, int limit) {
        int count = 0;        
        int limitcheck = limit;
        
        Arrays.sort(people);
        
        for (int i=0; i<people.length; i++) {
            if (limitcheck - people[i] >= 0) {
                limitcheck -= people[i];
            } else if (limitcheck - people[i] < 0) {
                count++;
                limitcheck = limit;
                
                
        }
        
        return count+1;
    }
}

 

 

모범 답안

  1. 오름차순 정렬
  2. 좌우 동시 비교를 위한 인덱스 변수(i, j) 생성
  3. 가장 무거운 사람과 가벼운 사람의 합이 limit을 넘지 않으면 2명을 태우고(++i), 넘을 경우 무거운 사람만 태움
import java.util.Arrays;

class Solution {
    public int solution(int[] people, int limit) {
        Arrays.sort(people);

        int i = 0, j = people.length - 1;
        for (; i < j; --j) {
            if (people[i] + people[j] <= limit)
                ++i;
        }
        return people.length - i;
    }
}

 

  • 따로 count변수를 생성하지 않고 people.length-i로 값을 return한 것이 인상적이다.
    전부 1명씩만 태우면 people.length만큼 태웠을 것이고, 2명을 태웠다면 그 수만큼 i값을 올려 굳이 변수를 선언하지 않아도 결과값을 리턴할 수가 있는 것이다. 

 

 

 

복습

      for문의 예외형식

1. 초기값 생략 가능

int i=0;
for ( ; i<5; i++) {
    System.out.println(i);
}     // 출력: 0 1 2 3 4

 


2. 초기, 증감 생략 가능

int i=0;
for ( ; i<5; ) {
    System.out.println(i);
    i++;
}     // 출력: 0 1 2 3 4

 

 

3. 초기, 증감 여러 개 포함 가능

for (int i=0, j=0; i+j<6; i++, j+=2) {
    System.out.println(i+j);
}     // 출력: 0 3