시리즈: 알고리즘 (32개 글)
- 자바로 알고리즘 풀기
- [Java] 백준 10431 - 줄 세우기
- [Java & Node.js] 백준 9935 - 문자열 폭발
- [Node.js] 백준 22866 - 탑 보기
- [Java] 백준 4485 - 녹색 옷 입은 애가 젤다지?
- [Node.js] 백준 1283 - 단축키 지정
- [Java & Node.js] 백준 14469 - 소가 길을 건너간 이유 3
- [Java] 백준 8979 - 올림픽
- [Node.js] 백준 22866 - 탑 보기
- [Java] 백준 7568 - 덩치
- [Java] 백준 1244 - 스위치 켜고 끄기
- [Node.js] 백준 19941 - 햄버거 분배
- [Node.js] 백준 1254 - 팰린드롬 만들기
- [Java] 백준 2589 - 보물섬
- [Java] 백준 2309 - 일곱 난쟁이
- [Java] 백준 1789 - 수들의 합
- [Java] 백준 1987 - 알파벳
- [Node.js] [Rust] 백준 24460 - 특별상이라도 받고 싶어
- [Node.js] 백준 7576 - 탑 보기
- [Rust] 백준 1047 - 울타리 (N^4 브루트포스 + 그리디)
- [Node.js] 백준 9657 - 돌게임3
- [Rust] 백준 4963 - 섬의 개수
- [Node.js] 프로그래머스 - 모의고사 / 실패율
- [Rust] 백준 2667 - 단지번호붙이기
- [Node.js] 프로그래머스 - 방문 길이
- [Node.js] 프로그래머스 - 괄호 회전하기
- [Rust] 백준 1002 - 터렛
- [Node.js] 프로그래머스 - 크레인 인형뽑기 게임
- [Node.js] 프로그래머스 - 기능개발
- [Rust] 백준 13717 - 포켓몬 GO
- [JavaScript] 백준 1092 - 배
- [Rust] 백준 25329 - 학생별 통화 요금 계산
백준 10431 줄 세우기
문제 이해 및 접근
- 뒤로 물러나는 걸음 수 계산하기
따라서 배열에 삽입하는 방식으로 접근. 삽입 후 인덱스를 이용, 뒤로 물러나는 걸음 수를 계산
ArrayList 활용
- 크기가 동적임
- 삽입시 자동으로 요소를 밀어냄 (문제에서 말하는 줄 세우기랑 같음!)
코드 구현
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();
int P = Integer.parseInt(br.readLine());
for (int t = 1; t <= P;t++ ) {
String line = br.readLine();
StringTokenizer st = new StringTokenizer(line, " ");
int tc = Integer.parseInt(st.nextToken());
// 학생 수는 20명
ArrayList<Integer> heights = new ArrayList<>();
// 걸음 수 초기화
int totalSteps = 0;
for (int i = 0; i < 20; i++) {
int curHeight = Integer.parseInt(st.nextToken());
boolean isInserted = false;
for (int j = 0; j < heights.size(); j++) {
if (heights.get(j) > curHeight) {
// 키가 더 큰 경우 - 이 앞에 들어가야 함.
heights.add(j, curHeight);
totalSteps += heights.size() - 1 - j ;
isInserted = true;
break;
}
}
if (!isInserted) {
heights.add(curHeight);
}
}
sb.append(tc).append(" ").append(totalSteps).append('\n');
}
br.close();
System.out.println(sb.toString());
}
}
고민 내용과 결론
- 총 걸음수를 어떻게 계산할 것인가.
- 일단 집어넣고, 전체 크기에서 (1 - j)를 해준다. j는 들어간 자리.
- 만약 큰 사람이 없다면 -> 그냥 add
아무래도 이번 문제는 node로 풀었다면 splice 무한 반복으로 귀찮았을지도 모르겠다.