CODING TEST/programmers

Day5 - 주사위 게임 2

iamyuunzo 2025. 7. 12. 09:17

📌 문제 정보

- 문제 이름 : 코딩 기초 테스트 - 주사위 게임 2

- 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/181930

 

 

📌 문제 요약

핵심 조건: 1. 숫자가 모두 다르다면 a + b + c 점을 얻음.

2. 세 숫자 중 어느 두 숫자는 같고 나머지 다른 숫자는 다르다면 (a + b + c) × (a2 + b2 + c2 )점을 얻음.

3. 세 숫자가 모두 같다면 (a + b + c) × (a2 + b2 + c2 ) × (a3 + b3 + c3 )점을 얻습니다. 얻음.

- 제한: 1  a, b, c ≤ 6

 

 

📌 내 풀이 및 코드

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

        if ((a != b) && (b != c) && (c != a)) {
            answer = a + b + c;
        } else if ((a == b) && (b == c) && (c == a)) {
            answer = (a + b + c) * ((a*a)+(b*b)+(c*c)) * ((a*a*a)+(b*b*b)+(c*c*c));
        } else {
            answer = (a + b + c) * ((a*a)+(b*b)+(c*c));
        }
        return answer;
    }
}

- 문제 자체는 else-if문을 써야한다는게 바로 보여서 쉬웠는데 조건 2에서 a, b, c 중 어느 숫자가 다를지 모르는데 어떻게 구현하지..? 라는 생각에 힌트를 물어봤음. 조건 1, 2, 3 순서대로 구현을 해야겠다라는 생각에 쉬운 사고방식을 놓친듯..

 

 

📌 다른 사람들 풀이

// 1
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;

class Solution {
    public int solution(int a, int b, int c) {
        Set<Integer> numbers = Stream.of(a, b, c).collect(Collectors.toSet());

        return (a + b + c) *
                (numbers.size() < 3 ? a * a + b * b + c * c : 1) *
                (numbers.size() < 2 ? a * a * a + b * b * b + c * c * c : 1);
    }
}

<-- 다른 풀이 요약 -->

- 1 : Set<Integer>로 중복 제거, 삼항연산자 : Set의 크기(size)로 같은 값이 몇 개 있는지 판단

- Set을 쓰는 이유 : 중복 여부를 Set 크기로 간단하게 확인해서 if-else문 안 써도 됨.

 



📌 새로 배운 문법

<-- 이번 문제에서 새로 배운 Java 문법 정리 -->

- 문법은 따로 없고 깨달은 점 : Java로 코테 준비를 할 때마다 느끼는데.. 주전공인 전자과에서 C언어로 프로그래밍 기초를 처음 배워서 그런지 아직 절자지향적 사고가 강하게 남아있는 것 같다. 조건문이 단순히 흐름 제어를 판단하는건지, 객체 상태를 판별하는건지 자꾸 헷갈린다.

- 실제로도 이 부분에 대해 고민이 많아서 이것저것 찾아보니 Java 코드를 C처럼 짜면 클래스 의미가 약해지고, 객체지향의 장점을 살리지 못한다고 한다. 모든 걸 if-else로만 해결하려고 하고, 상태 분기 대신 switch나 if 같은 조건문이 너무 많은 내 코드를 보면 Java의 클래스/인터페이스/상속 같은 좋은 기능을 활용하지 못하는 것 같다.

- 절차지향적보다 객체지향적 사고를 가질 수 있도록 노력해야겠다...