Notice
Recent Posts
Recent Comments
Link
코딩 성장기
[중복순열] 가위바위보 모든 경우 출력하기 본문
한 사람이 3번의 기회에서 만들 수 있는 모든 가위바위보 조합을 출력한다.
가위/바위/보는 중복해서 낼 수 있으며, 바위(rock) > 보(paper) > 가위(scissors) 의 가중치를 갖는다.
내 코드(오답)
function rockPaperScissors () {
let resultSet = [];
let row = ['rock', 'rock', 'rock'];
let el = row.slice()
// 배열에 rock paper scissors 넣어두고, 요소를 꺼내서 사용하기
const SET = ['rock', 'paper', 'scissors'];
// 조합을 만든다
// row에 하나씩 추가한다.
// 3개가 입력되면 row 를 resultSet에 넣는다.
// 첫번째 요소 바꾸기
for(let i = 0; i < 3; i++){
el[0] = SET[i];
// 두번째 요소 바꾸기
for(let j = 0; j < 3; j++){
el[1] = SET[j];
// 세번째 요소 바꾸기
for(let k = 0; k < 3; k++){
el[2] = SET[k];
resultSet.push(el);
} el = row.slice()
}
} return resultSet;
};
얼핏보면 코드가 틀린 것 같지 않지만 결과를 개발자 도구를 이용해 확인하면 잘못된 값이 나온다.
for(let k = 0; k < 3; k++){
el[2] = SET[k];
resultSet.push(el);
} el = row.slice()
세번째 반복문에서 오류가 있었는데, resultSet에 들어간 배열 el이 모두 같은 주소값을 가지고 있으므로
el[2]에 새로운 값을 할당할때 마다, resultSet에 추가되어 있는 el[2] 값도 함께 변하기 때문에
중복되는 케이스들이 출력되는 문제가 발생했다.
따라서 새로운 값을 갖는 '새로운 배열'을 만들어서 resultSet에 추가시켜주어야 한다.
splice(), slice()메소드 모두.. 반복문에서는 동작기제를 파악하기 힘드므로, 사용을 지양한다.
내 코드(정답)
function rockPaperScissors () {
let resultSet = [];
// 배열에 rock paper scissors 넣어두고, 요소를 꺼내서 사용하기
const SET = ['rock', 'paper', 'scissors'];
// 첫번째 요소 바꾸기
for(let i = 0; i < 3; i++){
// 두번째 요소 바꾸기
for(let j = 0; j < 3; j++){
// 세번째 요소 바꾸기
for(let k = 0; k < 3; k++){
resultSet.push([SET[i], SET[j], SET[k]]) // 매번 새로운 배열을 생성해서 넣어줌
}
}
} return resultSet;
}
'알고리즘 공부 > Algorithm in JS' 카테고리의 다른 글
[Greedy] 최소 개수의 박스로 물건 나르기 (0) | 2022.04.05 |
---|---|
[Greedy] 최소 개수의 동전으로 거스름돈 주기 (0) | 2022.04.05 |
버블정렬 Bubble Sort (0) | 2022.03.07 |
점수에 따른 등급 리턴하기 (0) | 2022.01.24 |