[SWEA 1225번] 암호생성기 with Java

guswls·2024년 5월 15일
0

알고리즘

목록 보기
37/39
post-custom-banner

문제




코드


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

class Solution {
	public static void main(String[] args) throws Exception {
		//System.setIn(new FileInputStream("input.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		StringBuilder sb = new StringBuilder();
		for (int t = 0; t < 10; t++) {
			br.readLine();
			StringTokenizer st = new StringTokenizer(br.readLine());
			Deque<Integer> queue = new ArrayDeque<>();
			while (st.hasMoreTokens()) {
				queue.add(Integer.parseInt(st.nextToken()));
			}

			int sub = 1;	
			while (queue.peek() - sub > 0) {							
				queue.addLast(queue.pollFirst() - sub);
				
				sub++;				
				if (sub > 5) {
					sub = 1;
				}
			}
			
			queue.poll();
			queue.addLast(0);

			sb.append("#").append(t + 1).append(" ");
			while (!queue.isEmpty()) {
				sb.append(queue.pollFirst()).append(" ");
			}
			sb.append(System.lineSeparator());
		}
		System.out.println(sb);
	}
}


문제 이해


  • 문제 내용 그대로 접근하면 된다.
  • 큐에서 값을 꺼낸 후 1을 뺀후 뒤에 삽입, 다시 값을 꺼낸두 2를 뺀후 뒤에 삽입, 이런 식의 동작을 5까지 반복한다.
  • 위 동작이 한 사이클이며, 빼지는 수가 5가 되면 다시 1부터 순차적으로 한다.
  • 위 사이클을 반복해서 큐에서 값을 뺐을 때 0보다 작거나 같다면, 마지막에 0을 삽입한 후 종료한다.


풀이 방법


  • 위 이해 자체를 naive하게 작성하면 금방 해결할 수 있다.
  • 이때 0보다 작거나 같은 숫자가 나오면서 종료되는 순간, 앞에 값을 제거하고 뒤에 0을 삽입해주어야 한다.


핵심 포인트


  • 0이 되는 시점에 값을 잘 처리해주어야 한다.


보완할 점 / 느낀 점


  • 사실 처음에 코드를 다 작성한 후 테케가 4개만 맞았었다.

  • while (queue.peek() - sub >= 0) 이렇게 while의 조건문에서 0까지 포함하여 돌렸기 때문이다.

  • 이것을 빠르게 파악하고 넘어갔어야 됐는데, 순간 제약사항에서 마지막 암호 배열은 모두 한 자리 수로 구성되어 있다.에 대한 체크를 해야하는 것으로 오해하여 해당 조건을 while문에 아래와 같이 추가하였다.

    if (queue.stream().anyMatch(n -> n > 9)) {
          isEnd = false;
     } else {
          isEnd = true;
     }
  • 제약 사항을 문제의 조건으로 오해하는 일은 다신 없도록 해야겠다.

  • 그와는 별개로 Deque와 같은 자료구조에서도 stream을 쓸 수 있다는 것, 그리고 anymatch를 활용하는 법을 이 기회에 익혔기 때문에 나쁠건 없다고 생각한다.



참고자료


profile
안녕하세요
post-custom-banner

0개의 댓글