[プログラマー]クレーン人形をつかむ
3734 ワード
1.質問
問題の説明
2019年のKACA開発者の冬のインターンシップでの問題です.板に人形を初期化し、クレーンで人形を掛け、別の場所に保存します.貯蔵されたぬいぐるみのうち、2つ以上のぬいぐるみが集まった場合、ぬいぐるみの爆発に伴って爆発したぬいぐるみの数が戻されます.
詳細は添付リンク.
せいげんじょうけん
I/O例
boardmovesreturn[[0,0,0,0,0],[0,0,1,0,3],[0,2,5,0,1],[4,2,4,4,2],[3,5,1,3,1]][1,5,3,5,1,2,1,4]4
2.アイデア
引き揚げられた人形を保存するリストを
リストを使用する理由:便利です.要素を削除すると、そのサイズも小さくなり、削除と挿入が容易になります.
이거때문에 다 해놓고 좀 해맸다
3.コード public class KakaoCrain {
public static int solution(int[][] board, int[] moves) {
int answer = 0;
List<Integer>store = new ArrayList<>();//크레인으로 건져올린 인형들이 저장되는 배열
//moves[i]의 값에 해당하는 board[*][i]를 찾아서 그 값을 store에 저장한다.
for(int i = 0 ; i < moves.length;i++){
int col = moves[i]-1;
for(int j = 0; j < board[col].length; j++){
if(board[j][col]!=0){
store.add(board[j][col]);
board[j][col] = 0;
break;
}
}
//store[]에 같은 것이 두번연속해서 쌓이면 PANG
if(store.size() >= 2) {
if (store.get(store.size()-2) == store.get(store.size()-1)) {
store.remove(store.size()-1);
store.remove(store.size()-1);
answer+=2;
}
}
}
return answer;
}
public static void main(String[] args) {
int[][] b = {{0,0,0,0,0},{0,0,1,0,3},{0,2,5,0,1},{4,2,4,4,2},{3,5,1,3,1}};
int[] m = {1,5,3,5,1,2,1,4};
System.out.println(solution(b, m));
}
}
初めて問題を見たときはスタックで解けると思っていましたが、スタックにはあまり詳しくないのでリストで解きました.
問題を解いた後、他の人が問題を解いているのを見ていると、スタックで問題を解いている人がいるので、そのコードを添付しました.class Solution {
public int solution(int[][] board, int[] moves) {
int answer = 0;
Stack<Integer> stack = new Stack<>();
for (int move : moves) {
for (int j = 0; j < board.length; j++) {
if (board[j][move - 1] != 0) {
if (stack.isEmpty()) {
stack.push(board[j][move - 1]);
board[j][move - 1] = 0;
break;
}
if (board[j][move - 1] == stack.peek()) {
stack.pop();
answer += 2;
} else
stack.push(board[j][move - 1]);
board[j][move - 1] = 0;
break;
}
}
}
return answer;
}
}
スタックを使用する場合は、新しいアイテムをスタックに入れる前に、スタックの一番上の要素と比較します.
4. end..
これはLevel 1の簡単な問題ですが、コードを書くのは一度もありません.何度もデバッグしましたが...
問題をよく読んで、次のコードを書くときに何の目的があるのかを注釈する練習をします.
Reference
この問題について([プログラマー]クレーン人形をつかむ), 我々は、より多くの情報をここで見つけました
https://velog.io/@paulus0617/프로그래머스크레인-인형-뽑기
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
public class KakaoCrain {
public static int solution(int[][] board, int[] moves) {
int answer = 0;
List<Integer>store = new ArrayList<>();//크레인으로 건져올린 인형들이 저장되는 배열
//moves[i]의 값에 해당하는 board[*][i]를 찾아서 그 값을 store에 저장한다.
for(int i = 0 ; i < moves.length;i++){
int col = moves[i]-1;
for(int j = 0; j < board[col].length; j++){
if(board[j][col]!=0){
store.add(board[j][col]);
board[j][col] = 0;
break;
}
}
//store[]에 같은 것이 두번연속해서 쌓이면 PANG
if(store.size() >= 2) {
if (store.get(store.size()-2) == store.get(store.size()-1)) {
store.remove(store.size()-1);
store.remove(store.size()-1);
answer+=2;
}
}
}
return answer;
}
public static void main(String[] args) {
int[][] b = {{0,0,0,0,0},{0,0,1,0,3},{0,2,5,0,1},{4,2,4,4,2},{3,5,1,3,1}};
int[] m = {1,5,3,5,1,2,1,4};
System.out.println(solution(b, m));
}
}
class Solution {
public int solution(int[][] board, int[] moves) {
int answer = 0;
Stack<Integer> stack = new Stack<>();
for (int move : moves) {
for (int j = 0; j < board.length; j++) {
if (board[j][move - 1] != 0) {
if (stack.isEmpty()) {
stack.push(board[j][move - 1]);
board[j][move - 1] = 0;
break;
}
if (board[j][move - 1] == stack.peek()) {
stack.pop();
answer += 2;
} else
stack.push(board[j][move - 1]);
board[j][move - 1] = 0;
break;
}
}
}
return answer;
}
}
これはLevel 1の簡単な問題ですが、コードを書くのは一度もありません.何度もデバッグしましたが...
問題をよく読んで、次のコードを書くときに何の目的があるのかを注釈する練習をします.
Reference
この問題について([プログラマー]クレーン人形をつかむ), 我々は、より多くの情報をここで見つけました https://velog.io/@paulus0617/프로그래머스크레인-인형-뽑기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol