๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

[์ฝ”๋”ฉํ…Œ์ŠคํŠธ] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์‹ ๊ณ  ๊ฒฐ๊ณผ ๋ฐ›๊ธฐ ํ’€์ด (JavaScript)

by ๋‰ด์ชผ๋ฏธ 2026. 3. 16.

https://school.programmers.co.kr/learn/courses/30/lessons/92334?utm_source=chatgpt.com

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

SW๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ํ‰๊ฐ€, ๊ต์œก์˜ Total Solution์„ ์ œ๊ณตํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์„ฑ์žฅ์„ ์œ„ํ•œ ๋ฒ ์ด์Šค์บ ํ”„

programmers.co.kr

 

1. ๋ฌธ์ œ ํ’€์ด 

1-1 ๋ฌธ์ œ ์„ค๋ช…

์ด๋ฌธ์ œ๋Š” ์œ ์ €๋“ค์ด ์„œ๋กœ๋ฅผ ์‹ ๊ณ ํ•œ ๊ธฐ๋ก์ด ์ฃผ์–ด์กŒ์„ ๋•Œ,

  • ํ•œ ์œ ์ €๊ฐ€ ๊ฐ™์€ ์œ ์ €๋ฅผ ์—ฌ๋Ÿฌ๋ฒˆ ์‹ ๊ณ ํ•ด๋„ 1๋ฒˆ๋งŒ ์ธ์ •
  • k๋ฒˆ ์ด์ƒ ์‹ ๊ณ ๋‹นํ•œ ์œ ์ €๋Š” ์ •์ง€ 
  • ์ •์ง€๋œ ์œ ์ €๋ฅผ ์‹ ๊ณ ํ•œ ์‚ฌ๋žŒ์—๊ฒŒ๋งŒ ๋ฉ”์ผ ๋ฐœ์†ก

๊ฐ ์œ ์ €๊ฐ€ ์ตœ์ข…์ ์œผ๋กœ ๋ช‡ ๊ฐœ์˜ ๋ฉ”์ผ์„ ๋ฐ›๋Š”์ง€ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

 

1-2 ๋ฌธ์ œ ์ ‘๊ทผ๋ฐฉ์‹

1. ์ค‘๋ณต ์‹ ๊ณ  ์ œ๊ฑฐ 

    ๊ฐ™์€ ์‚ฌ๋žŒ์ด ๊ฐ™์€ ์‚ฌ๋žŒ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์‹ ๊ณ ํ•ด๋„ 1๋ฒˆ๋งŒ ์ธ์ •๋˜๋ฏ€๋กœ
    ๋จผ์ € report ๋ฐฐ์—ด์˜ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

2. ๋ˆ„๊ฐ€ ๋ช‡๋ฒˆ ์‹ ๊ณ ๋‹นํ–ˆ๋Š”์ง€ ๊ณ„์‚ฐ

    ์ค‘๋ณต ์ œ๊ฑฐ๋œ ์‹ ๊ณ  ๋ชฉ๋ก์„ ๋Œ๋ฉด์„œ

  • ์‹ ๊ณ ํ•œ ์‚ฌ๋žŒ์€ ๋ˆ„๊ตฌ์ธ์ง€
  • ์‹ ๊ณ ๋‹นํ•œ ์‚ฌ๋žŒ์€ ๋ˆ„๊ตฌ์ธ์ง€

  ๋ถ„๋ฆฌํ•ด์„œ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  ์ด๋•Œ ์šฐ๋ฆฌ๋Š” ๋‘ ๊ฐ€์ง€ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ๊ฐ ์œ ์ €๊ฐ€ ๋ˆ„๊ตฌ๋ฅผ ์‹ ๊ณ ํ–ˆ๋Š”์ง€
  • ๊ฐ ์œ ์ €๊ฐ€ ๋ช‡ ๋ฒˆ ์‹ ๊ณ ๋‹นํ–ˆ๋Š”์ง€

4. ์‹ ๊ณ ๋‹นํ•œ ํšŸ์ˆ˜๊ฐ€ k ์ด์ƒ์ธ ์œ ์ €๋งŒ ์ •์ง€๋ฉ๋‹ˆ๋‹ค.

  ๊ทธ ํ›„ ๊ฐ ์œ ์ €๊ฐ€ ์‹ ๊ณ ํ•œ ์‚ฌ๋žŒ๋“ค ์ค‘
  ์‹ค์ œ๋กœ ์ •์ง€๋œ ์‚ฌ๋žŒ์ด ๋ช‡ ๋ช…์ธ์ง€ ์„ธ๋ฉด,
  ๊ทธ ์ˆ˜๊ฐ€ ๊ณง ํ•ด๋‹น ์œ ์ €๊ฐ€ ๋ฐ›๋Š” ๋ฉ”์ผ ์ˆ˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

 

1-3. ํ’€์ด ์•„์ด๋””์–ด ์ •๋ฆฌ

์ „์ฒด ํ๋ฆ„์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. id_list๋กœ ์œ ์ € ์ •๋ณด๋ฅผ ์ €์žฅํ•  ๊ฐ์ฒด ์ƒ์„ฑ
  2. report ๋ฐฐ์—ด์„ Set์œผ๋กœ ์ค‘๋ณต ์ œ๊ฑฐ
  3. ์‹ ๊ณ  ๊ธฐ๋ก์„ ์ˆœํšŒํ•˜๋ฉฐ
    • ์‹ ๊ณ ํ•œ ์‚ฌ๋žŒ์˜ ์‹ ๊ณ  ๋ชฉ๋ก์— ์ถ”๊ฐ€
    • ์‹ ๊ณ ๋‹นํ•œ ์‚ฌ๋žŒ์˜ ์‹ ๊ณ  ํšŸ์ˆ˜ ์ฆ๊ฐ€
  4. ์‹ ๊ณ  ํšŸ์ˆ˜๊ฐ€ k ์ด์ƒ์ธ ์‚ฌ๋žŒ์„ ์ •์ง€ ๋ชฉ๋ก์— ์ €์žฅ
  5. ๊ฐ ์œ ์ €๊ฐ€ ์‹ ๊ณ ํ•œ ์‚ฌ๋žŒ๋“ค ์ค‘ ์ •์ง€๋œ ์‚ฌ๋žŒ์ด ๋ช‡ ๋ช…์ธ์ง€ ์„ธ์„œ ๋ฐฐ์—ด ๋ฐ˜ํ™˜

2. ์ •๋‹ต ์ฝ”๋“œ

function solution(id_list, report, k) {
	// ์œ ์ €๋ณ„ ์‹ ๊ณ ๋‹นํ•œ ํšŸ์ˆ˜, ์‹ ๊ณ ํ•œ ๋Œ€์ƒ ๋ฆฌ์ŠคํŠธ ๊ฐ์ฒด๋กœ ์ƒ์„ฑ
    const userMap = id_list.reduce((acc, user) => {
        acc[user] = {
            reportedCount: 0,
            reportList: []
        };
        return acc;
    }, {});

	// ์‹ ๊ณ ํ•œ ๋‚ด์—ญ์—์„œ ์ค‘๋ณต ์ œ๊ฑฐ
    const uniqueReport = [...new Set(report)];

	// ์‹ ๊ณ ๋‚ด์—ญ์„ ๊ธฐ์ค€์œผ๋กœ ์‹ ๊ณ ๋‹นํ•œ ์‚ฌ๋žŒ์€ ์นด์šดํŠธ ๋ˆ„์ , ์‹ ๊ณ ํ•œ ์‚ฌ๋žŒ์€ ๋ˆ„๊ตฌ๋ฅผ ์‹ ๊ณ ํ–ˆ๋Š”์ง€ ๊ธฐ๋ก
    for (const item of uniqueReport) {
        const [from, to] = item.split(" ");
        userMap[from].reportList.push(to);
        userMap[to].reportedCount++;
    }

    const banned = new Set();

	// k๋ฒˆ์ด์ƒ ์‹ ๊ณ ๋˜์„œ ์ •์ง€๋œ ์‚ฌ๋žŒ๋“ค ๋ฆฌ์ŠคํŠธ
    for (const user of id_list) {
        if (userMap[user].reportedCount >= k) {
            banned.add(user);
        }
    }

    // ๊ฐœ๋ณ„์œ ์ €๋“ค์˜ ์‹ ๊ณ  ๋ฆฌ์ŠคํŠธ์— ์ •์ง€๋œ ์‚ฌ๋žŒ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์—ฌ ๋ฉ”์ผ ๋ฐœ์†ก ์นด์šดํŠธ ์ธก์ €
    const answer = id_list.map((user) => {
        let count = 0;
        for (const target of userMap[user].reportList) {
            if (banned.has(target)) count++;
        }
        return count;
    });

    return answer;
}

 


3. ์•Œ์•„์•ผ ํ•  ๋ฉ”์„œ๋“œ / ๋ฌธ๋ฒ•

reduce()

const userMap = id_list.reduce((acc, user) => {
    acc[user] = {
        reportedCount: 0,
        reportList: []
    };
    return acc;
}, {});
 
 

๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉด์„œ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ˆ„์ ํ•ด์„œ ๋งŒ๋“œ๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์—์„œ๋Š” id_list๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ
์œ ์ € ์ •๋ณด๋ฅผ ์ €์žฅํ•  ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

 

Set

const uniqueReport = [...new Set(report)];

Set์€ ์ค‘๋ณต ์—†๋Š” ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์—์„œ๋Š”

  • ์‹ ๊ณ  ๊ธฐ๋ก ์ค‘๋ณต ์ œ๊ฑฐ
  • ์ •์ง€๋œ ์œ ์ € ๋ชฉ๋ก ์ €์žฅ

๋‘ ๊ณณ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

split()

const [from, to] = item.split(" "); // "muzi frodo".split(" "); -> ["muzi", "frodo"]

๋ฌธ์ž์—ด์„ ํŠน์ • ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.

 

map()

const answer = id_list.map((user) => {
    ...
});

 

๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ๋ฅผ ๋ณ€ํ™˜ํ•ด์„œ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋งŒ๋“œ๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์—์„œ๋Š” ๊ฐ ์œ ์ €๊ฐ€ ๋ฐ›์„ ๋ฉ”์ผ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ด์„œ
์ตœ์ข… ๊ฒฐ๊ณผ ๋ฐฐ์—ด์„ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

 

 

for...of

for (const item of uniqueReport) {

๋ฐฐ์—ด์ด๋‚˜ ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด์˜ ๊ฐ’์„ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด๋Š” ๋ฐ˜๋ณต๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์—์„œ๋Š” ์‹ ๊ณ  ๋ชฉ๋ก์ด๋‚˜ ์‹ ๊ณ  ๋Œ€์ƒ ๋ชฉ๋ก์„ ์ˆœํšŒํ•  ๋•Œ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

 

 

has()

banned.has(target)

Set ์•ˆ์— ํŠน์ • ๊ฐ’์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.

  • ์žˆ์œผ๋ฉด true
  • ์—†์œผ๋ฉด false

์ฆ‰, ์‹ ๊ณ ํ•œ ์‚ฌ๋žŒ์ด ์‹ค์ œ ์ •์ง€๋œ ์‚ฌ๋žŒ์ธ์ง€ ํ™•์ธํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.