본문 바로가기
코딩연습

[코딩연습] 369 게임 (구름 - 1단계)

by 마진 2021. 5. 2.

 

 

처음에는 '3,6,9'라는 게임이 숫자를 취급하기 때문에

문자열로 저장되는 입력값을 정수형으로 형변환 후 for문을 통해서 쉽게 답을 구할 수 있을 것이라 판단했습니다.

 

 [  First Try  ]

 

0. 예제로 십의 자리 숫자 10과 35가 나왔기 때문에 해당 조건만 생각

1. 정수는 10의 제곱들의 합으로 표현가능

  예) 35 = 3*10^1 + 5*10^0

2. 숫자 1~입력된숫자 범위에서 각 숫자를 10으로 나누었을 때

    그 몫과 나머지가 3,6,9인 경우를 계산하여 count하는 로직을 작성.

 

 

 

하지만 위처럼 계산하면 숫자가 100을 넘어갈 때 의도한 결과가 나오지 않습니다. 덕분에 4,5번 테스트에서 통과할 수 없었고 100 or 그 이상의 숫자들을 계산하기 위해서는 조건들이 다양해지고 코드역시 복잡해졌습니다.

 

 

Q. 어떻게 해야 어떤 숫자가 입력되더라도 게임의 룰에 따라 박수를 칠 수 있을 까요?

    -> 입력된 숫자의 각 자리를 쪼개서 계산하는 것입니다.

 

숫자는 쪼개기 어려우나 문자열은 쉽게 쪼갤 수 있는 점이 이 문제를 해결하는 데 가장 유효한 키였습니다.

 

 

[ Second Try ]

0. 1부터 입력된 정수값까지의 범위로 For Loop설정

1. 게임이 진행될 때 판단할 숫자를 toString()를 활용해 strI에 대입

2. 문자열로 변한 숫자를 charAt()메서드를 활용해 각 자리별로 쪼갠 뒤 정수형 배열 arrGame[] 에 저장 (이 때, digit()메서드로 정수로 변환) 

3. arrGame 각각의 요소를 switch ~ case 구문을 활용해 369 조건에 맞추어 카운트

 

---------------------------------------------------------------------------------------------------------------------------------

설명부분을 읽었을 때와 달리 풀면서 매우 어려웠던 문제였습니다.

하지만, 이 문제를 풀면서 기본 클래스들의 다양한 메서드를 활용할 수 있어서  많은 도움이 되었습니다.

 

---------------------------------------------------------------------------------------------------------------------------------

 

Integer

    - parseInt(String str)  : str을 정수로 반환 (십진법)

    - toString(int i)         : String으로 변환

 

String

    - length(String str)     : Returns the length of this string.  (문자열의 길이를 반환. 개별문자의 수와 동일)

                                   The length is equal to the number of Unicode code units in the string.

    - charAt(int index)     :  Returns the char value at the specified index. An index ranges from 0 to length() 

                                   index번호에 해당하는 char를 반환하는 메서드입니다.

                                   문자열의 index번호 역시 0부터 시작합니다.

 

Character

    - digit(char ch, int radix) : Returns the numeric value of the character ch in the specified radix. 

                                      ch에 해당하는 숫자값을 반환합니다. (radix 기준)

                                      (radix는 기수로 10진법, 2진법과 같이 숫자표기방법이라고 생각할 수 있습니다.)

// 0~9범위 숫자의 아스키코드값: 48~57 
char ch = 50; // 코드표에서 2를 의미
System.out.println(Character.digit(ch, 10));   // ch를 10진법으로 표기

 

 

<코드소스>

<테스트결과>

 

 

 

 

<참고>

숫자를 문자로 쪼개는 아이디어

1단계 : 369 게임 :: 이것저것 쓰는공간 (tistory.com)

 

1단계 : 369 게임

#include #include using namespace std; int count(char *s){ int count =0; for(int i=0;i > num; int sum = 0; for(int i=1; i 처음엔 숫자형을 받아와서 처리를 해주려 했으나, 채점 데이터 6케이스중 2케이..

musang1408.tistory.com

기수란? (radix)

wikidocs.net/22045

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

StringBuilder (Java SE 16 & JDK 16) (oracle.com)

 

StringBuilder (Java SE 16 & JDK 16)

All Implemented Interfaces: Serializable, Appendable, CharSequence, Comparable A mutable sequence of characters. This class provides an API compatible with StringBuffer, but with no guarantee of synchronization. This class is designed for use as a drop-in

docs.oracle.com

 

구름LEVEL (goorm.io)

 

구름LEVEL

코딩테스트에서 가장 높은 비중을 차지하는 알고리즘 문제를 제작하고 풀이할 수 있는 온라인 저지 서비스입니다. 기업에서 선호하는 C, C++, 파이썬(Python), 자바(Java), 자바스크립트(Javascript) 이

level.goorm.io