[코딩테스트] 간단한 369 게임 | SWEA

Bluewave·2024년 5월 17일

코테공부_java

목록 보기
31/99
post-thumbnail

문제

✍🏻 문제 바로가기

문제레벨정답률
간단한 369게임D263.8%

My Code

import java.util.*;
import java.io.*;

class Solution
{
	public static void main(String args[]) throws Exception
	{
		Scanner sc = new Scanner(System.in);
		int T;
		T=sc.nextInt();
		
		for(int test_case = 1; test_case <= T; test_case++){
            int n = sc.nextInt();
			for(int i = 0; i<n; i++){
                int a = 0; int b = 0; int c = 0;
                a = i%10; b = (i/10)%10; c = (i/100)%10;
                String number = Integer.toString(i);
                
                if(a%3 == 0 && b%3 == 0 && c%3 == 0){
                    if(number.length() == 1){System.out.print("-" + " ");}
                    else if(number.length() == 2){
                        if(a%3 == 0 && b%3 == 0){
                            System.out.print("--" + " ");
                        } else{
                            System.out.print("-");
                        }
                    } else{
                        if(a%3 == 0 && b%3 == 0 && c%3 == 0){
                            System.out.print("---" + " ");
                        } else if((a%3 == 0 && b%3 == 0) || (a%3 == 0 && c%3 == 0) || (b%3 == 0 && c%3 == 0)){
							System.out.print("--" + " ");
                        }else{
                            System.out.print("-");
                        }
                    }
				} else{
                    if(i != n-1){
                        System.out.print(i + " ");
                    } else{
                        System.out.print(i);
                    }
                }
            }
		}
    }
}

우선, 이 코드는 실패 코드이다.
실패 요인은 다음과 같다.

  1. 불필요하게 조건문이 복잡해져 메모리 초과 발생
  2. 숫자 0이 포함된 경우 오류 발생
    예) 105
  3. 출력 형식 일부 오류

무엇보다 코드의 논리를 단순화하는 과정이 필요하다.
그리고 이 문제의 한 가지 tip은 숫자로 처리하는 것이 아니라 문자로 처리하는 것..!

최적화 코드

import java.util.Scanner;

public class Solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        
        for (int i = 1; i <= N; i++) {
            String number = Integer.toString(i);
            int clapCount = 0;
            
            for (char ch : number.toCharArray()) {
                if (ch == '3' || ch == '6' || ch == '9') {
                    clapCount++;
                }
            }
            
            if (clapCount > 0) {
                for (int j = 0; j < clapCount; j++) {
                    System.out.print("-");
                }
            } else {
                System.out.print(i);
            }
            
            if (i != N) {
                System.out.print(" ");
            }
        }
        sc.close();
    }
}

우선 입력된 숫자를 문자열로 변환한다.
그리고 문자열을 문자 배열로 변환하여 3,6,9가 들어가면 clapCount를 증가시킨다.

clapCount가 0보다 크면 그만큼 "-"를 출력,
그게 아니라면 숫자를 출력한다.

만약 숫자가 N, 즉 마지막 숫자가 아니라면 그 뒤에 공백을 추가한다.


내가 처음에 작성한 코드에 비해 굉장히 논리가 간결하다.
그리고 솔직히 문자열로 처리해야겠다는 생각은 전혀 하지 못했다.

나는 문제를 풀때 문제를 이해하고 머릿속의 생각을 코드로 바로 풀어내는 편이다. 근데 이러면 로직을 단순화 할 시간이 없다. 복잡한 머릿속의 생각이 코드에 그대로 반영이 된다.
앞으로는 코드를 짜기 전에, 논리를 단순화하여 정리한 후 코드를 짜는 연습을 해야겠다.

그리고 내가 짠 코드가 너무 복잡하다면, 과감히 버리고 다시 시도하는 것도 좋은 방법인 것 같다.

profile
Developer's Logbook

0개의 댓글