Skip to content
Home » 사다리 타기 코딩 | [스크래치3.0 예제 강의] 사다리타기 1편 – 사다리 그리기 주의사항 – 스크래치 코딩 예제 기초 강좌 상위 248개 답변

사다리 타기 코딩 | [스크래치3.0 예제 강의] 사다리타기 1편 – 사다리 그리기 주의사항 – 스크래치 코딩 예제 기초 강좌 상위 248개 답변

당신은 주제를 찾고 있습니까 “사다리 타기 코딩 – [스크래치3.0 예제 강의] 사다리타기 1편 – 사다리 그리기 주의사항 – 스크래치 코딩 예제 기초 강좌“? 다음 카테고리의 웹사이트 kk.taphoamini.com 에서 귀하의 모든 질문에 답변해 드립니다: https://kk.taphoamini.com/wiki. 바로 아래에서 답을 찾을 수 있습니다. 작성자 코드덤Code your dreams 이(가) 작성한 기사에는 조회수 5,463회 및 좋아요 22개 개의 좋아요가 있습니다.

사다리 타기 코딩 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 [스크래치3.0 예제 강의] 사다리타기 1편 – 사다리 그리기 주의사항 – 스크래치 코딩 예제 기초 강좌 – 사다리 타기 코딩 주제에 대한 세부정보를 참조하세요

이미지 파일 다운로드 : https://blog.naver.com/codethem/221705413151
블록코딩 스크래치 3.0으로 만드는 다양한 프로젝트!
오늘은 사다리타기 게임을 스크래치3.0으로 만들어 볼거에요.
먼저 그 첫시간으로 사다리를 직접 그려볼거랍니다.
어떻게 코딩하게 되냐에 따라 그리는 방법이 조금씩 다르지만,
저희가 만들어나갈 방식은 길이라든지, 색상이라든지, 그릴 때 주의해야할 사항들이 몇가지 있어요!
오늘 함께 사다리를 그려보고! 다음시간에 코딩으로 게임을 만들어 보아요!
블록코딩을 통해, 게임, 가상현실, 애니메이션, 뮤직 등 다양한 예제와 활용법을 소개하고, 초급 강좌부터 응용, 활용까지 함께 다양한 아이디어를 공유하는 채널입니다.
코딩은 배움을 우리 생활 속으로 녹여낼 수 있는 훌륭한 도구입니다. 코딩교육을 통해 배움과 실생활과의 경계가 허물어지고, 우리의 아이디어, 우리의 꿈이 현실에 조금 더 가까워질 수 있기를 바랍니다.

사다리 타기 코딩 주제에 대한 자세한 내용은 여기를 참조하세요.

사다리 타기 코딩 – 브런치

토요일 아침에 이렇게 건전한 목적으로 아빠들이 모여 코딩 관련 열띤 토론의 모습을 생각 … 이번 숙제는 스크래치로 사다리 타기 프로그램 만들기 1.

+ 여기에 보기

Source: brunch.co.kr

Date Published: 12/18/2021

View: 4435

사다리 게임 – 코딩도장

Main { static char[][] map; static int n,m; public static vo main(String[] args) { Scanner sc = new Scanner(System.in); n = Integer.

+ 여기에 표시

Source: codingdojang.com

Date Published: 8/11/2021

View: 1019

[자바] 사다리 타기 게임 소스코드 – 맛있는 번데기

코딩/자바. [자바] 사다리 타기 게임 소스코드. 매콤한 번데기탕 2020. 9 …

+ 더 읽기

Source: bundaegi.tistory.com

Date Published: 9/4/2021

View: 3006

TDD, Clean Code with Java – 미션3, 사다리 후기

이번 사다리타기는 예상보다 빨리 진행되었다 … 스트림과 람다 방식이 익숙해지고 예전 코딩 스타일은 이제 어색해졌다.

+ 여기에 자세히 보기

Source: loopstudy.tistory.com

Date Published: 3/28/2021

View: 1346

[백준 – Java] 15684번 : 사다리 타기 – ˖˚˳⊹ 안 까먹을려고 ˚₊‧ ੈ

문제 www.acmicpc.net/problem/15684 15684번: 사다리 조작 사다리 게임은 N개의 세로선과 M개의 가로선으로 이루어져 있다.

+ 여기에 자세히 보기

Source: minhamina.tistory.com

Date Published: 1/29/2021

View: 3153

[백준] 2469. 문자열_사다리타기 – Python

참가자들은 알파벳 대문자 첫 k개로 표현되며, 사다리 타기를 시작할 때의 순서는 아래 그림과 같이 항상 알파벳 순서대로이다. k=10 인 예를 들어 보자.

+ 여기에 더 보기

Source: westernriver.tistory.com

Date Published: 4/8/2021

View: 2943

2022 사다리 타기 게임 알고리즘-코딩테스트

알고리즘-코딩테스트: 사다리게임 주제를 소개합니다. 기사의 아래 세부 정보를 참조하십시오. 게시물에는 이미 1915 및 35 조회수가 있습니다.

+ 자세한 내용은 여기를 클릭하십시오

Source: kr.azpet.org

Date Published: 5/27/2022

View: 1506

주제와 관련된 이미지 사다리 타기 코딩

주제와 관련된 더 많은 사진을 참조하십시오 [스크래치3.0 예제 강의] 사다리타기 1편 – 사다리 그리기 주의사항 – 스크래치 코딩 예제 기초 강좌. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

[스크래치3.0 예제 강의] 사다리타기 1편 - 사다리 그리기 주의사항 - 스크래치 코딩 예제 기초 강좌
[스크래치3.0 예제 강의] 사다리타기 1편 – 사다리 그리기 주의사항 – 스크래치 코딩 예제 기초 강좌

주제에 대한 기사 평가 사다리 타기 코딩

  • Author: 코드덤Code your dreams
  • Views: 조회수 5,463회
  • Likes: 좋아요 22개
  • Date Published: 2019. 11. 7.
  • Video Url link: https://www.youtube.com/watch?v=H9mrcO23OVI

사다리 타기 코딩

메모리에 저장해서 갈 것인가 아니면 센서로 찾아갈 것인가?

10월 아빠들의 코딩 모임을 동탄 토즈에서 진행했다.

4명의 아빠들… 토요일 아침에 이렇게 건전한 목적으로 아빠들이 모여 코딩 관련 열띤 토론의 모습을 생각하면 모임이 끝난 후 왠지 스스로 대견하다 생각하며 씨익 웃게 만든다.

이번 숙제는 스크래치로 사다리 타기 프로그램 만들기

1. 랜덤 하게 사다리를 긋기

2. 화살표가 길 따라가기

따식님이 위 동영상을 카톡으로 던져주고 각자 해 오라는 것이다.

숙제 검사 결과 숙제를 내 준 사람과 첨물님만 해 옴 -.-

그럼 어떻게 코딩을 했는지 살펴보았다.

먼저 첨물님. 두 가지 방식으로 진행했다.

1. 화살표가 가야 할 길을 미리 알고 따라 가는 경우,

2. 화살표가 사다리를 만났을 때, 조건문을 써서 알아서 찾아가는 경우,

우선 첨물님은 사다리를 랜덤 하게 만들지는 않고, 도장 찍기로 가로선과 세로선을 특정 위치에 만들었다.

그리고 난 후, 1~4번 세로선 각각에서 화살표가 가는 길을 리스트에 넣었다.

넣을 때, 화살표가 직진은 0, 좌회전은 +1, 우회전은 -1을 넣었다. 총 10번의 움직임에 끝까지 도달하도록 했기 때문에 10개의 숫자가 하나의 리스트에 들어가게 되는 것이다.

위와 같이 세팅을 하면, 1~4번 세로선 위치에서 화살표가 출발할 때, 화살표가 가야 하는 정보가 모두 리스트에 들어가 있으므로 B라는 변수(어디로 가야 하는지 정하는 변수)에 0, +1, -1이 들어가 있는지 보고, 각각 동작을 취하면 된다. 그걸 하나의 세로선에서 10회 반복하면 가장 아래 위치까지 도달하게 된다.

그러나 아쉬움이 남았다. 이렇게 화살표가 모두 가야 할 곳을 알고 있도록 코딩을 해 놓으면 사다리가 달라졌을 때, 매번 위치 정보를 넣어주어야 한다. 만약 길 따라가는 로봇으로 임의의 사다리 지도 위에서 따라가게 만들어야 하고, 사다리 정보를 모른다면 어떻게 해야 할 것인가?

그래서 코딩을 수정했다. 사다리의 교차점에서 화살표가 판단해가면서 가도록…

그러기 위해서 화살표에 센서를 달았다. 노란색과 녹색. 그리고 노란색 센서가 15도 좌회전해서 파란색 사다리 가로선을 만나면 좌회전, 녹색 센서가 우회전에서 파란색 사다리를 만나면 우회전을, 이도 저도 아니면 직진으로 가도록 했다. 즉 위에서 B값을 A라는 리스트에서 고르는 것이 아니라, 화살표가 움직이면서 좌우로 약간씩 회전해가면서 스스로 판단해서 0, +1, -1을 정하는 방법이다.

사실 이러한 방법은 레고의 마인드스톰에서 길 따라가는 코드에서 참고하였다. 마인드스톰에는 빛 센서가 있어서 좌우로 약간씩 회전하면서 검은색이 아니면 다시 제자리로 오도록 하는 알고리듬으로 검은색 라인을 따라가도록 한다. 이 원리를 스크래치 사다리 타기에 그대로 이용하는데, 단지 가로선을 만났을 때, 어디로 회전해야 할지를 두 개의 센서를 달아서 판단한 것이다. 레고의 마인드스톰처럼 하나의 센서로 줄이는 방법도 더 해 볼 예정이다.

첨물님의 설명 후에 사다리의 가로선이 세로선과 같은 검은색이면 어떻게 하느냐와 화살표에 좌우 날개에 큼직하게 붙이지 않고 보이지 않게 할 수는 없느냐 하는 의견이 있었다.

그리고 본격적으로 숙제를 내준 따식님의 코드 설명이 있었다.

1. 사다리 랜덤으로 그리기

– 펜 내리기와 펜 올리기 : 마치 펜을 기계에 붙여서 내리면 그어지고 올리면 그리지 않는 기능

– 세로선은 반복문을 사용하여 5개를 그리도록 한다.

– 가로선 긋기 : 두 개의 세로선 사이의 가로선을 긋는데, 20 등분하여 랜덤 변수를 사용하여 리스트에 각각에 0, 1을 넣어 긋기와 긋지 않는 조건을 넣어둔다. 그렇게 총 4회를 진행하여 가로선 전부의 조건표를 또 다른 리스트에 넣는다.

위에서 ladder 리스트 변수는 20개의 가로선 유무를 정하는 숫자가 들어가는 것이고, 이것을 4회 진행했을 때, 각각을 number of line이라는 리스트에 붙여 넣어서 구별해 놓는 것이다.

그런데 여기서 고려해야 할 점이 있다. 어떤 위치에서 가로선이 왼편에 있으면, 오른편에는 가로선이 없어야 사다리 게임이 된다. 위 number of line에서 1번행과 2번행에 20개의 숫자가 들어가는데, 왼쪽부터 0, 1이 들어가는데, 같은 위치에 1이 들어가 있으면 안된다는 것이다. 이걸 어떻게 만들 수 있을까?

2번행에 20개 방에 0, 1을 랜덤 하게 넣을 때, 1번행에 해당 위치에 0이 있을 때에만 랜덤수를 넣고, 1이 있을 경우엔 0을 넣도록 한다. 0번행은 모두 0이 들어가 있으므로 1번행은 20개의 방에 0, 1을 랜덤 하게 넣어둔다. 그리고 그 20개 세트를 또 다른 number of line에 모아둔다.

그리고나서 2번행의 20개의 방에 0, 1을 넣을 때엔 ladder라는 리스트(이것은 1번행의 정보를 담고 있다.)에서 각각의 방에 0이 있을 경우에만 0 또는 1을 넣고, 1이 있을 때는 무조건 0으로 넣는다. 그래야 연속적으로 가로선이 그려지지 않는다. 좀 복잡하지만 이렇게 랜덤 사다리 긋기를 코드를 만들었다.

2. 화살표 움직이기

number of list에 각각의 가로선 정보가 리스트에 들어가 있다.

그러나 직진, 우회전, 좌회전으로 들어가 있지 않고, 가로선이 있느냐와 없느냐로 구성되어 있다.

그러면 어떻게 화살표는 왼쪽과 오른쪽을 알아낼 수 있을까?

여기서 변수 3개를 만들자

1) Player 변수 : 세로선의 어디서부터 시작하는가에 대한 것, 첫 번째 세로선에서 시작하면 Player=1

2) ladder No 변수 : 화살표가 5개의 세로선 중 어느 선에 있느냐에 대한 수, 화살표가 움직이면서 계속 바뀜

3) N 변수 : 세로선의 길이를 12 등분하고, 한 단위씩 움직일 때마다 1씩 증가, 12등분 중 하나에 가로선이 있음

그럼 화살표가 움직이는 걸 해 보자. 아래와 같이 사다리가 있다고 가정하자.

Player=2에서 화살표는 시작한다고 할 때, ladder No=Player=2의 첫 번째 줄(N=1)에 가로선이 있는지 확인한다. number of list의 두 번째에서 첫 번째 글자를 확인하니 0

그리고 그 왼쪽 ladder의 수도 확인, 즉 ladder No=1 의 첫 번째(N=1)의 number of list 의 첫째 글자도 0

그러면 Player 변수는 변함이 없고, 직진한다.(Player=2)

N=2으로 바뀐다. 다시 ladder no=1에 가로선이 있는지 확인한다. 1이 있다. 그러면 Player 변수는 1을 더하고 오른쪽으로 이동한다. (Player=3)

N=3으로 바뀐다. 이번엔 ladder no=3에 가로선이 있는지 확인한다. 없다. 그리고 왼쪽을 본다. ladder no=2의 세 번째 수가 1이다. 그러면 Player는 1을 빼고 왼쪽으로 이동한다.(Player=2)

N=4으로 바뀐다. 이번엔 ladder no=2에 가로선이 있는지 확인한다. 없다. 그리고 왼쪽을 본다. ladder no=1의 네 번째 수가 1이다. 그러면 Player는 1을 빼고 왼쪽으로 이동한다.(Player=1)

N=5으로 바뀐다. 이번엔 ladder no=1에 가로선이 있는지 확인한다. 있다. 그러면 그러면 Player는 1을 더하고 오른쪽으로 이동한다.(Player=2)

이런 식으로 화살표가 이동해간다.

코딩 내용은 아래와 같다.

다소 복잡하지만 매우 고급 기술을 써서 화살표 움직임을 구현한 것에 다들 놀라워 했다.

다만 이 방법또한 화살표의 움직임에 대한 정보가 미리 메모리에 저장되어 있고, 화살표는 이것에 따라 움직여가는 원리이다.

다들 이런 걸 고민하고 있다는 것에 나름 자부심을 가지고 한단계 더 나아가는 문제를 만들어서 다음에 보기로 했다.

다음 주제는 ‘미로 찾기’

기대가 된다. ‘아빠들의 코딩 모임’의 미래가 ^^

마이크로비트로 만든 사다리타기도 …

[자바] 사다리 타기 게임 소스코드

import java.util.*; public class RedrawLadder2 { Scanner scan = new Scanner(System.in); PeopleNumber pn = new PeopleNumber(); DrawLadder dl = new DrawLadder(); Random random = new Random(); String [] arr = {“│”, “├”, “──”, “┤”}; int b = 0; public void redrawLadder(int a, int height, String[] stuff, String[] name, String[] c) { for(int i = 0; i < c.length; i++) { System.out.print((i + 1) + ". " + name[i]); for(int j = 0; j < 5; j++) { System.out.print(" "); } } System.out.println(); for(int i = 0; i < stuff.length; i++) { System.out.print((i + 1)); for(int j = 0; j < 5; j++) { System.out.print(" "); } } System.out.println(); for(int i = 0; i < a; i++) { System.out.print("│"); for(int j = 0; j < 5; j++) { System.out.print(" "); } } System.out.println(); //초반 1번라인 찍는 로직 for(int k = 0; k < (height - 2); k++) { for(int i = 0; i < a; i++) { if(b == 1 && i != 0) { b = 3; } else if(i == a - 1) { if(b == 1) { b = 3; } else { b = 0; } } else { b = random.nextInt(2); } System.out.print(arr[b]); if(b == 1 && i != a - 1) { for(int j = 0; j < 5; j++) { System.out.print("─"); } } else { for(int j = 0; j < 5; j++) { System.out.print(" "); } } if(b == 1) { c[i] = name[i + 1]; c[i + 1] = name[i]; } for(int q = 0; q < c.length; q++) { name[q] = c[q]; } } System.out.println(); } //중간라인 찍는 로직 for(int i = 0; i < a; i++) { System.out.print("│"); for(int j = 0; j < 5; j++) { System.out.print(" "); } } System.out.println(); for(int i = 0; i < stuff.length; i++) { System.out.print((i + 1)); if(i >= 9) { for(int j = 0; j < 4; j++) { System.out.print(" "); } }else { for(int j = 0; j < 5; j++) { System.out.print(" "); } } } System.out.println(); for(int i = 0; i < stuff.length; i++) { System.out.print((i + 1) + ". " + stuff[i]); for(int j = 0; j < 5; j++) { System.out.print(" "); } } System.out.println(); System.out.println(); System.out.println(); //마지막 라인 찍는 로직 for(int i = 0; i < c.length; i++) { System.out.println(); System.out.print(c[i] + "님 : " + stuff[i]); } } } ​ import java.util.*; public class LadderMain { Scanner scan = new Scanner(System.in); PeopleNumber pn = new PeopleNumber(); DrawLadder dl = new DrawLadder(); RedrawLadder2 rl2 = new RedrawLadder2(); public LadderMain() { doProcess(); } public void doProcess() { //참가자 인원을 받는다(경품의 수를 정한다.) pn.doProcess(); //사다리를 그린다. dl.drawLadder(pn.a, pn.height, pn.stuff); //콘솔창을 초기화한다. nullPoint(); rl2.redrawLadder(pn.a, pn.height, pn.stuff, pn.name, pn.c); } public void nullPoint() { for(int i = 0; i < 100; i++) { System.out.println(); } } public static void main(String[] args) { new LadderMain(); } } import java.util.*; public class PeopleNumber { Scanner scan = new Scanner(System.in); int a; int height; String [] stuff; String [] name; String [] c; public void doProcess() { peopleNum(); peopleName(); scanStuff(); scanHeight(); } public void peopleNum() { System.out.print("참가 인원 수를 입력하세요 : "); a = scan.nextInt(); c = new String [a]; } public void peopleName() { name = new String[a]; System.out.print("참가자 이름을 입력하세요 : "); for(int i = 0; i < name.length; i++) { name[i] = scan.next(); c[i] = name[i]; } for(int i = 0; i < name.length; i++) { System.out.println("이름 : " + (i + 1) + ". " + name[i]); } } public void scanStuff() { stuff = new String [a]; System.out.print("경품을 입력하세요: "); for(int i = 0; i < stuff.length; i++) { stuff[i] = scan.next(); } for(int i = 0; i < stuff.length; i++) { System.out.println("경품 : " + (i + 1) + ". " + stuff[i]); } } public void scanHeight() { System.out.print("높이를 설정해주세요 : "); height = scan.nextInt(); } } import java.util.*; public class DrawLadder { Scanner scan = new Scanner(System.in); Random random = new Random(); PeopleNumber pn = new PeopleNumber(); public void drawLadder(int a, int height, String[] stuff) { for(int i = 0; i < height; i++) { for(int j = 0; j < a; j++) { for(int k = 0; k < 5; k++) { System.out.print(" "); } System.out.print("│"); } System.out.println(); } for(int i = 0; i < a; i++) { for(int j = 0; j < 2; j++) { System.out.print(" "); } System.out.print(stuff[i]); } } }

TDD, Clean Code with Java

경험해야할 학습 목표

자바8의 스트림, 람다를 사용해 함수형 프로그래밍하는 경험

In -> Out, Out -> In 방식으로 도메인 객체를 설계하는 경험

책임주도설계 기반으로 인터페이스 활용해 프로그래밍하는 연습

경험할 객체지향 생활 체조 원칙

규칙 4: 한 줄에 점을 하나만 찍는다. Clean Code 가이드의 디미터 법칙을 지키는 것을 의미한다.

규칙 6: 모든 엔티티를 작게 유지한다.

규칙 7: 3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다.

규칙 9: 게터/세터/프로퍼티를 쓰지 않는다.

미션3, 사다리타기 후기다.

자동차경주, 로또에서 많은 걸 배운 덕분에

이번 사다리타기는 예상보다 빨리 진행되었다

이번엔 지적당한게 많이 없었다!

step1, 자바8 스트림, 람다, Optional

자바8 에서 제공하기 시작한 막강한 기능들을 사용하는 학습형 단계다.

제공되는 레거시 기반 예제에서 스트림, 람다, Optional 으로 리팩토링한다.

스트림, 람다를 사용한지 한달이 되었다.

스트림과 람다 방식이 익숙해지고 예전 코딩 스타일은 이제 어색해졌다.

Optional 은 스트림,람다 보다 사용하기 시작했지만

백기선님의 자바8 에서 학습하여 금방 익숙해지고 있다.

step2, 사다리(생성)

본격적인 사다리 미션에 돌입했다.

사다리의 프로그래밍 요구사항이다

자바 8의 스트림과 람다를 적용해 프로그래밍한다.

규칙 6: 모든 엔티티를 작게 유지한다

사다리를 임시로 그려보았다.

|—–| |—–|

| |—–| |

|—–| | |

사다리를 분석해보니 다음과 같은 요소가 파악되었다.

1. 연속적으로 라인을 연결할 수가 없다.

2. 라인을 띄엄띄엄 반드시 그릴 필요가 없다. 라인이 없을 수도 있다.

연속적으로 라인을 그릴 수 없다.

사다리를 그릴 때 이전 라인을 다음 라인에 보내야한다는 뜻으로

이걸 어떻게 해야할까? 온갖 생각을 했다가 결국엔 재귀함수로 구현했다.

그리고 받은 피드백…

추가적인 피드백을 드려보면 재귀로 코드를 구현하는 것은 한번 고민해보실 필요가 있는 부분입니다.

왜냐하면 해당 코드는 현철님 뿐만 아니라 동료가 유지보수해야할 상황이 올 수 있는데

재귀로 코드를 구현한다면 동작 과정을 쉽게 이해하지 못할수도 있다고 생각이 됩니다 🙂

재귀함수는 너무 먼 방식이였고😂

재귀함수 대신 외부변수 하나를 사용하는 스트림으로 간단하게 대체가 되었다🙈

step3, 사다리(게임 실행)

이제 사다리 결과를 입력하고 사다리 실행을 하는 과정이다.

이번 단계에서 중복되는 상수들이 많아 각체마다 관리할지, 중복되는 상수를 상수클래스로 놓을지 고민하기도 하고

생성자에 인자를 보낼 때 인스턴스필드보다 많이 보내도 될지 고민도 해보고

다양한 고민을 하게 해준 단계였고, 정답이 안 나와 리뷰어에게 질문을 던지면서 제출을 하게된다.

개선할 사항이 여럿 존재했는데 여기서 언급할 건

Stream.forEach 와 Collection.forEach 를 구분해야한다면서 링크와 함께 장문 코멘트를 달아주셨다.👍👍👍

step4, 사다리 (리팩토링)

이번 단계는 이전 단계에서 피드백 받은걸 리팩토링 하는 간단한 단계이며,

토비님이 제공해주는 코드를 기반으로 리팩토링하는 선택지도 존재한다.

나는 내 코드를 리팩토링하는걸 선택했다. (토비님이 제공해주는 코드는 완주 후 진행하는걸로~👏)

이전 피드백으로 받은 것중 가장 예상치도 못한게 하나 있다.

바로 실행 결과를 저장할 때 Map 형식으로 key 는 이름을 넣고, value 는 결과를 넣었는데

Map 형식으로 key, value 에 객체를 넣어달라는 것!

value 에 객체를 넣는 방식은 많이 해봐서 익숙하지만

key 에 객체를 넣는건 상상도 못했다! ㄴㅇㄱ!!!

진행하면서 key 에 객체를 넣으면 어떻게 비교를 해야할까 고민도 하고 했지만

해당 객체의 유니크한 값으로 비교하는 형식으로 진행하고 제출을 하면서 key 에 객체를 넣을 경우 어떻게 비교하냐 질문도 남겼다.

그리고 받은 답변 중 일부분

도메인이 key – value를 String – String으로 관리하는 데이터 위주의 구조를 객체로 관리함으로써,

객체가 자료구조나 함수의 집합이 아닌 자신만의 생명주기, 행위, 습관을 지닌 독립적인 개체로 다룰 수 있는 이점이 있습니다.

또한 Map은 어떤 데이터를 관리하는지, 그리고 왜 관리하려 하는지 한 눈에 알 수 없지만

Map으로 다룬다면 플레이어에 따른 게임 결과값이 매핑되었다는 것을

한눈에 알아볼 수 있는 이점이 있고 해당 자료구조를 관리하고 있는 클래스 네이밍에 맞게 책임도 쉽게 파악할 수 있다고 생각합니다.

👍👍👍👍👍👍

후기

이전에 많은 고난이 있었는지 이번 미션은 하루에 한번씩 4일만에 통과가 되었다👏👏👏👏

금방 통과되어서 솔직히 어정쩡하기도 하다.

빨리 통과된 만큼 설계가 좋았다고 생각하자.

이번 사다리를 진행하면서

외부 변수를 이용하여 스트림을 다양하게 활용할 수 있는걸 알게되었고,

Map 를 사용하는 것도 객체지향적으로 접근하는 방법도 배웠다.

그 외에도 여러가지를 배웠다.

이제는 마지막 미션 볼링이 남았다.

가장 난이도가 높다는데 한번 부딪혀보러 가야겠다.

[백준 – Java] 15684번 : 사다리 타기

반응형

문제

www.acmicpc.net/problem/15684

설명

자잘한 실수도 많이 하고, 필요 없는 map을 만든다 거나, class로 좌표를 저장하고 ArrayList에 넣었다 뺐다, ArrayList를 복사하던가

삽질을 겁나 많이 했음.

막상 풀고나니 별거 없었고, 나는 4차원 배열까지 써서 해결했는데, 2차원 배열만 썼어도 됨…

삼성 SW역량테스트 기출문제인데, 나는 아마 주어진 3시간 동안 이 문제 계속 쩔쩔매다가 왔을 듯;;;;ㅜㅜ아웅ㅇ 열 받아!!!!!

가로선이 N열에서 시작한다면 N+1까지 이어짐.

그래서 boolean타입 4차원 배열을 사용해 가로선이 있는 경우 N열 -> N+1열 / N <- N+1 두 경우를 true로 저장 visited[a][b][a][b+1] = true; visited[a][b+1][a][b] = true; ex) (1, 1)에서 시작해 (1, 2)에서 끝나는 가로선은 1열 입장에서는 아래 코드와 같고, visited[1][1][1][2] = true; 2열 입장에서는 아래 코드와 같다. visited[1][2][1][1] = true; 가로선을 놓는 것은 마치 조합을 구하는 알고리즘과 비슷하게 DFS를 사용해서 구현. 1, 2, 3 개수를 늘려가며 DFS로 모든 N * H의 좌표를 돌며 가로선을 놓아봄. (사다리 판을 2차원 배열처럼 생각하면 됨) 가로선을 놓았다면 check() 함수를 만들어 사다리를 타봄. - i번 세로선이 i에 대응하면 성공, 그때의 가로선 개수를 출력하고 프로그램 종료. - 대응할 수 없다면 계속해서 DFS 진행. - 3까지 가로선을 놓아봤지만 성공할 수 없다면 -1을 출력하고 종료. 그리고 추가로 고려해야 할 점! 가로선이 하나도 없는 M = 0인 경우, -1을 출력하고 종료. 가로선을 추가 안 하고도 i번 세로선이 i에 대응한다면 성공, 0 출력하고 종료 전체 코드 import java.util.Scanner; public class Main { static int N, M, H; static boolean[][][][] visited; public static void main(String[] args) { Scanner sc = new Scanner(System.in); N = sc.nextInt(); M = sc.nextInt(); H = sc.nextInt(); if(M == 0) { // 가로선 없는 경우 System.out.println("0"); System.exit(0); } visited = new boolean[H+1][N+1][H+1][N+1]; for(int i = 0; i < M; i++) { int a = sc.nextInt(); int b = sc.nextInt(); visited[a][b][a][b+1] = true; visited[a][b+1][a][b] = true; } check(0); // 가로선을 추가 안해도 가능한 경우 for(int i = 1; i <= 3; i++) // 놓을 가로선 수 dfs(i, 0, i); System.out.println(-1); // 불가능 } // 조합을 구하는 알고리즘과 비슷하게 DFS로 추가할 가로선 개수 n만큼 가로선을 놓아봄 public static void dfs(int n, int depth, int cnt) { if(depth == n) { // n개의 가로선을 다 놓았을 때 check(cnt); // i -> i 대응하는지 검사 return; // 재귀 종료 } // N-1에서 가로선 왼->오 (x, y) -> (x, y+1) / 오->왼 (x, y+1) -> (x, y) 다 설정하기 때문에 N까지만 for(int i = 1; i < H+1; i++) { for(int j = 1; j < N; j++) { // 현재 좌표에 사다리가 있는 경우 if(j+1 < N+1 && visited[i][j][i][j+1]) { j++; // 현재 열 + 2 부터 확인하면 됨 continue; } // 현재 좌표 + 1(오른쪽)에 사다리가 있는 경우 else if(j+2 < N+1 && visited[i][j+1][i][j+2]) { j += 2; // 현재 열 + 3부터 확인하면 됨 continue; } // 현재 좌표 - 1(왼쪽)에 사다리가 있는 경우 else if(j-1 > 0 && visited[i][j][i][j-1]) { continue; } // 조건 모두 통과 -> 가로선 놓아봄 // 현재 좌표를 true로 만들어 가로선을 놓았다고 침 visited[i][j][i][j+1] = true; visited[i][j+1][i][j] = true; // 가로선을 놓았으니 depth에 1을 추가하고 다시 DFS dfs(n, depth+1, cnt); // 다음 DFS를 위해 선택한 좌표를 false로 만들어 가로선 놓은걸 취소 visited[i][j][i][j+1] = false; visited[i][j+1][i][j] = false; } } } // i번 세로선이 i번에 대응하는지 검사 public static void check(int cnt) { for(int i = 1; i < N+1; i++) { int cx = 1; // 1행부터 시작해서 내려감 int cy = i; while(cx != H+1) { // H행을 넘을때까지 사다리 타기 // 현재 좌표 오른쪽에 가로선이 있는 경우 -> 오른쪽으로 이동 if(cy+1 < N+1 && visited[cx][cy][cx][cy+1]) cy = cy+1; // 현재 좌표 왼쪽에 가로선이 있는 경우 -> 왼쪽으로 이동 else if(cy – 1 > 0 && visited[cx][cy][cx][cy-1]) cy = cy-1; cx++; // 가로선이 있든 없든 아래로 내려감 } if(cy != i) return; // 실패 – i번 세로선의 결과가 i X } // 성공 – i번 세로선의 결과가 i번 System.out.println(cnt); System.exit(0); } }

* 비슷한데 다른 코드

더보기 DFS 수행 시, 현재 좌표, 현재 좌표 +1, 현재 좌표 -1 검사하는 것을 dy 배열과 for문으로 구현함. import java.util.Scanner; public class Main { static int N, M, H; static boolean[][][][] visited; public static void main(String[] args) { Scanner sc = new Scanner(System.in); N = sc.nextInt(); M = sc.nextInt(); H = sc.nextInt(); if(M == 0) { // 가로선 없는 경우 System.out.println(“0”); System.exit(0); } visited = new boolean[H+1][N+1][H+1][N+1]; for(int i = 0; i < M; i++) { int a = sc.nextInt(); int b = sc.nextInt(); visited[a][b][a][b+1] = true; visited[a][b+1][a][b] = true; } check(0); // 가로선을 추가 안해도 가능한 경우 for(int i = 1; i <= 3; i++) { // 추가할 가로선 개수 dfs(i, 0, i); } System.out.println(-1); // 불가능 } // 조합을 구하는 알고리즘과 비슷하게 DFS로 추가할 가로선 개수 n만큼 가로선을 놓아봄 public static void dfs(int n, int depth, int cnt) { if(depth == n) { // n개의 가로선을 다 놓았을 때 check(cnt); // i -> i 대응하는지 검사 return; // 재귀 종료 } // N-1에서 가로선 (x, y) -> (x, y+1) / (x, y+1) -> (x, y) 다 설정하기 때문에 N까지만 for(int i = 1; i < H+1; i++) { for(int j = 1; j < N; j++) { // 현재 위치, 현재 -1 위치, 현재 +1 위치에 가로선을 놓을 수 있는지 검사 int[][] dy = {{0, 1}, {-1, 0}, {1, 2}}; boolean flag = true; for(int k = 0; k < 3; k++) { int ny1 = j + dy[k][0]; int ny2 = j + dy[k][1]; // 범위 벗어나는 경우 pass if(ny1 <= 0 || ny2 <= 0 || ny1 >= N+1 || ny2 >= N+1) continue; // 이미 다른 가로선이 있음 -> 놓을 수 X if(visited[i][ny1][i][ny2]) { flag = false; break; } } if(flag) { // 조건 모두 통과 -> 가로선 놓아봄 // 현재 좌표를 true로 만들어 가로선을 놓았다고 침 visited[i][j][i][j+1] = true; visited[i][j+1][i][j] = true; // 가로선을 놓았으니 depth에 1을 추가하고 다시 DFS dfs(n, depth+1, cnt); // 다음 DFS를 위해 선택한 좌표를 false로 만들어 가로선 놓은걸 취소 visited[i][j][i][j+1] = false; visited[i][j+1][i][j] = false; } } } } // i번 세로선이 i번에 대응하는지 검사 public static void check(int cnt) { for(int i = 1; i < N+1; i++) { int cx = 1; // 1행부터 시작해서 내려감 int cy = i; while(cx != H+1) { // H행을 넘을때까지 사다리 타기 if(cy+1 < N+1 && visited[cx][cy][cx][cy+1]) { // 오른쪽에 가로선 cy = cy+1; // 오른쪽 가로선으로 이동 cx++; // 아래로 내려감 } else if(cy - 1 > 0 && visited[cx][cy][cx][cy-1]) { // 왼쪽 cy = cy-1; // 왼쪽 가로선으로 이동 cx++; // 아래로 내려감 } else { // 왼쪽, 오른쪽에 가로선이 둘 다 없음 cx++; // 아래로 내려감 } } if(cy != i) return; // 실패 – i번 세로선의 결과가 i X } // 성공 – i번 세로선의 결과가 i번 System.out.println(cnt); System.exit(0); } }

GITHUB

github.com/KwonMinha/BOJ/blob/master/BOJ%2315684/src/Main.java

반응형

[백준] 2469. 문자열_사다리타기 – Python

문제

k명의 참가자들이 사다리 타기를 통하여 어떤 순서를 결정한다. 참가자들은 알파벳 대문자 첫 k개로 표현되며, 사다리 타기를 시작할 때의 순서는 아래 그림과 같이 항상 알파벳 순서대로이다.

k=10 인 예를 들어 보자. 10명의 A, B, C, D, E, F, G, H, I, J 참가자들이 사다리 타기를 준비한다. 아래 그림은 10개의 세로 줄과 5개의 가로 줄을 가지고 있는 사다리의 한 예를 보여주고 있다.

이 사다리에서 점선은 가로 막대가 없음을, 굵은 가로 실선은 옆으로 건너갈 수 있는 가로 막대가 있음을 나타내고 있다.

따라서 위에 제시된 사다리를 타면 그 최종 도달된 순서는 왼쪽으로부터 A, C, G, B, E, D, J, F, I, H 가 된다.

사다리 타기는 세로 막대를 타고 내려오는 중에 가로막대를 만나면 그 쪽으로 옮겨 가면서 끝까지 내려가는 과정이다. 따라서 사다리 타기의 규칙 특성상 아래 그림과 같이 두 가로 막대가 직접 연결될 수는 없으므로 이 상황은 이 문제에서 고려할 필요가 없다.

우리는 하나의 가로 줄이 감추어진 사다리를 받아서 그 줄의 각 칸에 가로 막대를 적절히 넣어서 참가자들의 최종 순서가 원하는 순서대로 나오도록 만들려고 한다.

입력에서 사다리의 전체 모양은 각 줄에 있는 가로 막대의 유무로 표현된다. 각 줄에서 가로 막대가 없는 경우에는 ‘*’(별)문자, 있을 경우에는 ‘-’(빼기) 문자로 표시된다. 그리고 감추어진 특정 가로 줄은 길이 k-1인 ‘?’ (물음표) 문자열로 표시되어 있다.

입력

첫 줄에는 참가한 사람의 수 k가 나온다(3≤k≤26). 그 다음 줄에는 가로 막대가 놓일 전체 가로 줄의 수를 나타내는 n이 나온다(3≤n≤1,000). 그리고 세 번째 줄에는 사다리를 타고 난 후 결정된 참가자들의 최종 순서가 길이 k인 대문자 문자열로 들어온다.

k와 n, 그리고 도착순서 문자열이 나타난 다음, 이어지는 n개의 줄에는 앞서 설명한 바와 같이 ‘*’와 ‘-’ 문자로 이루어진 길이 k-1인 문자열이 주어진다. 그 중 감추어진 가로 줄은 길이가 k-1인 ‘?’ 문자열로 표시되어 있다.

출력

입력 파일 세 번째 줄에서 지정한 도착순서가 해당 사다리에서 만들어질 수 있도록 감추어진 가로 줄을 구성해야 한다.

여러분은 감추어진 가로 줄의 상태를 재구성하여 이를 ‘*’(별) 문자와 ‘-’(빼기) 문자로 구성된 길이 k-1인 문자열로 만들어 출력하면 된다.

그런데 어떤 경우에는 그 감추어진 가로 줄을 어떻게 구성해도 원하는 순서를 얻을 수 없는 경우도 있다. 이 경우에는 ‘x’(소문자 엑스)로 구성된 길이 k-1인 문자열을 출력해야 한다.

———————————————————————————————————————————–

★ 시작하기 전에

길다 길어~~ 문제 참 길다~~

그래도 읽다보니 재미있을 것 같았다. 코드가 길어질 것 같았다.

중앙에 사다리를 어떻게 둘 것인가.

비어있는 사다리의 바로 위 직전의 배열 상태, 바로 직후의 배열 상태를 안다면, 모양을 결정할 수 있지 않을까.

??? 배열 이전까지를 left 배열에 두고

??? 배열 이후를 right 배열에 두고

left 에서 사다리를 하나씩 꺼내 처음상태(A,B,C,D,E,F,—)에서 변화시킨다.

right에서 사다리를 하나씩 꺼내 마지막상태(A,C,G,B,E,—)에서 변화시킨다.

???? 직전 직후의 상태를 알게 된다면, ???의 모양을 결정할 수 있다.

import sys input = sys.stdin.readline n = int(input()) m = int(input()) #마지막 모양과 처음 모양을 정해준다. 각 for 반복에 시작배열이 된다. final = list(map(str, input().strip())) start = sorted(final) # left는 ‘??’ 나오기 전까지의 사다리 모양을 넣어둔다. # right는 ‘??’ 나온 이후의 사다리 모양을 넣어둔다. left = 0 right = [] for _ in range(m): ladder = list(map(str,input().strip())) # ‘??’이 나오면 현재까지의 right를 left에 넣고 right는 초기화 # 분리하기 위한 방법이다. if ladder == [‘?’ for _ in range(n-1)]: left = right right = [] continue right.append(ladder) # 처음상태(ABCDE~~)에서 ‘??’직전 배열을 알기 위한 코드이다. # 앞에서 부터 하나씩 빼서 ‘-‘이면 양 알파뱃의 위치를 바꾸어준다. while left: ladder = left.pop(0) for i in range(n-1): if ladder[i] == ‘-‘: start[i], start[i+1] = start[i+1], start[i] # 마지막상태에서 같은 방식으로 역순으로 해준다. while right: ladder = right.pop() for j in range(n-1): if ladder[j] == ‘-‘: final[j], final[j+1] = final[j+1], final[j] # ‘??’인 부분의 초기상태를 *로 해준 후 # 자리를 바꾸어 같은 값이면 ‘*’을 ‘-‘로 바꾸어준다. ans = [‘*’ for _ in range(n-1)] for k in range(n-1): if start[k] == final[k+1] and start[k+1] == final[k]: ans[k] = ‘-‘ start[k], start[k+1] = start[k+1], start[k] # 바꾼 start와 final이 같으면 성공! # 아니면 x를 출력한다. if start != final: ans = [‘x’ for _ in range(n-1)] print(”.join(ans))

긴 문제지만 재미있는 문제였다.

키워드에 대한 정보 사다리 타기 코딩

다음은 Bing에서 사다리 타기 코딩 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 [스크래치3.0 예제 강의] 사다리타기 1편 – 사다리 그리기 주의사항 – 스크래치 코딩 예제 기초 강좌

  • 스크래치 애니메이션
  • 스크래치 기초
  • 스크래치 기초 강의
  • 스크래치 기초 강좌
  • 스크래치 강좌
  • 스크래치 3.0
  • 스크래치3.0 강좌
  • 스크래치 3.0 기초
  • 스크래치 2019
  • 스크래치 코딩
  • 스크래치 예제
  • 스크래치 코딩 교육
  • 초등 코딩
  • 중등 코딩
  • 초등 코딩 교육
  • 블록코딩
  • 스크래치 예시
  • 스크래치 게임
  • 스크래치 게임 만들기
  • 블록코딩 게임
  • 사다리타기
  • 사다리타기 만들기
  • 스크래치 사다리타기
[스크래치3.0 #예제 #강의] #사다리타기 #1편 #- #사다리 #그리기 #주의사항 #- #스크래치 #코딩 #예제 #기초 #강좌


YouTube에서 사다리 타기 코딩 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 [스크래치3.0 예제 강의] 사다리타기 1편 – 사다리 그리기 주의사항 – 스크래치 코딩 예제 기초 강좌 | 사다리 타기 코딩, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

See also  백 하수오 효능 | 백하수오 / 백수오 효능과 부작용 잘 알고 드셔야해요~ 209 개의 자세한 답변

Leave a Reply

Your email address will not be published. Required fields are marked *