<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>팀 나누기 on 계획대로 느긋하게</title><link>https://planfully.ai.kr/tags/%ED%8C%80-%EB%82%98%EB%88%84%EA%B8%B0/</link><description>Recent content in 팀 나누기 on 계획대로 느긋하게</description><generator>Hugo -- gohugo.io</generator><language>ko-kr</language><lastBuildDate>Wed, 22 Jul 2026 00:00:00 +0900</lastBuildDate><atom:link href="https://planfully.ai.kr/tags/%ED%8C%80-%EB%82%98%EB%88%84%EA%B8%B0/index.xml" rel="self" type="application/rss+xml"/><item><title>랜덤 뽑기·사다리타기 — 제비뽑기·순서·팀 나누기</title><link>https://planfully.ai.kr/tools/random-picker/</link><pubDate>Wed, 22 Jul 2026 00:00:00 +0900</pubDate><guid>https://planfully.ai.kr/tools/random-picker/</guid><description>&lt;p&gt;이름을 넣고 &lt;strong&gt;두근두근 뽑기 · 순서 섞기 · 팀 나누기 · 사다리타기&lt;/strong&gt;로 정해요. 사다리는 직접 선을 그어 만들 수 있어요.&lt;/p&gt;
&lt;div class="pf-tool" style="max-width:520px;margin:0 auto;"&gt;
 &lt;label style="display:block;"&gt;&lt;span style="display:block;font-weight:700;margin-bottom:6px;"&gt;참가자 (줄바꿈 또는 쉼표로 구분)&lt;/span&gt;
 &lt;textarea id="rp-names" rows="4" placeholder="철수&amp;#10;영희&amp;#10;민수&amp;#10;지영" style="width:100%;padding:12px;border:2px solid #ccc;border-radius:10px;font-size:15px;box-sizing:border-box;resize:vertical;"&gt;철수
영희
민수
지영&lt;/textarea&gt;&lt;/label&gt;
 &lt;div style="display:flex;gap:8px;flex-wrap:wrap;margin-top:12px;"&gt;
 &lt;button class="rp-btn" data-m="pick" style="flex:1 1 45%;padding:12px;border:0;border-radius:10px;background:#059669;color:#fff;font-weight:700;cursor:pointer;"&gt;🎯 두근두근 뽑기&lt;/button&gt;
 &lt;button class="rp-btn" data-m="order" style="flex:1 1 45%;padding:12px;border:0;border-radius:10px;background:#2563eb;color:#fff;font-weight:700;cursor:pointer;"&gt;🔀 순서 섞기&lt;/button&gt;
 &lt;/div&gt;
 &lt;div style="display:flex;gap:8px;flex-wrap:wrap;margin-top:8px;align-items:center;"&gt;
 &lt;button class="rp-btn" data-m="team" style="flex:1 1 45%;padding:12px;border:0;border-radius:10px;background:#7c3aed;color:#fff;font-weight:700;cursor:pointer;"&gt;👥 팀 나누기&lt;/button&gt;
 &lt;input type="tel" id="rp-teams" inputmode="numeric" value="2" style="width:56px;padding:10px;border:2px solid #ccc;border-radius:8px;text-align:center;"&gt;
 &lt;span style="font-size:13px;color:#555;"&gt;개 팀&lt;/span&gt;
 &lt;/div&gt;
 &lt;div id="rp-slot" style="display:none;margin-top:14px;text-align:center;padding:26px 10px;border-radius:14px;background:#0f172a;color:#fff;font-size:32px;font-weight:800;letter-spacing:1px;min-height:44px;"&gt;&lt;/div&gt;
 &lt;div style="margin-top:14px;padding-top:12px;border-top:1px dashed #ddd;"&gt;
 &lt;div style="font-size:13px;color:#555;font-weight:700;margin-bottom:4px;"&gt;🪜 사다리타기 (결과를 참가자에 랜덤 배정)&lt;/div&gt;
 &lt;textarea id="rp-results" rows="3" placeholder="결과 목록 (참가자 수와 같게)&amp;#10;청소&amp;#10;설거지&amp;#10;커피&amp;#10;당첨" style="width:100%;padding:10px;border:2px solid #ccc;border-radius:8px;font-size:14px;box-sizing:border-box;resize:vertical;"&gt;청소
설거지
커피
꽝&lt;/textarea&gt;
 &lt;div style="display:flex;gap:8px;margin-top:6px;"&gt;
 &lt;button id="rp-ladder-make" style="flex:1;padding:12px;border:0;border-radius:10px;background:#d97706;color:#fff;font-weight:700;cursor:pointer;"&gt;🪜 사다리 만들기&lt;/button&gt;
 &lt;button id="rp-ladder-run" style="flex:1;padding:12px;border:0;border-radius:10px;background:#dc2626;color:#fff;font-weight:700;cursor:pointer;"&gt;▶️ 돌리기&lt;/button&gt;
 &lt;/div&gt;
 &lt;div id="rp-ladder-hint" style="display:none;font-size:12.5px;color:#d97706;margin-top:6px;"&gt;👆 가로줄 자리를 &lt;b&gt;탭/클릭&lt;/b&gt;해서 직접 사다리를 추가하세요. 다 그렸으면 ▶️ 돌리기!&lt;/div&gt;
 &lt;canvas id="rp-canvas" style="display:none;width:100%;margin-top:10px;background:#fffdf7;border-radius:10px;border:1px solid #f0e6d2;touch-action:manipulation;"&gt;&lt;/canvas&gt;
 &lt;div id="rp-ladder-out" style="display:none;margin-top:8px;"&gt;&lt;/div&gt;
 &lt;/div&gt;
 &lt;div id="rp-out" style="display:none;margin-top:14px;padding:16px;border-radius:12px;background:#f8fafc;border:1px solid #e2e8f0;"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;script&gt;
(function(){
var $=function(id){return document.getElementById(id);};
function parse(t){return (t.value||'').split(/[\n,]/).map(function(s){return s.trim();}).filter(Boolean);}
function shuffle(a){a=a.slice();for(var i=a.length-1;i&gt;0;i--){var j=Math.floor(Math.random()*(i+1));var t=a[i];a[i]=a[j];a[j]=t;}return a;}
function esc(s){return s.replace(/[&amp;&lt;&gt;]/g,function(c){return{'&amp;':'&amp;amp;','&lt;':'&amp;lt;','&gt;':'&amp;gt;'}[c];});}
var COLORS=['#ef4444','#f59e0b','#10b981','#3b82f6','#8b5cf6','#ec4899','#14b8a6','#f97316','#6366f1','#84cc16'];
var out=$('rp-out'), slot=$('rp-slot');
function show(html){out.innerHTML=html;out.style.display='block';}
function spinPick(names){
 slot.style.display='block'; out.style.display='none';
 slot.style.color='#fff';
 var start=Date.now(), DUR=4200;
 function tick(){
 var el=Date.now()-start, prog=el/DUR;
 slot.textContent=names[Math.floor(Math.random()*names.length)];
 if(prog&lt;1){
 var delay=40+Math.pow(prog,3.2)*520;
 setTimeout(tick, delay);
 } else {
 var w=names[Math.floor(Math.random()*names.length)];
 setTimeout(function(){
 slot.innerHTML='🎉 &lt;span style="color:#fbbf24;"&gt;'+esc(w)+'&lt;/span&gt; 🎉';
 slot.animate([{transform:'scale(1.35)'},{transform:'scale(0.95)'},{transform:'scale(1)'}],{duration:520});
 }, 260);
 }
 }
 tick();
}
[].forEach.call(document.querySelectorAll('.rp-btn'),function(b){
 b.onclick=function(){
 var names=parse($('rp-names'));
 if(names.length&lt;1){alert('참가자를 입력해 주세요');return;}
 var m=b.getAttribute('data-m');
 if(m==='pick'){ spinPick(names); return; }
 slot.style.display='none';
 if(m==='order'){
 var s=shuffle(names);
 show('&lt;div style="font-weight:700;margin-bottom:6px;"&gt;🔀 순서&lt;/div&gt;'+s.map(function(n,i){return '&lt;div style="padding:5px 0;border-bottom:1px solid #eee;"&gt;&lt;b&gt;'+(i+1)+'.&lt;/b&gt; '+esc(n)+'&lt;/div&gt;';}).join(''));
 } else if(m==='team'){
 var k=Math.max(parseInt($('rp-teams').value)||2,2);
 var s=shuffle(names), teams=[];for(var i=0;i&lt;k;i++)teams.push([]);
 s.forEach(function(n,i){teams[i%k].push(n);});
 show('&lt;div style="font-weight:700;margin-bottom:6px;"&gt;👥 '+k+'개 팀&lt;/div&gt;'+teams.map(function(t,i){return '&lt;div style="margin-bottom:8px;"&gt;&lt;b style="color:#7c3aed;"&gt;'+(i+1)+'팀&lt;/b&gt; : '+t.map(esc).join(', ')+'&lt;/div&gt;';}).join(''));
 }
 };
});
var cv=$('rp-canvas'), ctx=cv.getContext('2d');
var L=null;
function X(c){return L.MX+c*L.gapX;}
function Yr(r){return L.topY+(r+1)*L.rowH;}
function drawBase(){
 ctx.clearRect(0,0,L.cssW,L.cssH);
 ctx.strokeStyle='#d6cbb0'; ctx.lineWidth=3; ctx.lineCap='round';
 for(var c=0;c&lt;L.n;c++){ctx.beginPath();ctx.moveTo(X(c),L.topY);ctx.lineTo(X(c),L.botY);ctx.stroke();}
 for(var r=0;r&lt;L.rows;r++){for(var c=0;c&lt;L.n-1;c++){if(L.rung[r][c]){ctx.strokeStyle='#c2410c';ctx.beginPath();ctx.moveTo(X(c),Yr(r));ctx.lineTo(X(c+1),Yr(r));ctx.stroke();ctx.strokeStyle='#d6cbb0';}}}
 ctx.font='bold 13px sans-serif'; ctx.textAlign='center';
 for(var c2=0;c2&lt;L.n;c2++){ctx.fillStyle='#111';ctx.fillText(L.names[c2].slice(0,5),X(c2),L.topY-12);ctx.fillStyle='#999';ctx.fillText(L.revealed?L.results[L.endOf[c2]].slice(0,6):'?',X(c2),L.botY+22);}
}
function buildLadder(random){
 var names=parse($('rp-names')), results=parse($('rp-results'));
 if(names.length&lt;2){alert('참가자를 2명 이상 입력해 주세요');return null;}
 if(results.length!==names.length){alert('결과 개수('+results.length+')를 참가자 수('+names.length+')와 같게 맞춰 주세요');return null;}
 var n=names.length, DPR=window.devicePixelRatio||1;
 var cssW=Math.min(cv.parentElement.clientWidth,480);
 var rows=Math.max(n*4,18); // 더 긴 사다리
 var cssH=54+rows*26+54;
 cv.style.height=cssH+'px'; cv.width=cssW*DPR; cv.height=cssH*DPR; ctx.setTransform(DPR,0,0,DPR,0,0);
 cv.style.display='block';
 var MX=cssW*0.5/n+10, topY=54, botY=cssH-54, gapX=(cssW-2*MX)/(n-1), rowH=(botY-topY)/(rows+1);
 var rung=[];for(var r=0;r&lt;rows;r++){var row=[];for(var c=0;c&lt;n-1;c++){row.push(random &amp;&amp; Math.random()&lt;0.28 &amp;&amp; !(c&gt;0&amp;&amp;row[c-1]));}rung.push(row);}
 L={names:names,results:results,n:n,rows:rows,cssW:cssW,cssH:cssH,MX:MX,topY:topY,botY:botY,gapX:gapX,rowH:rowH,rung:rung,revealed:false,endOf:names.map(function(_,i){return i;})};
 drawBase();
 return L;
}
$('rp-ladder-make').onclick=function(){
 $('rp-ladder-out').style.display='none';
 if(buildLadder(true)){ $('rp-ladder-hint').style.display='block'; }
};
cv.addEventListener('click',function(e){
 if(!L||L.revealed)return;
 var rect=cv.getBoundingClientRect();
 var x=(e.clientX-rect.left), y=(e.clientY-rect.top);
 // 가장 가까운 row
 var r=Math.round((y-L.topY)/L.rowH)-1; if(r&lt;0||r&gt;=L.rows)return;
 // 가장 가까운 칸(col과 col+1 사이)
 var c=Math.floor((x-L.MX)/L.gapX); if(c&lt;0||c&gt;=L.n-1)return;
 // 인접 겹침 방지
 if(!L.rung[r][c]){ if((c&gt;0&amp;&amp;L.rung[r][c-1])||(c&lt;L.n-2&amp;&amp;L.rung[r][c+1]))return; }
 L.rung[r][c]=!L.rung[r][c];
 drawBase();
});
$('rp-ladder-run').onclick=function(){
 if(!L){ if(!buildLadder(true))return; }
 $('rp-ladder-hint').style.display='none';
 function path(start){
 var c=start, pts=[{x:X(c),y:L.topY}];
 for(var r=0;r&lt;L.rows;r++){var y=Yr(r);pts.push({x:X(c),y:y});
 if(c&lt;L.n-1&amp;&amp;L.rung[r][c]){c++;pts.push({x:X(c),y:y});}
 else if(c&gt;0&amp;&amp;L.rung[r][c-1]){c--;pts.push({x:X(c),y:y});}}
 pts.push({x:X(c),y:L.botY});return {pts:pts,end:c};
 }
 var paths=[];for(var i=0;i&lt;L.n;i++)paths.push(path(i));
 L.endOf=paths.map(function(p){return p.end;});
 var t0=null, DUR=Math.max(2600,L.rows*160);
 function seg(pts,prog){
 var total=0,seglen=[];for(var i=1;i&lt;pts.length;i++){var dx=pts[i].x-pts[i-1].x,dy=pts[i].y-pts[i-1].y;var l=Math.sqrt(dx*dx+dy*dy);seglen.push(l);total+=l;}
 var target=total*prog,acc=0,cur=pts[0],drawn=[pts[0]];
 for(var i=1;i&lt;pts.length;i++){if(acc+seglen[i-1]&gt;=target){var f=(target-acc)/seglen[i-1];cur={x:pts[i-1].x+(pts[i].x-pts[i-1].x)*f,y:pts[i-1].y+(pts[i].y-pts[i-1].y)*f};drawn.push(cur);break;}acc+=seglen[i-1];drawn.push(pts[i]);}
 return {cur:cur,drawn:drawn};
 }
 function frame(ts){
 if(!t0)t0=ts;var prog=Math.min((ts-t0)/DUR,1);
 L.revealed=false; drawBase();
 ctx.lineWidth=4;ctx.lineCap='round';
 for(var i=0;i&lt;L.n;i++){var col=COLORS[i%COLORS.length];var s=seg(paths[i].pts,prog);ctx.strokeStyle=col;ctx.beginPath();for(var k=0;k&lt;s.drawn.length;k++){var p=s.drawn[k];if(k===0)ctx.moveTo(p.x,p.y);else ctx.lineTo(p.x,p.y);}ctx.stroke();ctx.fillStyle=col;ctx.beginPath();ctx.arc(s.cur.x,s.cur.y,6,0,7);ctx.fill();}
 if(prog&lt;1){requestAnimationFrame(frame);}
 else{
 L.revealed=true; drawBase();
 ctx.font='bold 13px sans-serif';ctx.textAlign='center';
 for(var i=0;i&lt;L.n;i++){ctx.fillStyle=COLORS[i%COLORS.length];ctx.fillText(L.results[paths[i].end].slice(0,6),X(paths[i].end),L.botY+22);}
 var html='&lt;div style="font-weight:700;margin-bottom:4px;"&gt;🪜 결과&lt;/div&gt;'+L.names.map(function(nm,i){return '&lt;div style="display:flex;justify-content:space-between;padding:5px 0;border-bottom:1px solid #eee;"&gt;&lt;span style="color:'+COLORS[i%COLORS.length]+';font-weight:700;"&gt;'+esc(nm)+'&lt;/span&gt;&lt;b&gt;'+esc(L.results[paths[i].end])+'&lt;/b&gt;&lt;/div&gt;';}).join('');
 $('rp-ladder-out').innerHTML=html;$('rp-ladder-out').style.display='block';
 }
 }
 requestAnimationFrame(frame);
};
})();
&lt;/script&gt;
&lt;h2 id="이럴-때-써요"&gt;이럴 때 써요
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;두근두근 뽑기&lt;/strong&gt;: 이름이 슬롯머신처럼 빠르게 돌다가 &lt;strong&gt;점점 느려지며&lt;/strong&gt; 멈춰요. 당첨자 발표에 긴장감이 확 살아요.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;순서 섞기 · 팀 나누기&lt;/strong&gt;: 발표 순서, 조 편성을 공정하게 랜덤으로.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;사다리타기&lt;/strong&gt;: 「사다리 만들기」로 기본 사다리를 만든 뒤, &lt;strong&gt;가로줄 자리를 직접 탭/클릭해 사다리를 추가&lt;/strong&gt;할 수 있어요. 다 그렸으면 「▶️ 돌리기」로 색깔 선이 내려가며 결과를 찾아가요. 사다리가 길어서 더 두근두근해요.&lt;/li&gt;
&lt;li&gt;결과는 매번 새로 섞여요. 공정한 랜덤이라 내기·회식·조 편성에 딱이에요.&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>