-
백준 25556번 : 포스택코딩테스트 문제 풀이/백준 2023. 11. 20. 00:01
문제
나의 접근 방법
나는 이 문제를 힌트 없이 풀어보려고 시도했다가 한 3시간 동안 엉뚱하게 출력되는 결과만 보고있었다..ㅋ큐ㅠㅠ
나의 접근 방법은 문제를 그대로 읽어서 그대로 코드화 하는것이었는데 그러면 풀 수 없는 문제였다.
이 문제는
오름차순으로 출력
할 수 있도록 입력된 숫자들을4개의 스택
에 담을 수 있는가? 라고 받아들였어야 했다.랜덤
으로 담아서 스택 4개 중에의도
하여 출력이라고 써있지만, 풀이를 위한 접근으로는의도
해서 담아의도
한 결과를 출력할수 있는가? 였던 것... ㅠㅠ정답을 맞춘 코드는 다음과 같다.
내 코드
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int N = Integer.parseInt(br.readLine()); StringTokenizer st = new StringTokenizer(br.readLine(), " "); int[] stack = new int[]{0, 0, 0, 0}; int value; boolean isPossible = true; while (isPossible && st.hasMoreTokens()) { value = Integer.parseInt(st.nextToken()); isPossible = false; for (int i = 0; i < stack.length; i++) { if (stack[i] < value) { stack[i] = value; isPossible = true; break; } } } if (isPossible) System.out.println("YES"); else System.out.println("NO"); } }
1. 사용될 변수 선언 & 초기화
int[] stack = new int[]{0, 0, 0, 0}; // 4개의 스택의 top부분을 담당할 배열 int value; // StringTokenizer로 분리한 문자를 정수로 변환하여 비교를 위해 잠시 저장해둘 변수 boolean isPossible = true; // stack에 값이 저장되었는지를 알려고 만든 변수 // isPossible이 false가 된 채로 stack배열의 탐색이 끝나면 // value가 stack에 저장되지 못한 것이기 때문에 while 반복문 종료되며 "NO" 출력
2. 오름차순으로 정렬이 가능한지 알아보기위한 while 반복문
while (isPossible && st.hasMoreTokens()) { // 반복문 종료조건: isPossible이 for문을 진행 한 뒤에도 false 이거나, // StringTokenizer 로 가져온 문자가 더이상 없으면 종료 value = Integer.parseInt(st.nextToken()); // StringTokenizr로 분리해온 문자1을 정수로 변환해서 value에 담음 isPossible = false; // value 변수가 스택에 담길 수 있는지 확인하기 위한 변수 // 담길 수 있는 조건 : stack에 들어있는 값 보다 value 값이 더 커야됨 for (int i = 0; i < stack.length; i++) { // 스택이 4개이므로 4번 반복되는 반복문 if (stack[i] < value) { // stack의 첫번째 값(문제에서 말하는 4개중 1개 스택의 top 값)이 value보다 작은가? stack[i] = value; // 그렇다면 해당 위치에 value를 집어넣는다. isPossible = true; // value가 stack에 저장되었으니 true break; // value가 stack에 저장되었으니 for문 끝냄 } // 만약 여기로 나오게 된다면 value는 stack에 담기지 못한것으로, // isPossible 값은 false가 된다. -> while 조건문을 통과하지 못하고 종료 } }
3. 결과를 출력하기위한 조건문
// if() -> isPossible이 true : 모든 값이 stack에 담김 if (isPossible) System.out.println("YES"); else System.out.println("NO"); // else -> isPossible이 false : stack에 담기지 못한 값이 존재함
그리고 아래는 내가 내맘대로 직독직해 하고 작성해서 엉뚱한 결과만 출력되는 가엾은 코드....🥹
import java.util.ArrayList; import java.util.Random; public class Main { public static void main(String[] args) { int N = 10; String Ns = "4 3 6 7 8 9 10 2 1 5"; ArrayList<ArrayList<Integer>> list = new ArrayList(); list.add(new ArrayList()); list.add(new ArrayList()); list.add(new ArrayList()); list.add(new ArrayList()); for (String s: Ns.split(" ")) { Random r = new Random(); list.get(r.nextInt(4)).add(0, Integer.parseInt(s)); } int min = 100001; int minIdx = -1; ArrayList<Integer> result = new ArrayList<>(); while (list.size() > 0) { for (int j = 0; j < list.size(); j++) { if (list.get(j).size() == 0) { list.remove(j); continue; } if (min > list.get(j).get(0)) { min = list.get(j).get(0); minIdx = j; } } result.add(min); list.get(minIdx).remove(0); if (list.get(minIdx).size() == 0) { list.remove(minIdx); } min = 100001; minIdx = -1; } System.out.println(result); } }
'코딩테스트 문제 풀이 > 백준' 카테고리의 다른 글
행성 X3 (0) 2023.11.21 백준 : 힙 정렬2 (0) 2023.11.21 백준: 요세푸스 문제 (0) 2023.11.20 백준: 최소, 최대 (0) 2023.11.20 백준 : 회전하는 큐 (0) 2023.11.20