티스토리 뷰

프로그래머스 2단계 주식가격 문제

 url : https://programmers.co.kr/learn/courses/30/lessons/17687?language=java


문제설명

튜브가 활동하는 코딩 동아리에서는 전통적으로 해오는 게임이 있다. 이 게임은 여러 사람이 둥글게 앉아서 숫자를 하나씩 차례대로 말하는 게임인데, 

규칙은 다음과 같다.


숫자를 0부터 시작해서 차례대로 말한다. 첫 번째 사람은 0, 두 번째 사람은 1, … 열 번째 사람은 9를 말한다.

10 이상의 숫자부터는 한 자리씩 끊어서 말한다. 즉 열한 번째 사람은 10의 첫 자리인 1, 열두 번째 사람은 둘째 자리인 0을 말한다.

이렇게 게임을 진행할 경우, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 0, 1, 1, 1, 2, 1, 3, 1, 4, … 순으로 숫자를 말하면 된다.


한편 코딩 동아리 일원들은 컴퓨터를 다루는 사람답게 이진수로 이 게임을 진행하기도 하는데, 이 경우에는

0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, … 순으로 숫자를 말하면 된다.


이진수로 진행하는 게임에 익숙해져 질려가던 사람들은 좀 더 난이도를 높이기 위해 이진법에서 십육진법까지 모든 진법으로 게임을 진행해보기로 했다. 숫자 게임이 익숙하지 않은 튜브는 게임에 져서 벌칙을 받는 굴욕을 피하기 위해, 자신이 말해야 하는 숫자를 폰에 미리 출력해주는 프로그램을 만들려고 한다. 


제한사항

진법 n, 미리 구할 숫자의 갯수 t, 게임에 참가하는 인원 m, 튜브의 순서 p 가 주어진다.

2 ≦ n ≦ 16

0 < t ≦ 1000

2 ≦ m ≦ 100

1 ≦ p ≦ m

튜브가 말해야 하는 숫자 t개를 공백 없이 차례대로 나타낸 문자열. 단, 10~15는 각각 대문자 A~F로 출력한다.


입출력 예

 n

t 

m 

p 

result 

 16

16

13579BDF01234567


자바코드


          
class Solution {
  public static String solution(int n, int t, int m, int p) {
		char[] arr = new char[t * m];
		arr[0] = '0';
		int num = 1;
		int index = 1;
		while(index < arr.length) {
			char[] converted = convert(num, n);
			for(char c : converted) {
				if(index > arr.length - 1) break;
				arr[index++] = c;			}
			num++;
		}
		
		StringBuilder sb = new StringBuilder();
		for(int i = 0; i < arr.length; i++) {
			if(i % m == (p - 1)) {
				sb.append(arr[i]);
			}
		}
		return sb.toString();
	}
	
	public static char[] convert(int num, int n) {
		StringBuilder sb = new StringBuilder();
		while(num > 0) {
			int rest = num % n;
			sb.append(rest >= 10 ? String.valueOf((char)('A' + (rest - 10))) : rest);
			num /= n;
		}
		return sb.reverse().toString().toCharArray();
	}
}


문제설명


이 문제에서 가장 고민해야할 부분은 입력받은 숫자를 어떻게 n진법으로 변환할 것인가? 이다. 처음에는 스택에 n으로 나눈 나머지를 추가하는 방식으로 했다.

왜냐면 LIFO로 데이터를 뽑아야 하기 때문이다. 그러나 이것을 문자로 변환하는 과정에서 한번의 for문이 또 동작해야 하는 단점이 있었다.

그래서 StringBuilder의 reverse()를 이용했다. 문자열을 뒤집는데 많이 사용했는데, 여기에도 활용해봤다. 그리고 n진법으로 변환할 때, 중요한 것은 16진법 

경우 10 이상의 숫자를 알파벳으로 표기해야 한다는 것이다. 그에 따른 분기문이 반드시 필요하다!


그리고 튜브의 차례에만 숫자를 뽑는 것은 반복문을 돌렸다. 생각해보니 1부터 차례대로 뽑지 않고 해당 인덱스만 뽑을 수 있었다.

나중에 고쳐야지.. 근데 정말 고칠까?! 아니... 고칠거야.  n진법으로 변환하는 다른 방법을 더 찾아봐야 겠다. 왠지 비트연산자 이런걸로 활용할 수 있을거같다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함