프로그래머스 풀이: 폰켓몬 (자바, Java)
[프로그래머스] Level 1 폰켓몬 문제 박사님은 당신에게 자신의 연구실에 있는 총 N 마리의 폰켓몬 중에서 N/2마리를 가져가도 좋다고 했습니다. 홍 박사님 연구실의 폰켓몬은 종류에 따라 번호를 붙여 구분합니다. 따라서 같은 종류의 폰켓몬은 같은 번호를 가지고 있습니다. 예를 들어 연구실에 총 4마리의 폰켓몬이 있고, 각 폰켓몬의 종류 번호가 [3번, 1번, 2번, 3번]이라면 이는 3번 폰켓몬 두 마리, 1번 폰켓몬 한 마리, 2번 폰켓몬 한 마리가 있음을 나타냅니다. 이때, 4마리의 폰켓몬 중 2마리를 고르는 방법은 다음과 같이 6가지가 있습니다. 첫 번째(3번), 두 번째(1번) 폰켓몬을 선택 첫 번째(3번), 세 번째(2번) 폰켓몬을 선택 첫 번째(3번), 네 번째(3번) 폰켓몬을 선택 두 번..
2024.04.07
프로그래머스 풀이: 주사위게임3 (자바, Java)
[프로그래머스] Level 0 주사위게임3 너무 어려웠다. 오랜 시간 머리를 쥐어짰지만 아직은 역부족인가보다. 결국 노가다에 가까운 코드를 만들어 억지로 정답을 맞췄다... 문제 1부터 6까지 숫자가 적힌 네 주사위를 굴렸을 때 나온 숫자에 따라 다음과 같은 점수를 얻는다. 네 주사위에서 나온 숫자가 모두 p로 같다면 1111 × p점 세 주사위에서 나온 숫자가 p로 같고 나머지 다른 주사위에서 나온 숫자가 q(p ≠ q)라면 (10 × p + q)2 점 주사위가 두 개씩 같은 값이 나오고, 나온 숫자를 각각 p, q(p ≠ q)라고 한다면 (p + q) × |p - q|점 어느 두 주사위에서 나온 숫자가 p로 같고 나머지 두 주사위에서 나온 숫자가 각각 p와 다른 q, r(q ≠ r)이라면 q × r점..
2024.04.05
자바 replace, replaceAll 차이점
자바 문제를 풀 때, 문자값을 변경할 때 사용하는 대표적인 메서드가 바로 replace와 replaceAll이다. 주의깊게 생각하지 않고 값 변경 시 replace, replaceAll 모두 사용하다가, 둘 다 사용 시 결과값이 비슷하여 문득 차이가 무엇인지 궁금해졌다. replace()와 replaceAll() 사용법 둘 다 원하는 문자값을 다른 문자값으로 대체하는 기능을 한다. 메서드 사용법은 아래와 같다. String.replace(CharSequence target, CharSequence replacement) String.replaceAll(String regex, String replacement) 해당 문자열에서 바꾸고자 하는 문자나 문자열과 일치하는 모든 부분을 수정해준다. String ..
2024.04.04
프로그래머스 문제: 옹알이 (자바, Java)
[프로그래머스] Level 0 옹알이 Level 0 중 가장 정답률이 낮길래 풀어봤다. 문제 태어난 지 6개월밖에 되지 않은 조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음을 최대 한 번씩 사용해 이어 붙인 발음밖에 하지 못 한다고 한다. 문자열 배열 babbling이 매개변수로 주어질 때, 조카가 발음할 수 있는 단어의 개수를 return하도록 메서드를 완성하라 나의 답안 class Solution { public int solution(String[] babbling) { int answer = 0; String[] canSay = {"aya", "ye", "woo", "ma"}; String str; for (int i = 0; i
2024.04.03
프로그래머스 문제: 홀짝에 따라 다른 값 반환하기 (자바, Java)
[프로그래머스] Level 0 홀짝에 따라 다른 값 반환하기 머리가 잘 안돌아가서 복잡하게 풀었는데, 다른 분들의 풀이를 보니 훨씬 간단하게 풀었더군요 .. 문제 양의 정수 n이 매개변수로 주어지고, n이 홀수이면 n 이하의 홀수인 모든 양의 정수의 합을 반환하고, n이 짝수면 n 이하의 짝수인 모든 양의 정수의 제곱의 합을 반환하는 메서드를 작성하라. 나의 답안 class Solution { public int solution(int n) { int oddSum = 0; int evenSum = 0; if (n % 2 == 1) { for (int i=1; i
2024.04.01
no image
자바 삼항연산자 사용법
삼항연산자란 if조건문과 유사한 기능을 하는 연산자로, 코드를 간결하게 표현할 수 있다는 장점이 있음 그러나 복잡한 로직 속에서는 오히려 가독성을 해칠 수 있으므로 유의해야함. 자바 삼항연산자 구조 조건문이 참일 경우 표현식1이 실행되고, 거짓일 경우 표현식2가 실행된다. 사용 예시 [프로그래머스 문제] 자연수 n이 입력으로 주어졌을 때 만약 n이 짝수이면 "n is even"을, 홀수이면 "n is odd"를 출력하는 코드를 작성 - 삼항연산자 사용 import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.next..
2024.03.31
자바 String 클래스 메서드 정리
String 클래스란? Java에서 문자열과 관련된 유틸리티 메서드를 모아둔 클래스 String 클래스 메서드 종류 charAt(인덱스): 해당 인덱스에 있는 문자를 반환 length(): 문자열의 길이를 반환 substring(시작인덱스, 끝인덱스): 시작인덱스부터 끝인덱스 직전까지 문자열 반환, 끝인덱스 생략 시 끝까지 반환 equals(객체): 주어진 객체와 문자열이 같은지 비교(true/false) indexOf(정수or문자): 문자열에서 해당 문자가 어느 위치에 있는지 인덱스값 반환(없을 경우 -1 반환) contains(문자열): 해당 문자열이 포함되어 있는지 확인(true/false) toLowerCase() / toUpperCase(): 문자열을 소문자/ 대문자로 변환 trim(): 문자열..
2024.03.30
no image
자바 Character 클래스 : 소문자 혹은 대문자로 변경하는 메서드?
Character 클래스란? Character 클래스는 Java에서 문자값과 관련된 유틸리티 메서드를 모아둔 클래스 Character 클래스 메서드 종류 isUpperCase(ch) : 문자 ch 값이 대문자인지 확인(true/false) isLowerCase(ch) : 문자 ch 값이 소문자인지 확인(true/false) isLetter(ch) : 문자 ch 값이 문자인지 확인(true/false) isDigit(ch) : 문자 ch 값이 숫자인지 확인(true/false) isWhitespace(ch) : 문자 ch 값이 공백인지 확인(true/false) isDefined(ch) : 문자 ch가 유니코드인지 확인(true/false) toUpperCase(ch) : 문자 ch 값을 대문자로 변환하여..
2024.03.26
no image
자바 나눗셈 소수점 자리까지 나타내는 방법
백준이나 프로그래머스 등 자바 프로그래밍 관련 문제를 풀 때, 초보자라면 궁금증한 것 중 하나가 바로 나눗셈 소수점 자리까지 값을 얻는 방법에 관한 것이다. 예를들어, 1 / 3 = 0.333333 의 값을 출력하고 싶은데, 자연스럽게 아래의 코드를 입력하면 출력값은 0.0이 나올 뿐이다. int a = 1; int b = 3; double result = a / b; System.out.println(result); // 출력: 0.0 이렇게, result만 실수 타입으로 선언하면 소수점까지 쫙 나올 줄 알았는데, 출력은 0.0 으로 나온다. 결론적으로, 결과가 소수점까지 나오도록 하기 위해서는, 나누어주는 변수 a, b 둘 중 하나라도 실수형 타입이어야만 결과값이 소수점까지 표현이 된다. 따라서 아래..
2024.03.21
자바 제어문 정리 (if문, switch문, while문, for문)
※ 비교연산자 a = b : a와 b가 같다 a != b : a와 b는 같지 않다 ※ and, or, not 연산자 a && b : a, b 모두 참이어야 참 (and) a || b : a, b 중 하나만 참이어도 참 (or) !a : a가 거짓이면 참 (not) ※ break;와 continue; break: 해당 제어문 자체를 빠져나감 (제어문 끝, 다음 문장 수행) continue: 해당 제어문의 조건문으로 돌아감 (제어문 내의 조건문으로 즉, 제어문 처음부터 다시 수행) ■ If 문: 구조 : If - else if - else If (조건문) { ; ; .... } else if (조건문) { ; ; .... } else if (조건문) { ; ; .... } else { ; ; .... } ■..
2024.03.20

[프로그래머스] Level 1 폰켓몬

 

 

 

문제

 박사님은 당신에게 자신의 연구실에 있는 총 N 마리의 폰켓몬 중에서 N/2마리를 가져가도 좋다고 했습니다.
홍 박사님 연구실의 폰켓몬은 종류에 따라 번호를 붙여 구분합니다. 따라서 같은 종류의 폰켓몬은 같은 번호를 가지고 있습니다. 예를 들어 연구실에 총 4마리의 폰켓몬이 있고, 각 폰켓몬의 종류 번호가 [3번, 1번, 2번, 3번]이라면 이는 3번 폰켓몬 두 마리, 1번 폰켓몬 한 마리, 2번 폰켓몬 한 마리가 있음을 나타냅니다. 이때, 4마리의 폰켓몬 중 2마리를 고르는 방법은 다음과 같이 6가지가 있습니다.

 

  • 첫 번째(3번), 두 번째(1번) 폰켓몬을 선택
  • 첫 번째(3번), 세 번째(2번) 폰켓몬을 선택
  • 첫 번째(3번), 네 번째(3번) 폰켓몬을 선택
  • 두 번째(1번), 세 번째(2번) 폰켓몬을 선택
  • 두 번째(1번), 네 번째(3번) 폰켓몬을 선택
  • 세 번째(2번), 네 번째(3번) 폰켓몬을 선택

이때, 첫 번째(3번) 폰켓몬과 네 번째(3번) 폰켓몬을 선택하는 방법은 한 종류(3번 폰켓몬 두 마리)의 폰켓몬만 가질 수 있지만, 다른 방법들은 모두 두 종류의 폰켓몬을 가질 수 있습니다. 따라서 위 예시에서 가질 수 있는 폰켓몬 종류 수의 최댓값은 2가 됩니다.


당신은 최대한 다양한 종류의 폰켓몬을 가지길 원하기 때문에, 최대한 많은 종류의 폰켓몬을 포함해서 N/2마리를 선택하려 합니다. N마리 폰켓몬의 종류 번호가 담긴 배열 nums가 매개변수로 주어질 때, N/2마리의 폰켓몬을 선택하는 방법 중, 가장 많은 종류의 폰켓몬을 선택하는 방법을 찾아, 그때의 폰켓몬 종류 번호의 개수를 return 하는 함수를 완성하세요

 

 

 

 

 

나의 답안

 

리스트를 만들어, 입력받은 배열의 요소들을 중복되는 값을 제외하여 값을 추가하였고,

 

N/2와 리스트 요소의 개수 중 더 작은 값을 반환하도록 작성하였다.

 

 

import java.util.*;

class Solution {
    public int solution(int[] nums) {     
        ArrayList<Integer> types = new ArrayList<>();
        
        for (int i=0; i<nums.length; i++) {            
            if (types.contains(nums[i]) == false) {                
                types.add(nums[i]);
            }
        }
        
        return Math.min(types.size(), nums.length/2);
    }
}

 

 

 

 

다른 유저의 답안

import java.util.HashSet;

class Solution {
    public int solution(int[] nums) {

            HashSet<Integer> hs = new HashSet<>();

            for(int i =0; i<nums.length;i++) {
                hs.add(nums[i]);
            }

            if(hs.size()>nums.length/2)
                return nums.length/2;

            return hs.size();
    }
}
  • 리스트 대신 Set 타입으로 값을 담아, 자동으로 중복을 제외하도록 작성
  • 그래서인지 코드 읽을 때 더 간결해 보임

 

 

HashSet을 많이 사용해보지 않아 Set자료형을 활용할 생각을 못했다.

다음에 중복을 제거해야 할 경우에는 Set자료형을 활용하자!

 

 

복습

  • a.add(요소값) : 해당 리스트에 원하는 요 솟값을 추가함
  • a.size() : 해당 리스트의 요소 개수를 리턴
  • a.contains(요솟값) : 해당 리스트에 해당 요솟값이 있는지 확인
  • 리스트 선언 방법
    1) ArrayList<Integer> a = new ArrrayList<>();
    2) ArrayList<Integer> a = new ArrrayList<>(Arrays.asList(1, 2, 3, 4));

 

[프로그래머스] Level 0 주사위게임3

 

너무 어려웠다.

오랜 시간 머리를 쥐어짰지만 아직은 역부족인가보다.

결국 노가다에 가까운 코드를 만들어

억지로 정답을 맞췄다...

 

 

 

문제

1부터 6까지 숫자가 적힌 네 주사위를 굴렸을 때 나온 숫자에 따라 다음과 같은 점수를 얻는다.

 

  • 네 주사위에서 나온 숫자가 모두 p로 같다면 1111 × p점
  • 세 주사위에서 나온 숫자가 p로 같고 나머지 다른 주사위에서 나온 숫자가 q(p ≠ q)라면 (10 × p + q)2 점
  • 주사위가 두 개씩 같은 값이 나오고, 나온 숫자를 각각 p, q(p ≠ q)라고 한다면 (p + q) × |p - q|점
  • 어느 두 주사위에서 나온 숫자가 p로 같고 나머지 두 주사위에서 나온 숫자가 각각 p와 다른 q, r(q ≠ r)이라면 q × r점
  • 네 주사위에 적힌 숫자가 모두 다르다면 나온 숫자 중 가장 작은 숫자 만큼의 점수를 얻습니다.

네 주사위를 굴렸을 때 나온 숫자가 정수 매개변수 a, b, c, d로 주어질 때, 얻는 점수를 return 하는 메서드를 작성하라

 

 

 

 

 

나의 답안

 

공개하기 부끄럽다...

import java.util.*;

class Solution {
    public int solution(int a, int b, int c, int d) {
        
        int ab = a==b ? 1 : 0;
        int ac = a==c ? 1 : 0;
        int ad = a==d ? 1 : 0;
        int bc = b==c ? 1 : 0;
        int bd = b==d ? 1 : 0;
        int cd = c==d ? 1 : 0;
        String result = ""+ab+ac+ad+bc+bd+cd;
        
        switch (result) {
            case "111111":
                return 1111 * a;
            case "110100":
                return (10 * a + d) * (10 * a + d);
            case "101010":
                return (10 * a + c) * (10 * a + c);
            case "011001":
                return (10 * a + b) * (10 * a + b);
            case "000111":
                return (10 * b + a) * (10 * b + a);
            case "100001":
                return (a + c) * (a - c) > 0 ? (a + c) * (a - c) : (a + c) * (a - c) * -1;
            case "010010":
                return (a + b) * (a - b) > 0 ? (a + b) * (a - b) : (a + b) * (a - b) * -1;
            case "001100":
                return (a + b) * (a - b) > 0 ? (a + b) * (a - b) : (a + b) * (a - b) * -1;
            case "100000":
                return c * d;
            case "010000":
                return b * d;
            case "001000":
                return b * c;
            case "000100":
                return a * d;
            case "000010":
                return a * c;
            case "000001":
                return a * b;
            default:
                ArrayList<Integer> numbers = new ArrayList<>(Arrays.asList(a, b, c, d));
                return Collections.min(numbers);
        }
    }
}
        

 

 

 

다른 유저의 답안

import java.util.Arrays;

class Solution {
    public int solution(int a, int b, int c, int d) {

        int[] dice = { a, b, c, d };
        Arrays.sort(dice);             //배열로 저장 후 오름차순정렬

        int ans = 0;

        if (dice[0] == dice[3]) { 
            ans = 1111 * dice[3];         //4개 모두 같을 때
        } else if (dice[0] == dice[2] || dice[1] == dice[3]) { 
            ans = (int) Math.pow(dice[1] * 10 + (dice[0] + dice[3] - dice[1]), 2);     // 3개만 같을 때
        } else if (dice[0] == dice[1] && dice[2] == dice[3]) {     
            ans = (dice[0] + dice[3]) * (dice[3] - dice[0]);       // 2개씩 같을 때
        } else if (dice[0] == dice[1]) {         
            ans = dice[2] * dice[3];
        } else if (dice[1] == dice[2]) {
            ans = dice[0] * dice[3];
        } else if (dice[2] == dice[3]) {
            ans = dice[0] * dice[1];                // 2개만 같을 때
        } else {
            ans = dice[0];            // 모두 다를 때
        }

        return ans;
    }
}
  • 정렬을 이용하여 케이스를 나누기 용이하게 함
  • 가장 작은 수를 추출하기에도 용이함

 

복습

  • 배열 오름차순 정렬 :  Arrays.sort(배열)
  • 배열 선언과 동시에 값 입력 : int[] arr = {1, 2, 3, 4, 5};

자바 replace, replaceAll 차이점

친환경 개발자
|2024. 4. 4. 17:25

 

 

자바 문제를 풀 때, 문자값을 변경할 때 사용하는 대표적인 메서드가

 

바로 replace와 replaceAll이다. 

 

주의깊게 생각하지 않고 값 변경 시 replace, replaceAll 모두 사용하다가,

 

둘 다 사용 시 결과값이 비슷하여  문득 차이가 무엇인지 궁금해졌다.

 

 

 

 

 

 

 

replace()와 replaceAll() 사용법

둘 다 원하는 문자값을 다른 문자값으로 대체하는 기능을 한다.

 

메서드 사용법은 아래와 같다.

 

  • String.replace(CharSequence target, CharSequence replacement)
  • String.replaceAll(String regex, String replacement)

 

해당 문자열에서 바꾸고자 하는 문자나 문자열과 일치하는 모든 부분을 수정해준다.

 

 

 

<예시>

String str = "apple banana apple orange apple";

// replace 메서드 사용
String replacedStr = str.replace("apple", "grape");
System.out.println("replace 사용: " + replacedStr); // 출력: grape banana grape orange grape

// replaceAll 메서드 사용
String replacedAllStr = str.replaceAll("apple", "grape");
System.out.println("replaceAll 사용: " + replacedAllStr); // 출력: grape banana grape orange grape

 

 

 

 

 

 

replace, replaceAll 차이점

두 메서드 모두 특정 문자열 모두를 원하는 문자열로 변경한다.

 

그러나 입력하는 입력값의 형태가 엄연히 다르다.

 

 

 

replace에서는 단순 문자 혹은 문자 모음을 입력하며,

 

replaceAll에서는 String regex, 즉 정규표현식을 활용하여 활용 범위가 더 넓다고 할 수 있다.

 

 

 

예를 들어, 문자열의 여러 문자를 한 번에 하나의 문자로 대체하고자 하는 경우,

 

replace 메서드를 사용하면 상당히 번거로운데,

 

이 때 replaceAll 메서드로 정규표현식을 활용하여 쉽게 처리할 수 있다.

 

 

<예시>

public class ReplaceExample {
    public static void main(String[] args) {
        String originalString = "Hello! How are you? 123.";

        // 정규 표현식을 사용하여 모든 비알파벳 문자를 제거하는 replaceAll 사용
        String cleanedString = originalString.replaceAll("[^a-zA-Z0-9]", "");

        System.out.println(originalString);    //출력: Hello! How are you? 123.
        System.out.println(cleanedString);   //출력: HelloHowareyou123
    }
}
  • 정규 표현식 [^a-zA-Z0-9]은 소문자 (a-z), 대문자 (A-Z), 숫자 (0-9)가 아닌 문자를 모두 일치시킴
    (^는 문자 클래스 안에서 부정(not)을 의미).

 

 

그렇다고 무조건 replace 메서드 대신 replaceAll 메서드만 사용하는 것은 좋지 않다.

 

replaceAll 메서드의 경우 구현 과정에서 인스턴스를 생성하여

 

replace 메서드에 비해 성능이 떨어질 수 있기 때문이다. 

[프로그래머스] Level 0 옹알이

 

Level 0 중 가장 정답률이 낮길래 풀어봤다.

 

 

문제

태어난 지 6개월밖에 되지 않은 조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음을 최대 한 번씩 사용해 이어 붙인 발음밖에 하지 못 한다고 한다. 문자열 배열 babbling이 매개변수로 주어질 때, 조카가 발음할 수 있는 단어의 개수를 return하도록 메서드를 완성하라

 

 

 

 

 

나의 답안

class Solution {
    public int solution(String[] babbling) {
        int answer = 0;
        String[] canSay = {"aya", "ye", "woo", "ma"};
        String str;

        for (int i = 0; i < babbling.length; i++) {
            str = babbling[i];

            for (int j = 0; j < canSay.length; j++) {

                if (str.length() != 0 && str.contains(canSay[j])) {

                    if (str.equals(babbling[i])) {
                        str = babbling[i].replaceAll(canSay[j], "-");
                    } else {
                        str = str.replaceAll(canSay[j], "-");
                    }
                }
            }

            if (str.replaceAll("-", "").isEmpty()) {
                answer++;
            }
        }

        return answer;
    }
}

 

 

 

 

 

다른 유저의 답안

class Solution {
    public int solution(String[] babbling) {
        int answer = 0;

        for(int i =0; i < babbling.length; i++) {
            babbling[i] = babbling[i].replace("aya", "1");         
            babbling[i] = babbling[i].replace("woo", "1");
            babbling[i] = babbling[i].replace("ye", "1");
            babbling[i] = babbling[i].replace("ma", "1");      //해당하는 문자열이 있으면 1로 변환
                                                                                    //replace → replaceFirst 로 변경해야함!
            babbling[i] = babbling[i].replace("1", "");         //1을 제거
            if(babbling[i].isEmpty()) {      
                answer = answer + 1;
            }
        }

        return answer;
    }
}

 

  • 불필요하게 canSay배열 및 Babbling의 각 항목을 넣기 위한 문자열 변수(str)를 선언하지 않음 (성능, 가독성 ↑)
  • for문을 1번만 사용함
  • 단, "ayaaya"와 같은 중복이 발생해도 카운트가 된다. 따라서 replace() 대신 첫번째 해당문자만 변경해주는 replaceFirst()를 사용해야 한다!

 

복습

  • 배열의 길이 확인 :  arr.length      [괄호 사용 X]
  • 문자열의 일부를 다른 문자로 변환 :  String.replace("기존문자", "바꿀문자")
  • 문자열에 특정 문자가 포함되는지 확인 :  String.contains("문자")
  • 두 값이 같은지 확인 :  "문자".equals("문자")

[프로그래머스] Level 0 홀짝에 따라 다른 값 반환하기

 

머리가 잘 안돌아가서 복잡하게 풀었는데, 다른 분들의 풀이를 보니 훨씬 간단하게 풀었더군요 ..

 

 

문제

양의 정수 n이 매개변수로 주어지고, n이 홀수이면 n 이하의 홀수인 모든 양의 정수의 합을 반환하고, n이 짝수면 n 이하의 짝수인 모든 양의 정수의 제곱의 합을 반환하는 메서드를 작성하라.

 

 

 

 

 

나의 답안

class Solution {
    public int solution(int n) {        
        int oddSum = 0;
        int evenSum = 0;

        if (n % 2 == 1) {
            for (int i=1; i <= n; i++) {
                if (i % 2 != 0) {
                    oddSum += i;
                }
            }
            return oddSum;
        } else {
            for (int i=1; i <= n; i++) {
                if (i % 2 == 0) {
                    evenSum += i*i;
                }
            }
            return evenSum;
        }
    }
}

 

 

 

보완사항

  • sum 값을 불필요하게 oddSum, evenSum으로 나누어 선언할 필요 없이 하나의 변수 sum으로 선언
  • for문에서 i값을 2씩 증가시키기

 

class Solution {
    public int solution(int n) {
        int sum = 0;    // 변수 1개만 생성

        if (n % 2 == 1) {
            for (int i = 1; i <= n; i += 2) {    // i값 2씩 증가
                sum += i;
            }
        } else {
            for (int i = 2; i <= n; i += 2) { 
                sum += i * i; 
            }
        }
        return sum;
    }
}

 

 

자바 삼항연산자 사용법

친환경 개발자
|2024. 3. 31. 23:14

삼항연산자란

if조건문과 유사한 기능을 하는 연산자로, 코드를 간결하게 표현할 수 있다는 장점이 있음

그러나 복잡한 로직 속에서는 오히려 가독성을 해칠 수 있으므로 유의해야함.

 

 

 

자바 삼항연산자 구조

 

 

 

조건문이 참일 경우 표현식1이 실행되고, 거짓일 경우 표현식2가 실행된다.

 

 

 

 

사용 예시

[프로그래머스 문제]

자연수 n이 입력으로 주어졌을 때 만약 n이 짝수이면 "n is even"을, 홀수이면 "n is odd"를 출력하는 코드를 작성

 

 

<모범 답안> - 삼항연산자 사용

import java.util.Scanner;

public class Solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();

        System.out.print(n + " is "+(n % 2 == 0 ? "even" : "odd"));
    }
}

 

 

 

<내 답안> - IF문 사용

import java.util.Scanner;

public class Solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        
        if (n%2 == 0) {
            System.out.printf("%d is even", n);
        } else if (n%2 == 1) {
          System.out.printf("%d is odd", n);  
        }
    }
}

IF문으로 길게 써야하는 내용을 삼항연산자를 통해 한줄로 표현할 수 있다!

 

자바 String 클래스 메서드 정리

친환경 개발자
|2024. 3. 30. 16:10

String 클래스란?

Java에서 문자열과 관련된 유틸리티 메서드를 모아둔 클래스

 

 

 

 

 

String 클래스 메서드 종류

  1. charAt(인덱스): 해당 인덱스에 있는 문자를 반환
  2. length(): 문자열의 길이를 반환
  3. substring(시작인덱스, 끝인덱스): 시작인덱스부터 끝인덱스 직전까지 문자열 반환, 끝인덱스 생략 시 끝까지 반환
  4. equals(객체): 주어진 객체와 문자열이 같은지 비교(true/false)
  5. indexOf(정수or문자): 문자열에서 해당 문자가 어느 위치에 있는지 인덱스값 반환(없을 경우 -1 반환) 
  6. contains(문자열): 해당 문자열이 포함되어 있는지 확인(true/false)
  7. toLowerCase() / toUpperCase(): 문자열을 소문자/ 대문자로 변환
  8. trim(): 문자열의 앞뒤 공백을 제거
  9. split(구분자): 문자열을 해당 구분자로 나누어 배열로 저장
  10. concat(문자열): 문자열을 이어붙임
  11. replace(변경전,변경후): 해당 문자열을 다른 문자열로 수정
  12. startswith(문자열): 해당 문자열로 시작하는지 여부 확인

 

 

 

 

 

관련 문제

 

[프로그래머스 문제]

문자열 my_string, overwrite_string과 정수 s가 주어지고, 문자열 my_string의 인덱스 s부터 overwrite_string의 길이만큼을 문자열 overwrite_string으로 바꾼 문자열을 return 하는 solution 함수를 작성하라

 

 

<모범 답안>

class Solution {
    public String solution(String my_string, String overwrite_string, int s) {
        String before = my_string.substring(0, s);     // 변경할 부분 직전까지의 문자열 추출
        String after = my_string.substring(s + overwrite_string.length());    // 변경할 부분 이후의 문자열 추출
        return before + overwrite_string + after; 
    }
}

 

<내 답안>

class Solution {
    public String solution(String my_string, String overwrite_string, int s) {
        String t = my_string.substring(s, s + overwrite_string.length());
        String answer = my_string.replace(t, overwrite_string);
        return answer;
    }


변경전 문자열에서 바꿀 문자열만큼 추출해서 변경하는 건 수행되지만,
만약 my_string의 바꿀 내용이 반복된다면, 반복되는 부분 모두가 같이 변경되어버려
오답임

 

 

Character  클래스란?

 Character 클래스는 Java에서 문자값과 관련된 유틸리티 메서드를 모아둔 클래스

 

 

Character 클래스 메서드 종류

  • isUpperCase(ch) : 문자 ch 값이 대문자인지 확인(true/false)
  • isLowerCase(ch) : 문자 ch 값이 소문자인지 확인(true/false)
  • isLetter(ch)  : 문자 ch 값이 문자인지 확인(true/false)
  • isDigit(ch) : 문자 ch 값이 숫자인지 확인(true/false)
  • isWhitespace(ch) : 문자 ch 값이 공백인지 확인(true/false)
  • isDefined(ch) : 문자 ch가 유니코드인지 확인(true/false)
  • toUpperCase(ch) : 문자 ch 값을 대문자로 변환하여 반환
  • toLowerCase(ch) : 문자 ch 값을 소문자로 변환하여 반환

 

 

관련 문제

 

[프로그래머스 문제]

영어 알파벳으로 이루어진 문자열 입력받은 후, 소문자는 대문자로, 대문자는 소문자로 변환하여 출력

 

import java.util.Scanner;

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

        StringBuffer result = new StringBuffer();   // 결과값 수정,추가를 위해 StringBuffer 선언

        for (int i=0; i<a.length(); i++) {
            char ch = a.charAt(i);     // ch 변수에 입력받은 문자를 한글자씩 불러옴
            if (Character.isUpperCase(ch)) {      // 대소문자 확인하여 변환
                result.append(Character.toLowerCase(ch));
            } else if (Character.isLowerCase(ch)) {
                result.append(Character.toUpperCase(ch));
            }
        }

        System.out.println(result);
    }
}

 

백준이나 프로그래머스 등 자바 프로그래밍 관련 문제를 풀 때,

 

초보자라면 궁금증한 것 중 하나가 바로

 

나눗셈 소수점 자리까지 값을 얻는 방법에 관한 것이다.

 

 

 

 

예를들어,

 

1 / 3 = 0.333333 의 값을 출력하고 싶은데,

 

자연스럽게 아래의 코드를 입력하면

 

출력값은 0.0이 나올 뿐이다.

 

int a = 1;
int b = 3;

double result = a / b;

System.out.println(result);  // 출력: 0.0

 

이렇게, 

 

result만 실수 타입으로 선언하면 소수점까지 쫙 나올 줄 알았는데,

 

출력은 0.0 으로 나온다.

 

 

 

 

결론적으로, 결과가 소수점까지 나오도록 하기 위해서는,

 

나누어주는 변수 a, b 둘 중 하나라도 실수형 타입이어야만

 

결과값이 소수점까지 표현이 된다.

 

 

따라서 아래와 같이 변경해주면 된다.

 

 

int a = 1;
double b = 3;

double result = a / b;

System.out.println(result);  // 출력: 0.3333333333333333

 

int a = 1;
int b = 3;

double result = (double) a / b;   // 정수 a를 실수형 타입으로 캐스팅(형 변환)

System.out.println(result);  // 출력: 0.3333333333333333 

 

 

 

 

 

 

그렇다면, a와 b를 실수형으로, result값을 정수형으로 선언하면 어떻게 될까?

 

자바 나눗셈 소수점까지 1

 

 

실수형끼리의 연산 시 기본적으로 실수형의 값이 반환되고,

 

실수형 값을 정수형 변수에 넣을 경우 캐스팅을 억지로 하지 않는 이상

 

위와 같은 에러가 발생한다!

 

※ 비교연산자

  • a = b : a와 b가 같다
  • a != b : a와 b는 같지 않다

 

※ and, or, not  연산자

  • a && b :  a, b 모두 참이어야 참    (and)
  •    a || b :  a, b 중 하나만 참이어도 참   (or)
  •         !a :  a가 거짓이면 참     (not)

 

※ break;와 continue;

  •  break: 해당 제어문 자체를 빠져나감 (제어문 끝, 다음 문장 수행)
  •  continue: 해당 제어문의 조건문으로 돌아감 (제어문 내의 조건문으로 즉, 제어문 처음부터 다시 수행)

 

■ If 문:

 

구조 : If - else if - else

 

 

If (조건문) {
    <수행할 문장 1>;
    <수행할 문장 2>;
    ....
} else if (조건문) {
    <수행할 문장 1>;
    <수행할 문장 2>;
    ....
} else if (조건문) {
    <수행할 문장 1>;
    <수행할 문장 2>;
    ....
} else {
    <수행할 문장 1>;
    <수행할 문장 2>;
    ....
}

 

 

■ switch / case 문:

 

입력 변수의 값이 해당 case의 입력값과 같으면 해당 문장을 수행한 뒤

break;문을 통해 switch문을 빠져나간다.

case 입력값 이외의 값에 해당할 경우에는 default: 문장을 수행함

 

switch (입력 변수) {
    case 입력값 1: <수행할 문장 1>;
        break;
    case 입력값 2: <수행할 문장 2>;
        break;


    ....


    default: <수행할 문장 n>;
        break;
}

 

■ while 문:

조건이 참인 동안 계속 수행됨

 

while (조건문) {
    <수행할 문장 1>;
    <수행할 문장 2>;
    ....
}

 

 

■ for 문:

초깃값을 넣고, 조건문이 참일 때까지 값을 증가시키며 문장 반복

 

기본 구조
for (초깃값; 조건문; 증갓값;) {           ex) (int i=0; i < 10; i++)     >> 정수 i값이 0부터 i<10이 참인 동안 문장 수행 후 i값 1씩 증가
    <수행할 문장 1>;
    <수행할 문장 2>;
    ....
}
for each문  >> 루프를 돌릴 수 있는 자료형(배열, 리스트 등)에서만 사용 가능
for (자료형 변수명 : 루프를 돌릴 객체 ) {          ex) (String a : numbers)     >> numbers라는 배열 혹은 리스트의 각 항목을
                                                                                                                          차례대로 a에 대입하여 수행

    <수행할 문장 1>;
    <수행할 문장 2>;
    ....
}

 

 

 print와 println 차이 :

  • print: 다음 출력 시 줄바꿈 없이 한 줄에 출력
  • println: 다음 출력 시 다음 줄로 넘어감