백준온라인

[백준온라인] 1138번 한 줄로 서기

cbkpar 2019. 12. 18. 22:21

문제 : https://www.acmicpc.net/problem/1138

 

1138번: 한 줄로 서기

첫째 줄에 사람의 수 N이 주어진다. N은 10보다 작거나 같은 자연수이다. 둘째 줄에는 키가 1인 사람부터 차례대로 자기보다 키가 큰 사람이 왼쪽에 몇 명이 있었는지 주어진다. i번째 수는 0보다 크거나 같고, N-i보다 작거나 같다.

www.acmicpc.net

문제 요약 : 줄을 선 순서대로 키 출력

입력 출력

1 ≤ N(사람 수) ≤ 10

N개의 왼쪽에 있는 인원 수 차례로 주어짐

줄을 선 순서대로 키를  출력

 

 

JAVA

채점 번호 아이디 문제 번호 결과 메모리 시간 언어 코드 길이
16513401 cbkpar 1138 맞았습니다!! 12988KB 76ms Java 740B
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class Main {
	
	public static void main(String args[]) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		ArrayList<Integer> ans = new ArrayList<Integer>(); // List 자료구조를 사용함
		int n = Integer.parseInt(br.readLine());
		StringBuffer sbu = new StringBuffer(br.readLine()); //거꾸로 자르기 위해 사용
		StringTokenizer st = new StringTokenizer(sbu.reverse().toString());//뒤 부터 불러옴
        //키가 큰 순서부터 채우며 들어갈때 키가제일 작은상태로 들어가므로 자기보다 큰사람의 수만큼
        //오른쪽으로 리스트를 채워나감
		for(int i=n-1;i>=0;i--)	ans.add(Integer.parseInt(st.nextToken()),i+1);
		for(int i:ans) sb.append(i+" ");
		System.out.println(sb.toString());
		br.close();
	}
}

 

배열을 사용해 풀 수 있었지만 하나씩 추가할때마다 옆으로 밀어내는 과정이 번거롭기 때문에 List자료 구조를 사용하였다.

 

또한 이때 ArrayList를 출력할경우 [1, 2, 3, 4]의 형태로 출력이 되는데 replaceAll을 이용해 제거 할 수 있지만

간단히 for문에 넣어 출력하면 된다 이때 배열의 개수를 모를 경우 for(int i:배열이름)을 사용하면 배열의 사이즈를 구하지 않고도 배열의 크기만큼 배열의 값이 i로 변경되며 돌아간다.