문제 : https://www.acmicpc.net/problem/2947
동혁이는 나무 조각을 5개 가지고 있다. 나무 조각에는 1부터 5까지 숫자 중 하나가 쓰여져 있다. 또, 모든 숫자는 다섯 조각 중 하나에만 쓰여 있다. 동혁이는 나무 조각을 다음과 같은 과정을 거쳐서 1, 2, 3, 4, 5 순서로 만들려고 한다.
- 첫 번째 조각의 수가 두 번째 수보다 크다면, 둘의 위치를 서로 바꾼다.
- 두 번째 조각의 수가 세 번째 수보다 크다면, 둘의 위치를 서로 바꾼다.
- 세 번째 조각의 수가 네 번째 수보다 크다면, 둘의 위치를 서로 바꾼다.
- 네 번째 조각의 수가 다섯 번째 수보다 크다면, 둘의 위치를 서로 바꾼다.
- 만약 순서가 1, 2, 3, 4, 5 순서가 아니라면 1 단계로 다시 간다.
처음 조각의 순서가 주어졌을 때, 위치를 바꿀 때 마다 조각의 순서를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 조각에 쓰여 있는 수가 순서대로 주어진다. 숫자는 1보다 크거나 같고, 5보다 작거나 같으며, 중복되지 않는다. 처음 순서는 1, 2, 3, 4, 5가 아니다.
출력
두 조각의 순서가 바뀔때 마다 조각의 순서를 출력한다.
📌 문제 탐색하기
순서 비교하는 매 과정을 출력해야 한다.
1. for문으로 2개씩 값 비교
2. 한 번 비교할 때마다 전체 배열 출력
📌 코드 설계하기
1. 입력값 가져오기
-> arr= input.split(" ").map(Number)
2. while문으로 sort될 때까지 반복
3. for문으로 값 비교
-> 2개씩 값 비교를 하므로, 전체 배열 비교값을 출력하는 sort()는 사용x
-> arr[i-1]>arr[i] 일 경우 값 비교
4. 배열 뒤집기
-> 구조 분해 할당
let arr = [a, b];
[arr[0], arr[1]] = [arr[1], arr[0]];
console.log(arr); // [b, a]
4. 전체 배열 출력
-> arr.split(" ")
📌 시도 회차 수정 사항
[1회차]
- 어쩜 한 번에 맞은 적이 없다...
- 원인을 찾아보니 또다시 2가지 정도의 문제를 발견했다.
1. trim(), split()에 대한 이해 부족
-> split() : 문자열 -> 배열
-> join() : 배열 -> 문자열
2. 잘못된 배열 참조
-> const newArray = arr.sort((a, b) => a - b);
-> sort()의 특성상, arr과 newArray 모두 정렬된 상태가 된다.
-> 결국 원본 배열인 arr 정렬이 바뀌게 되는 문제 발생...
-> 원본배열의 복사본인 [...arr]를 사용해야 한다.
//실패 코드
const arr = require("fs")
.readFileSync(0, "utf-8")
.trim()
.split(" ")
.map(Number);
const newArray = arr.sort((a, b) => a - b);
while (arr !== newArray)
for (let i = 0; i < 4; i++) {
if (arr[i] > arr[i + 1]) {
[arr[i], arr[i + 1]] = [arr[i + 1], arr[i]];
console.log(arr.split(" "));
}
}
📌 정답 코드
const arr = require("fs")
.readFileSync(0, "utf-8")
.trim()
.split(" ")
.map(Number);
const newArray = [...arr].sort((a, b) => a - b);
while (arr.join(" ") !== newArray.join(" "))
for (let i = 0; i < 4; i++) {
if (arr[i] > arr[i + 1]) {
[arr[i], arr[i + 1]] = [arr[i + 1], arr[i]];
console.log(arr.join(" "));
}
}
해설 : https://whydevsaysno.notion.site/589c717103564b32bb7b2ac71dce9a05
'코딩테스트' 카테고리의 다른 글
[Javascript] 백준 2578 : 빙고 (0) | 2025.01.13 |
---|---|
[Javascript] 백준 7568 : 덩치 (0) | 2025.01.12 |
[Javascript] 백준 25305 : 커트라인 (0) | 2025.01.09 |
[Javascript] 백준 5635 : 생일 (1) | 2025.01.08 |
[Javascript] 백준 1181 : 단어 정렬 (0) | 2025.01.08 |