프로그래머스 코딩 기초 트레이닝 🔥 조건문 / 반복문

2025년 05월·자바

조건문

수 조작하기 1

🗒️ 정수 n과 문자열 control이 주어집니다. control은 "w", "a", "s", "d"의 4개의 문자로 이루어져 있으며, control의 앞에서부터 순서대로 문자에 따라 n의 값을 바꿉니다.

  • "w": n이 1 커집니다.
  • "s": n이 1 작아집니다.
  • "d": n이 10 커집니다.
  • "a": n이 10 작아집니다.

위 규칙에 따라 n을 바꿨을 때 가장 마지막에 나오는 n의 값을 return 하는 solution 함수를 완성해주세요.

class Solution {
    public int solution(int n, String control) {
        char[] arr = control.toCharArray();
        for (char c : arr) {
            switch (c) {
                case 'w': n++; break;
                case 's': n--; break;
                case 'd': n += 10; break;
                case 'a': n -= 10; break;
            }
        }
        return n;
    }
}

🔎 switch문: 값이 정해진 것들 중 하나일 때

switch (변수) {
    case 값1: ...
        break;
    case 값2: ...
        break;
    ...
    default:   ...
        break;
}

// 향상된 switch문
String result = switch (score) {
    case "D" -> {
        System.out.println("Too low");
        yield "Bad";
    }
    case "C", "B" -> "Okay";
    case "A" -> "Good";
    default -> "Unknown";
};

 

마지막 두 원소

🗒️ 정수 리스트 num_list가 주어질 때, 마지막 원소가 그전 원소보다 크면 마지막 원소에서 그전 원소를 뺀 값을, 마지막 원소가 그전 원소보다 크지 않다면 마지막 원소를 두 배한 값을 추가하여 return 하도록 solution 함수를 완성해주세요.

class Solution {
    public int[] solution(int[] num_list) {
        int len = num_list.length;
        int[] answer = Arrays.copyOf(num_list, len + 1);
        answer[len] = (num_list[len - 1] > num_list[len - 2])
        ? num_list[len - 1] - num_list[len - 2] : num_list[len - 1] * 2;
        return answer;
    }
}

Arrays.copyOf(arr, int newLength)

원본 배열을 앞에서부터 원하는 길이만큼 복사한 새로운 배열 반환

 

주사위 게임 2

🗒️ 1부터 6까지 숫자가 적힌 주사위가 세 개 있습니다. 세 주사위를 굴렸을 때 나온 숫자를 각각 a, b, c라고 했을 때 얻는 점수는 다음과 같습니다.

  • 세 숫자가 모두 다르다면 a + b + c점을 얻습니다.
  • 세 숫자 중 어느 두 숫자는 같고 나머지 한 숫자는 다르다면 (a + b + c) × (a² + b² + c²)점을 얻습니다.
  • 세 숫자가 모두 같다면 (a + b + c) × (a² + b² + c²) × (a³ + b³ + c³)점을 얻습니다.

세 정수 a, b, c가 매개변수로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해주세요.

class Solution {
    public int solution(int a, int b, int c) {
        int sum = a + b + c;
        int squaredSum = (a * a) + (b * b) + (c * c);
        int cubedSum = (a * a * a) + (b * b * b) + (c * c * c);

        if (a == b && b == c) {
            return sum * squaredSum * cubedSum;
        } else if (a == b || b == c || a == c) {
            return sum * squaredSum;
        } else {
            return sum;
        }
    }
}

🔎 논리연산자

  • &&(AND): 조건이 모두 참이어야 전체가 참
  • ||(OR): 조건이 하나라도 참이면 전체가 참
  • !(NOT): 조건을 반대로 뒤집기

 

주사위 게임 3

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

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

네 주사위를 굴렸을 때 나온 숫자가 정수 매개변수 a, b, c, d로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해주세요.

class Solution {
    public int solution(int a, int b, int c, int d) {
        int[] count = new int[7];  // 주사위 숫자를 인덱스로 사용

        // 각각의 주사위 숫자가 몇 번 나왔는지 세기
        count[a]++;
        count[b]++;
        count[c]++;
        count[d]++;

        // 등장한 숫자만 뽑아서 리스트로 저장
        List<Integer> nums = new ArrayList<>();
        for (int i = 1; i <= 6; i++) {
            if (count[i] > 0) nums.add(i);
        }

        int size = nums.size();  // 서로 다른 숫자의 개수

        if (size == 1) {
            // 네 개 모두 같을 때
            return 1111 * nums.get(0);
        } else if (size == 2) {
            int p = nums.get(0), q = nums.get(1);
            if (count[p] == 3 || count[q] == 3) {
                // 세 개는 같고, 한 개만 다를 때
                int three = (count[p] == 3) ? p : q;
                int one = (count[p] == 1) ? p : q;
                return (10 * three + one) * (10 * three + one);
            } else {
                // 두 개씩 짝지어 같을 때
                return (p + q) * Math.abs(p - q);
            }
        } else if (size == 3) {
            // 두 개는 같고, 나머지는 각각 다를 때
            int pair = 0, product = 1;
            for (int i = 1; i <= 6; i++) {
                if (count[i] == 2) pair = i;
                if (count[i] == 1) product *= i;
            }
            return product;
        } else {
            // 네 개 모두 다를 때
            return Math.min(Math.min(a, b), Math.min(c, d));
        }
    }
}

🤓☝️ 주사위 숫자 등장 횟수를 배열로 카운팅하는 아이디어 ...!

 

반복문

수열과 구간 쿼리 2

🗒️ 정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [s, e, k] 꼴입니다. 각 query마다 순서대로 s ≤ i ≤ e인 모든 i에 대해 k보다 크면서 가장 작은 arr[i]를 찾습니다. 각 쿼리의 순서에 맞게 답을 저장한 배열을 반환하는 solution 함수를 완성해주세요. 단, 특정 쿼리의 답이 존재하지 않으면 -1을 저장합니다.

class Solution {
    public int[] solution(int[] arr, int[][] queries) {
        int[] answer = new int[queries.length];

        for (int q = 0; q < queries.length; q++) {
            int s = queries[q][0];
            int e = queries[q][1];
            int k = queries[q][2];
            
            int min = Integer.MAX_VALUE;
            boolean found = false;

            for (int i = s; i <= e; i++) {
                if (arr[i] > k && arr[i] < min) {
                    min = arr[i];
                    found = true;
                }
            }
            
            answer[q] = found ? min : -1;
        }
        
        return answer;
    }
}

// 다른 풀이
class Solution {
    public int[] solution(int[] arr, int[][] queries) {
        int[] answer = new int[queries.length];
        Arrays.fill(answer, -1);  // 기본값은 -1로 설정

        for (int i = 0; i < queries.length; i++) {
            int s = queries[i][0];
            int e = queries[i][1];
            int k = queries[i][2];

            for (int j = s; j <= e; j++) {
                if (arr[j] > k) {
                    // 아직 아무 값도 없으면 arr[j] 대입, 아니면 더 작은 값으로 갱신
                    answer[i] = (answer[i] == -1) ? arr[j] : Math.min(answer[i], arr[j]);
                }
            }
        }

        return answer;
    }
}

🤓☝️ 최솟값 찾는 변수는 Integer.MAX_VALUE로 초기화하기(반대는 당연히 Integer.MIN_VALUE)

🤓✌ 먼저 -1로 채워진 배열을 만들어서 플래그로 사용하는 아이디어 ...!!

 

수열과 구간 쿼리 3

🗒️ 정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [i, j] 꼴입니다. 각 query마다 순서대로 arr[i]의 값과 arr[j]의 값을 서로 바꿉니다. 위 규칙에 따라 queries를 처리한 이후의 arr를 return 하는 solution 함수를 완성해주세요.

class Solution {
    public int[] solution(int[] arr, int[][] queries) {
        for (int[] query : queries) {
            int i = query[0];
            int j = query[1];
            
            // temp 변수를 이용한 swap
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
        
        return arr;
    }
}

 

배열 만들기 4

🗒️ 정수 배열 arr가 주어집니다. arr를 이용해 새로운 배열 stk를 만들려고 합니다. 변수 i를 만들어 초기값을 0으로 설정한 후 i가 arr의 길이보다 작으면 다음 작업을 반복합니다.

  • 만약 stk가 빈 배열이라면 arr[i]를 stk에 추가하고 i에 1을 더합니다.
  • stk에 원소가 있고, stk의 마지막 원소가 arr[i]보다 작으면 arr[i]를 stk의 뒤에 추가하고 i에 1을 더합니다.
  • stk에 원소가 있는데 stk의 마지막 원소가 arr[i]보다 크거나 같으면 stk의 마지막 원소를 stk에서 제거합니다.

위 작업을 마친 후 만들어진 stk를 return 하는 solution 함수를 완성해주세요.

class Solution {
    public int[] solution(int[] arr) {
        ArrayDeque<Integer> stack  = new ArrayDeque<>();
        int i = 0;

        while (i < arr.length) {
            if (stack.isEmpty()) {
                stack.push(arr[i++]);
            } else if (arr[i] > stack.peek()) {
                stack.push(arr[i++]);
            } else {
                stack.pop();
            }
        }

        List<Integer> list = new ArrayList<>(stack);
        Collections.reverse(list);
        return list.stream().mapToInt(Integer::intValue).toArray();
    }
}

🤓☝️ "가장 최근에 넣은 값"을 조건에 따라 다시 꺼내거나 버려야 한다면, "스택이 필요해!" 알아차리기

'자바' 카테고리의 다른 글

프로그래머스 코딩 기초 트레이닝 🔥 리스트(배열)  (1) 2025.05.02
지삐띠니야 메서드 알려줘  (0) 2025.05.02
프로그래머스 코딩 기초 트레이닝 🔥 출력 / 연산 / 문자열  (0) 2025.04.30
프로그래머스 코딩테스트 입문 60%  (0) 2025.04.27
프로그래머스 코딩테스트 입문 40%  (0) 2025.04.27
'자바' 카테고리의 다른 글
  • 프로그래머스 코딩 기초 트레이닝 🔥 리스트(배열)
  • 지삐띠니야 메서드 알려줘
  • 프로그래머스 코딩 기초 트레이닝 🔥 출력 / 연산 / 문자열
  • 프로그래머스 코딩테스트 입문 60%
토토이
토토이
토토이 님의 블로그 입니다.
  • 토토이
    토토이 님의 블로그
    토토이
    • 분류 전체보기 (18)
      • KT 에이블스쿨 (5)
      • 복습 (1)
      • 자바 (11)
      • 뻐꿈 (0)
  • 태그

    AICE
    java
    스택
    에이블스쿨
    인프런
    자격증
    자바
    취준
    코딩테스트
    코테
    프로그래머스
  • 블로그 메뉴

    • 홈
    • 태그
    • 글쓰기
  • hELLO· Designed By정상우.v4.10.3
토토이
프로그래머스 코딩 기초 트레이닝 🔥 조건문 / 반복문
상단으로

티스토리툴바